The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

Релиз набора компиляторов GCC 7

02.05.2017 21:09

После года разработки состоялся релиз свободного набора компиляторов GCC 7.1, первый значительный выпуск в новой ветке GCC 7.x. Релиз приурочен к 30-летию с момента формирования первого выпуска GCC 1.0. В соответствии с новой схемой нумерации выпусков, версия 7.0 использовалась в процессе разработки, а незадолго до выхода GCC 7.1 уже ответвилась ветка GCC 8.0, на базе которой будет сформирован следующий значительный релиз GCC 8.1.

GCC 7.1 примечателен удалением из состава компилятора для языка Java, реализацией экспериментальной поддержки грядущего стандарта C++17, расширением средств диагностики, реализацией новых оптимизаций, поддержкой OpenMP 4.5 для GPGPU NVidia PTX, поддержкой набора инструкций RISC-V, поддержкой операционной системы Fuchsia, новыми режимами для выявления некорректной работы с памятью.

Основные изменения:

  • Во фронтенде для языка С++ реализована экспериментальная поддержка всех возможностей черновика стандарта C++17. Для включения следует использовать опции "-std=c++1z" и "-std=gnu++1z". В библиотеку libstdc++ также добавлены почти все возможности, представленные в C++17;
  • Расширены средства диагностики ошибок, добавлены новые предупреждения, улучшено отслеживание местоположения переменных и вхождения в диапазон допустимых значений. Добавлены новые диагностические опции: "-Wimplicit-fallthrough", "-Wpointer-compare", "-Wduplicated-branches", "-Wrestrict", "-Wmemset-elt-size", "-Wmemset-elt-size", "-Wint-in-bool-context", "-Wswitch-unreachable", "-Wexpansion-to-defined", "-Wregister", "-Wvla-larger-than=N", "-Wduplicate-decl-specifier";
  • Существенно расширена система рекомендации по устранению проблем (например, GCC предупредит о "%s" в printf, если значение "i + j") и предложений по замене опечаток в идентификаторах (gtk_widget_showall => gtk_widget_show_all), типах (singed => signed), макросах (array[MAX_ITEM] => array[MAX_ITEMS]), директивах препроцессора endfi => endif) и даже опциях командной строки ("-ftls-model=global-dinamic" => global-dynamic)
  • Добавлена опция "-fdiagnostics-generate-patch" позволяющая сформировать заготовку патча на основе выявленных компилятором диагностических рекомендаций. Также добавлена опция "-fdiagnostics-parseable-fixits" для автоматизации передачи диагностики в интегрированные среды разработки;
    
        --- spellcheck-fields.cc
        +++ spellcheck-fields.cc
        @@ -49,5 +49,5 @@
    
         color get_color(struct s *ptr)
         {
        -  return ptr->colour;
        +  return ptr->color;
         }
    
        fix-it:"spellcheck-fields.cc":{52:13-52:19}:"color"
    
    
  • Представлена большая порция новых режимов для выявления переполнений буфера и различных форм некорректной работы с памятью.
    • Добавлена опция "-Walloc-size-larger-than=size", выводящая предупреждение при попытках выделения блоков памяти, превышающих заданный лимит (полезно для отлавливания обращений к malloc с отрицательными значениями аргументов).
    • Опция "-Wnonnull" нацелена на выявление передачи нулевых указателей в функциях, ожидающих поступления не-null аргументов.
    • Опция "-Wstringop-overflow=type" выявляет типовые переполнения при использовании функций, подобных memcpy и strcpy.
    • Опция "-Wformat-overflow=level" даёт возможность выявить выходы за границу буфера при использовании функций форматирования строки, таких как sprintf;
      
         void* f (int mday)
         {
           char *buf = malloc (3);
           sprintf (buf, "%02i", mday % 100);
           return buf;
         }
      
         warning: 'sprintf may write a terminating nul past the end of the  destination [-Wformat-overflow=]
         note: 'sprintf' output between 3 and 4 bytes into a destination of size 3
      
  • Многочисленные улучшения в области оптимизации: добавлены новые оптимизации во время динамического связывания, межпроцедурные и внутрепроцедурные оптимизации. Реализованы дополнительные стадии слияния областей хранения констант ("-fstore-merging"), выноса операций за пределы циклов и разбиения циклов на части (например, когда для одной части итераций условие всегда принимает значение true, а для другой - false). Обеспечена возможность определения возвращаемого значения или диапазона возвращаемых значений для некоторых вызовов sprintf и использования данной информации на других стадиях оптимизации (например, вызов snprintf с аргументом нулевой длины может быть преобразован в константу);
  • В Address Sanitizer добавлен режим "-fsanitize-address-use-after-scope" для проверки переменных, адрес которых сохранятся и затем используется вне области видимости этой переменной;
    
    
       int
       main (int argc, char **argv)
       {
         char *ptr;
           {
             char my_char;
             ptr = &my_char;
          }
      
         *ptr = 123;
         return *ptr;
       }
    
       ==28882==ERROR: AddressSanitizer: stack-use-after-scope on address 
    
  • Добавлена возможность использования OpenMP 4.5 для ускорения вычислений за счёт выноса операций (offloading) на специализированные процессоры NVIDIA PTX;
  • При использовании опции "-fverbose-asm" в комментариях к ассемблерному коду теперь приводятся ссылки на строки в файле и куски Си-кода из которых были сгенерированы данные ассемблерные выражения;
    
       # example.c:7:     total += i * i;
           movl    %edx, %ecx      # i, tmp92
           imull   %edx, %ecx      # i, tmp92
    
  • Поддержка развиваемого компанией Google языка программирования Go обновлена до версии 1.8.1;
  • Для новых целевых платформ (PowerPC, SPARC ) задействован по умолчанию новый механизм распределения регистров LRA (Local Register Allocator), реализующий метод рематериализации, при котором вместо сохранения значения регистра при необходимости используется его повторное вычисление;
  • Добавлена поддержка обработки файлов в бинарном формате BRIG 1.0, предназначенном для использования с языком HSAIL (Heterogeneous System Architecture Intermediate Language). В состав включена runtime-библиотека libhsail-rt для HSAIL. GCC-фронтенд для BRIG может использоваться для реализации финализаторов HSAIL (вариант HSAIL, скомпилированный для заданных процессоров);
  • В генератор кода в виде разделяемой библиотеки libgccjit (для встраивания в другие процессы и использования для организации JIT-компиляции байткода в машинный код) добавлена возможность передачи через API диагностической информации о выявленных проблемах в коде;
  • Добавлена поддержка AArch64-архитектур ARMv8.2-A и ARMv8.3-A (-march=armv8.3-a), а также процессоров ARM Cortex-A73 (cortex-a73), Broadcom Vulcan (vulcan), Cavium ThunderX CN81xx (thunderxt81), Cavium ThunderX CN83xx (thunderxt83), Cavium ThunderX CN88xx (thunderxt88), Cavium ThunderX CN88xx (thunderxt88p1), Cavium ThunderX 2 CN99xx (thunderx2t99) и Qualcomm Falkor (falkor);
  • Добавлена поддержка новых процессоров ARM: ARM Cortex-A73 (cortex-a73), ARM Cortex-M23 (cortex-m23) и ARM Cortex-M33 (cortex-m33). Добавлена поддержка архитектуры ARMv8-M в двух профилях ARMv8-M Baseline и ARMv8-M Mainline (с DSP и расширениями с для вычислений с плавающей запятой). Переведены в разряд устаревших архитектуры ARMv5 и ARMv5E (поддержка ARMv5T, ARMv5TE и ARMv5TEJ сохранена).
  • Для архитектуры x86-64 добавлена поддержка расширений AVX-512: 4FMAPS (Fused Multiply Accumulation Packed Single precision), 4VNNIW (Vector Neural Network Instructions Word variable precision), VPOPCNTDQ (Vector Population Count) и SGX (Software Guard Extensions);
  • Добавлена поддержка набора инструкций RISC-V;
  • Добавлена поддержка операционной системы Fuchsia, которую развивает компания Google;
  • Добавлена поддержка формата отладочной информации DWARF 5 (опция -gdwarf-5). По умолчанию по-прежнему используется DWARF 4;
  • Из состава GCC удалены все компоненты компилятора GCJ (GNU Compiler For Java). Инициатива по удалению GCJ стартовала ещё в 2013 году и связана с запущенным состоянием GCJ, который много лет не развивается (полностью поддерживается только Java 1.2) и содержит ряд проблем, мешающих применению GCJ на практике. Кроме того, смысл существования GCJ стал неоправдан после сосредоточения разработки открытых компонентов Java в проекте OpenJDK, который также распространяется под лицензией GPL;
  • Режим профилирования libstdc++ объявлен устаревшим и будет удалён в будущих выпусках;
  • Объявлен устаревшим Cilk+, набор расширений для языков Си и Си++ с реализацией предложенной компанией Intel методики параллельного программирования.


  1. Главная ссылка к новости (https://gcc.gnu.org/ml/gcc-ann...)
  2. OpenNews: Релиз набора компиляторов LLVM 4.0
  3. OpenNews: Релиз набора компиляторов GCC 6
  4. OpenNews: GCC на пути удаления компилятора для Java
  5. OpenNews: Для GCC представлен бэкенд c реализацией WebAssembly
  6. OpenNews: Ошибка в GCC привела к игнорированию режима выявления проблем с форматированием строк
Лицензия: CC BY 3.0
Короткая ссылка: https://opennet.ru/46487-gcc
Ключевые слова: gcc, compile
При перепечатке указание ссылки на opennet.ru обязательно


Обсуждение (26) Ajax | 1 уровень | Линейный | +/- | Раскрыть всё | RSS
  • 1.1, iZEN (ok), 21:49, 02/05/2017 [ответить] [﹢﹢﹢] [ · · · ]  
  • –14 +/
    Кто уже пробовал собрать новым GCC 7.1 систему FreeBSD 11-STABLE из сорцов?
     
     
  • 2.13, leap42 (ok), 02:16, 03/05/2017 [^] [^^] [^^^] [ответить]  
  • +10 +/
    ну или вы или netflix. вы, судя по всему, не пробовали, netflix вам здесь не ответит.
     

  • 1.6, Dark Amateur (?), 22:14, 02/05/2017 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    > Объявлен устаревшим Cilk+

    Да ладно! Её Intel так пиарил...

     
     
  • 2.18, хрю (?), 07:19, 03/05/2017 [^] [^^] [^^^] [ответить]  
  • +4 +/
    энтерпрайз он такой - политика партии поменялась и оказалось, что имярек никому не нужен. потому и нельзя опенсорсу завязываться на энтерпрайз технологии.
     
     
  • 3.21, Аноним (-), 22:59, 03/05/2017 [^] [^^] [^^^] [ответить]  
  • –2 +/
    Хотя во многих случаях кговавый ынтерпрайз делает этот ваш опен соурс.
     

  • 1.7, Аноним (-), 22:23, 02/05/2017 [ответить] [﹢﹢﹢] [ · · · ]  
  • –6 +/
    > gtk_widget_showall => gtk_widget_show_all), типах (singed => signed)

    Кто-нибудь уже смотрел? Оно как-то локально хто хранит, или к стороннему серверу обращается? Можно ли это как-то отключить?

     
     
  • 2.10, trolleybus (?), 23:44, 02/05/2017 [^] [^^] [^^^] [ответить]  
  • +/
    Наверняка просто парсит #include файлы + список ключевых слов + функции стандартной библиотеки типа printf, сторонний сервер тут совсем не нужен
     
     
  • 3.12, Аноним (-), 01:59, 03/05/2017 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Имел ввиду, как он определяет "степень похожести", что один идентификатор похож на один из правильных, а другой - нет?
     
     
  • 4.14, Аноним (-), 02:47, 03/05/2017 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Видимо тупо подбирает идентификатор из объявленных с минимальным расстоянием левенштайна между ним и отсутствующим.
     
  • 4.19, Аноним (-), 12:05, 03/05/2017 [^] [^^] [^^^] [ответить]  
  • +/
    Так же, как и spellchecker.
     
  • 4.20, Anonim (??), 12:41, 03/05/2017 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Есть такое понятие: расстояние Хэмминга: https://ru.wikipedia.org/wiki/%D0%A0%D0%B0%D1%81
    Фича с подсказками по опечаткам лет 10-15 есть в aCC у Intel/HP.
     
  • 2.11, Wladmis (ok), 23:53, 02/05/2017 [^] [^^] [^^^] [ответить]  
  • +/
    > Кто-нибудь уже смотрел? Оно как-то локально хто хранит, или к стороннему серверу обращается?

    Оно смотрит в хэдеры и в описания структур, функций и пр..

    > Можно ли это как-то отключить?

    Зачем? (но можно не включать, например, -Wimplicit-function-declaration)

     

  • 1.22, Аноним (-), 23:02, 03/05/2017 [ответить] [﹢﹢﹢] [ · · · ]  
  • –3 +/
    >Поддержка развиваемого компанией Google языка программирования Go обновлена до версии 1.8.1;
    >GCC - GNU C Compiler

    Никогда не понимал зачем они пихают в свой компилятор поддержу Java/Go/etc, которые к тому же имеют свои "родные" вполне хорошие компиляторы. Почему просто не делать хороший C/C++ компилятор?

     
     
  • 2.23, Аноним (-), 01:48, 04/05/2017 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Потому что "родные" компиляторы Java/Go требуют для сборки уже имеющийся бинарный Java/Go. Который, в свою очередь, можно получить лишь скомпилировав исходники Java/Go другим уже имеющимся бинарным компилятором Java/Go. Который... и т.д.

    И после установки бинарного Java/Go, необхдоимого для сборки Java/Go из исходников, у любого нормального человека возникает вопрос, а зачем вообще собирать Java/Go из исходников, если у меня УЖЕ есть рабочий Java/Go?

    Надеюсь, мысль ясна.

     
  • 2.25, Аноним (-), 03:40, 04/05/2017 [^] [^^] [^^^] [ответить]  
  • +/
    Насколько я помню gcc go круче оптимизирует чем оригинальный компилятор.
     
     
  • 3.28, 123 (??), 15:21, 05/05/2017 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Когда как.
     
  • 2.27, Аноним (-), 08:00, 04/05/2017 [^] [^^] [^^^] [ответить]  
  • +2 +/
    У проекта GNU свое определение хорошести - свободность. В частности, когда создавался GCJ, сановская Java была проприентарной, что, собственно, и послужило причиной. Что там с Go не в курсе, но, вроде бы, gccgo - практически эталонная реализация.
     
  • 2.29, КО (?), 22:08, 05/05/2017 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Эм. Как бы не то что родного, а более-менее вменяемого актуального компилятора java в нативный код нет. Все пытались, включая Гугль, но рано или поздно бросали это дело. неблагодарное это дело. Так что как была интерпретатором (jit-компилятором) так и остается.
     
     
  • 3.30, Led (ok), 22:46, 05/05/2017 [^] [^^] [^^^] [ответить]  
  • +/
    > Как бы не то что родного, а более-менее вменяемого актуального компилятора
    > java в нативный код нет.

    Кто ж тебе его напишет? Изень? Или лютo-жабo-быдлo-кoдер?

     
     
  • 4.35, iZEN (ok), 00:33, 09/05/2017 [^] [^^] [^^^] [ответить]  
  • –2 +/
    Дмитрий Чуйко "Ahead-of-Time компиляция для HotSpot JVM": https://www.youtube.com/watch?v=hRepfVJZvhY

    С 33 минуты примерно.

     

  • 1.24, Аноним (-), 02:01, 04/05/2017 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    Что за поддержка языка Go в GCC? Не понял, что теперь во всех дистрибутивах с GCC будет из коропки Golang?
     
     
  • 2.26, Вареник (?), 06:36, 04/05/2017 [^] [^^] [^^^] [ответить]  
  • +/
    Скорей всего идет отдельным пакетом. GCJ/fortran/ObjC всегда отдельными пакетами паковали в дистрах.
     
  • 2.32, фыв (??), 13:39, 06/05/2017 [^] [^^] [^^^] [ответить]  
  • +/
    Даже в Slackware он отдельным пакетом идет.
     

  • 1.31, nich (ok), 09:19, 06/05/2017 [ответить] [﹢﹢﹢] [ · · · ]  
  • –2 +/
    Гaвнистый релиз.  Мой код перестал линковаться с LTO.  Хедеры libstdc++ перестали компилироваться с Clang 4.0.  В GCC 6.3.0 всё работало.  Прийдется ждать первого сервис пака^H^H^H 7.2.
     
  • 1.33, Антон (??), 10:48, 08/05/2017 [ответить] [﹢﹢﹢] [ · · · ]  
  • –5 +/
    Когда же появится поддержка UTF-имён перемененных как в шланге ?

     
     
  • 2.34, Alex (??), 21:35, 08/05/2017 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Вы, батенька, по 1С хотите поностальгировать?
     

     Добавить комментарий
    Имя:
    E-Mail:
    Текст:



    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2024 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру