Коллекция компиляторов GNU - GNU Compiler Collection

Коллекция компиляторов GNU
Коллекция компиляторов GNU logo.svg
Разработчики)Проект GNU
изначальный выпуск23 мая 1987 г.; 33 года назад (1987-05-23)[1]
Стабильный выпуск
10.2[2] / 23 июля 2020 г.; 4 месяца назад (2020-07-23)
Репозиторий Отредактируйте это в Викиданных
Написано вC с некоторыми частями, написанными на C ++ [3]
Операционная системаКроссплатформенность
ПлатформаGNU
ТипКомпилятор
ЛицензияGPLv3 + с исключением библиотеки времени выполнения GCC[4]
Интернет сайтgcc.gnu.org

В Коллекция компиляторов GNU (GCC) это компилятор система, созданная Проект GNU поддержка различных языки программирования. GCC - ключевой компонент Набор инструментов GNU и стандартный компилятор для большинства проектов, связанных с GNU и Linux, в том числе Ядро Linux. В Фонд свободного программного обеспечения (FSF) распространяет GCC под Стандартная общественная лицензия GNU (GNU GPL). GCC сыграл важную роль в росте бесплатно программное обеспечение, как инструмент и пример.

Когда он был впервые выпущен в 1987 году, GCC 1.0 назывался Компилятор GNU C поскольку он обрабатывал только Язык программирования C.[1] Он был расширен для компиляции C ++ в декабре того же года. Передние концы позже были разработаны для Цель-C, Цель-C ++, Фортран, Ява, Ада, и Идти, среди прочего.[5]

Версия 4.5 OpenMP спецификация теперь поддерживается в компиляторах C и C ++[6] и "значительно улучшенная" реализация OpenACC 2.0a спецификация[7] также поддерживается. По умолчанию текущая версия поддерживает GNU ++ 14, надмножество C ++ 14, и gnu11, надмножество C11, также доступна строгая стандартная поддержка. Начиная с GCC 9, C ++ 17 поддержка больше не является экспериментальной, и она, или строго GNU ++ 17, является значением по умолчанию в (предстоящем) GCC 11. GCC также предоставляет экспериментальную поддержку для C ++ 20.

GCC был портирован к широкому кругу архитектуры наборов команд, и широко используется в качестве инструмента для разработки как бесплатных, так и проприетарное программное обеспечение. GCC также доступен для многих встроенные системы, включая РУКА -основан; AMCC, и Freescale Питание ISA чипсы на основе.[8] Компилятор может работать с широким спектром платформ.

Помимо того, что он является официальным компилятором Операционная система GNU, GCC был принят в качестве стандартного компилятора многими другими современными Unix-подобный компьютер операционные системы, в том числе большинство Linux раздачи. Наиболее BSD операционные системы семейства также перешли на GCC, хотя с тех пор некоторые BSD, включая FreeBSD и OpenBSD с тех пор переехали в Лязг компилятор.[9] macOS также перешел на Clang после использования GCC. Также доступны версии для Майкрософт Виндоус и другие операционные системы; GCC может компилировать код для Android и iOS.

История

В попытке бутстрап то GNU Операционная система, Ричард Столмен спросил Эндрю С. Таненбаум, автор Комплект компилятора Amsterdam (также известный как Свободный университет Compiler Kit) для разрешения использовать это программное обеспечение для GNU. Когда Таненбаум сообщил ему, что компилятор не бесплатный, и что только университет свободныйСтолмен решил написать новый компилятор.[10] Первоначальный план Столмена[11] было переписать существующий компилятор из Национальная лаборатория Лоуренса Ливермора из Пастель в C с некоторой помощью Лен Тауэр и другие.[12] Столлман написал новый интерфейс C для компилятора Livermore, но затем понял, что для этого требуются мегабайты стекового пространства, что невозможно в системе 68000 Unix, имеющей только 64 КБ, и пришел к выводу, что ему придется написать новый компилятор с нуля.[11] Ни один из кодов компилятора Pastel не попал в GCC, хотя Столлман действительно использовал написанный им интерфейс на C.[11]

GCC был впервые выпущен 22 марта 1987 г., доступен для FTP из Массачусетский технологический институт.[13] Столлман был указан как автор, но процитировал других за их вклад, в том числе Джека Дэвидсона и Кристофера Фрейзера за идею использования RTL в качестве промежуточного языка, Пол Рубин за написание большей части препроцессора и Леонард Тауэр за «части синтаксического анализатора, генератора RTL, определений RTL и описания машины Vax».[14] Описывается как "первое бесплатное программное обеспечение" Салус, компилятор GNU появился как раз в то время, когда Sun Microsystems отделял свои инструменты разработки от его операционная система, продавая их отдельно по более высокой комбинированной цене, чем предыдущий комплект, что побудило многих пользователей Sun купить или загрузить GCC вместо инструментов поставщика.[15] К 1990 году GCC поддерживал тринадцать компьютерных архитектур, превосходил по производительности компиляторы нескольких поставщиков, поставлялся компанией Общие данные и Следующий со своими рабочими станциями, и использовался Lotus Development Corporation.[16]

Поскольку GCC был лицензирован под GPL, программисты, желающие работать в других направлениях, особенно те, которые пишут интерфейсы для языков, отличных от C, могли свободно разрабатывать свои собственные вилка компилятора, при условии, что они соответствуют условиям GPL, включая требования к распространению исходный код. Однако использование нескольких форков оказалось неэффективным и громоздким, а трудность принятия работы официальным проектом GCC сильно разочаровывала многих.[17] FSF так строго контролировал то, что было добавлено в официальную версию GCC 2.x, что GCC использовался в качестве одного из примеров "соборной" модели разработки в Эрик С. Раймонд эссе Собор и базар.

В 1997 году группа разработчиков сформировала Experimental / Enhanced GNU Compiler System (EGCS), чтобы объединить несколько экспериментальных форков в один проект.[17][18] Основой слияния стал снимок состояния разработки GCC, сделанный между версиями 2.7 и 2.81. Объединенные проекты: g77 (Fortran), PGCC (P5 Pentium -оптимизированный GCC), множество улучшений C ++ и множество новых архитектур и Операционная система варианты.[19] Разработка EGCS оказалась значительно более энергичной, чем разработка GCC, настолько, что FSF официально остановила разработку своего компилятора GCC 2.x, благословила EGCS в качестве официальной версии GCC и назначила проект EGCS сопровождающими GCC в апреле 1999 года. с выпуском GCC 2.95 в июле 1999 года два проекта снова были объединены.[20]

С тех пор GCC поддерживается разнообразной группой программистов со всего мира под руководством руководящего комитета.[21] Он был перенесен на другие типы процессоры и операционных систем, чем любой другой компилятор.[22][ненадежный источник? ]

GCC был портирован к широкому кругу архитектуры наборов команд, и широко используется в качестве инструмента для разработки как бесплатных, так и проприетарное программное обеспечение. GCC также доступен для многих встроенные системы, включая Symbian (называется gcce),[23] РУКА -основан; AMCC, и Freescale Питание ISA чипсы на основе.[8] Компилятор может ориентироваться на широкий спектр платформ, в том числе игровые приставки такой как PlayStation 2,[24] Ячейка SPE для PlayStation 3,[25] и Dreamcast.[26]

Дизайн

Чтобы получить стабильную ABI, например, то Стандартная база Linux стремится обеспечить, важна версия компилятора.

Внешний интерфейс GCC следует Unix условности. Пользователи вызывают программу драйвера для конкретного языка (gcc для C, g ++ для C ++ и т. д.), который интерпретирует аргументы команды, вызывает фактический компилятор, запускает ассемблер на выходе, а затем при необходимости запускает компоновщик произвести полный исполняемый файл двоичный.

Каждый из компиляторов языка представляет собой отдельную программу, которая считывает исходный код и выводит Машинный код. Все имеют общую внутреннюю структуру. Интерфейс для каждого языка разбирает исходный код на этом языке и создает абстрактное синтаксическое дерево (сокращенно «дерево»).

При необходимости они преобразуются во входное представление среднего конца, называемое GENERIC форма; средний конец затем постепенно трансформирует программу в ее окончательную форму. Оптимизация компилятора и статический анализ кода техники (например, FORTIFY_SOURCE,[27] директива компилятора, которая пытается обнаружить некоторые переполнение буфера ) применяются к коду. Они работают с несколькими представлениями, в основном с архитектурно-независимым представлением GIMPLE и архитектурно-зависимым. RTL представление. Ну наконец то, Машинный код производится с использованием специфичной для архитектуры сопоставление с образцом изначально основан на алгоритме Джека Дэвидсона и Криса Фрейзера.

GCC был написан в основном на C за исключением части Ада внешний интерфейс. В дистрибутив входят стандартные библиотеки для Ada, C ++, и Ява чей код в основном написан на этих языках.[28] На некоторых платформах дистрибутив также включает низкоуровневую библиотеку времени выполнения, libgcc, написанный на комбинации машинно-независимого C и зависящего от процессора Машинный код, разработанный в первую очередь для обработки арифметических операций, которые целевой процессор не может выполнить напрямую.[29]

В мае 2010 года руководящий комитет GCC решил разрешить использование C ++ компилятор для компиляции GCC.[3] Компилятор был предназначен для написания на C плюс подмножество функций из C ++. В частности, это было решено, чтобы разработчики GCC могли использовать деструкторы и дженерики особенности C ++.[30]

В августе 2012 года руководящий комитет GCC объявил, что GCC теперь использует C ++ в качестве языка реализации.[31] Это означает, что для сборки GCC из исходников необходим компилятор C ++, который понимает ИСО / МЭК С ++ 03 стандарт.

18 мая 2020 г. GCC покинул ИСО / МЭК С ++ 03 стандарт для ISO / IEC C ++ 11 стандарт (т.е. необходим для компиляции, начальной загрузки, самого компилятора; однако по умолчанию он компилирует более поздние версии C ++).[32]

Передние концы

Каждый внешний интерфейс использует парсер для создания абстрактное синтаксическое дерево данного исходный файл. Благодаря абстракции синтаксического дерева исходные файлы любого из различных поддерживаемых языков могут обрабатываться одним и тем же задний конец. GCC начал с использования Парсеры LALR создан с Бизон, но постепенно перешли на рукописный парсеры с рекурсивным спуском для C ++ в 2004 г.,[33] и для C и Objective-C в 2006 году.[34] В настоящее время[когда? ] все интерфейсы используют рукописные синтаксические анализаторы с рекурсивным спуском.

До GCC 4.0 древовидное представление программы не было полностью независимым от целевого процессора.

Значение дерева было несколько различным для разных языковых интерфейсов, и внешние интерфейсы могли предоставлять свои собственные древовидные коды. Это было упрощено с появлением GENERIC и GIMPLE, двух новых форм не зависящих от языка деревьев, которые были представлены с появлением GCC 4.0. GENERIC более сложен и основан на промежуточном представлении интерфейса Java GCC 3.x. GIMPLE - это упрощенный GENERIC, в котором различные конструкции понижен к нескольким инструкциям GIMPLE. В C, C ++, и Ява передок производят GENERIC прямо в передке. Вместо этого другие интерфейсы имеют разные промежуточные представления после синтаксического анализа и преобразования их в GENERIC.

В любом случае так называемый «gimplifier» преобразует эту более сложную форму в более простую. SSA форма GIMPLE, являющаяся общим языком для большого количества мощных не зависящих от языка и архитектуры глобальных оптимизаций (объем функций).

GENERIC и GIMPLE

GENERIC является промежуточное представление язык, используемый в качестве «промежуточного звена» при компиляции исходного кода в исполняемые двоичные файлы. Подмножество, называемое GIMPLE, нацелен на все внешние интерфейсы GCC.

Средняя стадия GCC выполняет весь анализ кода и оптимизация, работающий независимо от компилируемого языка и целевой архитектуры, начиная с GENERIC[35] представление и расширение его до зарегистрировать язык перевода (RTL). Представление GENERIC содержит только подмножество императивного программирование конструкции оптимизированы к среднему концу.

При преобразовании исходного кода в GIMPLE,[36] сложный выражения разделены на трехадресный код с помощью временные переменные. Это представление было вдохновлено представлением ПРОСТОЙ, предложенным в компиляторе McCAT.[37] Лори Дж. Хендрен[38] для упрощения анализа и оптимизация из императивные программы.

Оптимизация

Оптимизация может происходить на любом этапе компиляции; однако основная часть оптимизаций выполняется после синтаксиса и семантический анализ переднего конца и перед генерация кода задней части; таким образом, обычное, хотя и несколько противоречивое, название этой части компилятора - «средний конец».

Точный набор оптимизаций GCC варьируется от выпуска к выпуску по мере его разработки, но включает стандартные алгоритмы, такие как оптимизация цикла, прыгать поток, исключение общего подвыражения, планирование инструкций, и так далее. В RTL оптимизации имеют меньшее значение с добавлением глобальных оптимизаций на основе SSA на GIMPLE деревья[39] поскольку RTL-оптимизации имеют гораздо более ограниченную область применения и содержат меньше высокоуровневой информации.

Некоторые из этих оптимизаций, выполненных на этом уровне, включают устранение мертвого кода, частичное устранение избыточности, глобальная нумерация значений, разреженное распространение условных констант, и скалярная замена агрегатов. Оптимизация на основе зависимости от массива, такая как автоматическая векторизация и автоматическое распараллеливание также выполняются. Профильная оптимизация тоже возможно.[40]

Бэк-энд

Серверная часть GCC частично определяется макросы препроцессора и функции, специфичные для целевой архитектуры, например, для определения ее порядок байтов, размер слова, и соглашения о вызовах. Передняя часть серверной части использует их для принятия решения о генерации RTL, поэтому, хотя RTL GCC номинально не зависит от процессора, начальная последовательность абстрактных инструкций уже адаптирована к цели. В любой момент фактические инструкции RTL, формирующие представление программы, должны соответствовать описание машины целевой архитектуры.

Файл описания машины содержит шаблоны RTL, а также ограничения операндов и фрагменты кода для вывода окончательной сборки. Ограничения указывают на то, что конкретный шаблон RTL может применяться (например) только к определенным аппаратным регистрам или (например) разрешать немедленные смещения операндов только ограниченного размера (например 12, 16, 24, ... битовые смещения и т. Д.). Во время генерации RTL проверяются ограничения для данной целевой архитектуры. Чтобы выдать данный фрагмент RTL, он должен соответствовать одному (или нескольким) шаблонам RTL в файле описания машины и удовлетворять ограничениям для этого шаблона; в противном случае было бы невозможно преобразовать окончательный RTL в машинный код.

К концу компиляции допустимый RTL сокращается до строгий форма, в которой каждая инструкция относится к регистрам реальной машины и шаблону из файла описания целевой машины. Формирование строгого RTL - сложная задача; важный шаг распределение регистров, где реальные аппаратные регистры выбираются вместо первоначально назначенных псевдорегистров. Затем следует фаза «перезагрузки»; любые псевдорегистры, которым не был назначен реальный аппаратный регистр, «переливаются» в стек, и генерируется RTL для выполнения этого распределения. Точно так же смещения, которые слишком велики для размещения в реальной инструкции, должны быть разбиты и заменены последовательностями RTL, которые будут подчиняться ограничениям смещения.

На заключительном этапе машинный код создается путем вызова небольшого фрагмента кода, связанного с каждым шаблоном, для генерации реальных инструкций из целевого файла. Набор инструкций с использованием последних регистров, смещений и адресов, выбранных на этапе перезагрузки. Фрагмент создания сборки может быть просто строкой, и в этом случае выполняется простая строковая подстановка регистров, смещений и / или адресов в строку. Фрагмент создания сборки также может быть коротким блоком кода C, выполняющим некоторую дополнительную работу, но в конечном итоге возвращающим строку, содержащую допустимый код сборки.

Функции

Некоторые особенности GCC включают:

  • Оптимизация времени компоновки оптимизирует границы объектного файла, чтобы напрямую улучшить связанный двоичный файл. Оптимизация времени компоновки полагается на промежуточный файл, содержащий сериализацию некоторых Gimple представление, включенное в объектный файл.[нужна цитата ] Файл создается вместе с объектным файлом во время компиляции исходного кода. Каждая исходная компиляция создает отдельный объектный файл и вспомогательный файл времени компоновки. Когда объектные файлы связаны, компилятор запускается снова и использует вспомогательные файлы для оптимизации кода в отдельно скомпилированных объектных файлах.
  • Плагины может напрямую расширять компилятор GCC.[41] Плагины позволяют адаптировать стандартный компилятор к конкретным потребностям с помощью внешнего кода, загружаемого в виде плагинов. Например, плагины могут добавлять, заменять или даже удалять промежуточные проходы, работающие на Gimple представления.[42] Несколько подключаемых модулей GCC уже опубликованы, в частности подключаемый модуль GCC Python, который ссылается на libpython и позволяет вызывать произвольные сценарии Python изнутри компилятора. Цель состоит в том, чтобы позволить писать плагины GCC на Python. Плагин MELT обеспечивает высокоуровневый Лисп -подобный язык для расширения GCC.[43]
  • "C ++ транзакционная память при компиляции с -fgnu-tm. "[6][44]
  • Начиная с GCC 10, идентификаторы позволяют UTF-8 (Unicode), т.е. исходный код C по умолчанию использует кодировку UTF-8.[45][46]

Языки

Стандартные выпуски компилятора, начиная с 7, включают интерфейсы для C (gcc), C ++ (g ++), Цель-C, Цель-C ++, Фортран (Gfortran), Ада (GNAT ), и Идти (gccgo).[47] Популярное расширение для параллельного языка, OpenMP, также поддерживается. В версии 5.0 добавлена ​​поддержка Силк Плюс, в версии 9.1 добавлена ​​поддержка D,[48] а с версии 5.1 есть предварительная поддержка OpenACC.[49] Также поддерживаются версии до GCC 7. Ява (gcj), что позволяет компилировать Java в машинный код.[50]

Передняя часть Fortran была g77 до версии 4.0, которая поддерживает только FORTRAN 77. В более новых версиях g77 отбрасывается в пользу нового GNU Fortran интерфейс (с сохранением большинства языковых расширений g77), поддерживающий Фортран 95 и большие части Фортран 2003 и Фортран 2008 также.[51][52] Интерфейс для ХОЛОД был сброшен из-за отсутствия обслуживания.[53]

Сторонние интерфейсы существуют для Паскаль (gpc), Модула-2, Модула-3, PL / I, и VHDL (ghdl).

Существует несколько экспериментальных веток для поддержки дополнительных языков, таких как GCC. UPC компилятор[54] за Унифицированный параллельный C.

Архитектура

Семейства целевых процессоров GCC, начиная с версии 4.3, включают (примечание, GCC 6 и более ранние версии больше не поддерживаются):

Начиная с GCC 10, поддерживается еще несколько (например, SPU, то есть Cell, удален), например Графические процессоры Nvidia, то есть промежуточный код Nvidia PTX, а также код AMD GCN, 64-битный ARM (AArch64 ), а не только 32-битный, RISC-V, MSP430, и eBPF (полный язык, отличный от Тьюринга, работающий в Ядро Linux ).[55]

Менее известные целевые процессоры, поддерживаемые в стандартной версии, включают:

Дополнительные процессоры поддерживаются версиями GCC, поддерживаемыми отдельно от версии FSF:

В gcj Компилятор Java может ориентироваться либо на архитектуру машинного языка, либо на Виртуальная машина Java с Байт-код Java.[58] Когда перенацеливание GCC на новую платформу, самонастройка часто используется. Motorola 68000, Zilog Z80 и другие процессоры также нацелены на версии gcc, разработанные для различных программируемых графических калькуляторов Texas Instruments, Hewlett Packard, Sharp и Casio.[59]

Разработка

Текущая стабильная версия GCC - 10.2, выпущенная 23 июля 2020 года.[60]

Начиная с версии 4.8, GCC реализован на C ++.[61]

GCC 4.6 поддерживает много нового[когда? ] Цель-C функции, такие как объявленные и синтезированные свойства, точечный синтаксис, быстрое перечисление, дополнительные методы протокола, атрибуты метода / протокола / класса, расширения классов и новый API времени выполнения GNU Objective-C. Он также поддерживает Язык программирования Go и включает libquadmath библиотека, которая предоставляет учетверенная точность математические функции по целям, поддерживающим __float128 тип данных. Библиотека используется для предоставления РЕАЛЬНЫЙ (16) введите GNU Фортран по таким целям.

GCC использует множество стандартных инструментов в своей сборке, включая Perl, Flex, Бизон и другие распространенные инструменты. Кроме того, в настоящее время для сборки требуются три дополнительных библиотеки: GMP, ПДК, и MPFR.

Основная часть разработки сосредоточена на магистрали, где внедряются и тестируются новые функции.

Лицензия

GCC под лицензией версии 3 Стандартная общественная лицензия GNU.[62]

В Исключение времени выполнения GCC позволяет составить проприетарный и бесплатно программное обеспечение программы с GCC и использование бесплатных программных плагинов.[63] Наличие этого исключения не подразумевает какое-либо общее предположение о том, что на стороннее программное обеспечение не распространяются требования об авторском леве лицензии GCC.

Использует

Несколько компаний делают бизнес на поставке и поддержке портов GCC для различных платформ.[64]

Смотрите также

Рекомендации

  1. ^ а б «Выпуски GCC». Проект GNU. Получено 24 июля, 2020.
  2. ^ «Серия выпусков GCC 10 - Проект GNU - Фонд свободного программного обеспечения (FSF)». gcc.gnu.org. Получено 24 июля, 2020.
  3. ^ а б «GCC в некоторой степени позволяет использовать C ++». H. 1 июня 2010 г.
  4. ^ «Исключение библиотеки времени выполнения GCC». Получено 24 июля, 2020.
  5. ^ «Языки программирования, поддерживаемые GCC». Проект GNU. Получено 23 июня, 2014.
  6. ^ а б "Серия выпусков GCC 6".
  7. ^ "OpenACC".
  8. ^ а б «Пакеты поддержки платы Linux». Получено 7 августа, 2008.
  9. ^ http://llvm.org/Users.html
  10. ^ фон Хаген, Уильям (2006). Полное руководство по GCC. Окончательные руководства (2-е изд.). Апресс. п. XXVII. ISBN  978-1-4302-0219-6. Поэтому он написал автору VUCK, спрашивая, может ли GNU его использовать. Очевидно, разработчик VUCK отказался от сотрудничества, заявив, что университет бесплатный, а компилятор - нет.
  11. ^ а б c Столмен, Ричард (20 сентября 2011 г.). «О проекте GNU». Проект GNU. Получено 9 октября, 2011.
  12. ^ Пьюзо, Джером Э., изд. (Февраль 1986 г.). "Зоопарк Гну". Бюллетень Гну. Фонд свободного программного обеспечения. 1 (1). Получено 11 августа, 2007.
  13. ^ Ричард М. Столлман (направленный Леонардом Х. Тауэром-младшим) (22 марта 1987 г.). "Бета-версия компилятора GNU C". Группа новостейcomp.lang.c. Получено 9 октября, 2011.
  14. ^ Столмен, Ричард М. (22 июня 2001 г.) [впервые опубликовано в 1988 г.], "Соавторы GNU CC", Использование и перенос коллекции компиляторов GNU (GCC), Free Software Foundation, Inc., стр. 7, получено 18 июня, 2015.
  15. ^ Салус, Питер Х. (2005). «Глава 10. СОЛНЦЕ и gcc». Демон, Гну и Пингвин. Groklaw.
  16. ^ Гарфинкель, Симсон Л. (6 августа 1990 г.). «Будьте готовы к программному обеспечению GNU». Computerworld.
  17. ^ а б Хенкель-Уоллес, Дэвид (15 августа 1997 г.), Новый проект компилятора для объединения существующих форков GCC, получено 25 мая, 2012.
  18. ^ «Часто задаваемые вопросы по компилятору Pentium».
  19. ^ «Краткая история развития GCC».
  20. ^ "История - GCC Wiki". gcc.gnu.org. Получено 28 сентября, 2020.
  21. ^ «Руководящий комитет GCC».
  22. ^ «Информационный проект Linux». LINFO. Получено 27 апреля, 2010. GCC был перенесен (т.е. модифицирован для работы) более чем на 60 платформ, что больше, чем для любого другого компилятора.
  23. ^ «Проект улучшения Symbian GCC». Получено 8 ноября, 2007.
  24. ^ "настройка gcc как кросс-компилятора". ps2stuff. 8 июня 2002 г. Архивировано с оригинал 11 декабря 2008 г.. Получено 12 декабря, 2008.
  25. ^ https://gcc.gnu.org/wiki/CompileFarm
  26. ^ "руководство по sh4 g ++". Архивировано из оригинал 20 декабря 2002 г.. Получено 12 декабря, 2008.
  27. ^ «Функции безопасности: проверки буфера времени компиляции (FORTIFY_SOURCE)». fedoraproject.org. Получено Одиннадцатое марта, 2009.
  28. ^ "языки, использованные для создания GCC".
  29. ^ "Внутреннее устройство GCC". GCC.org. Получено 1 марта, 2010.
  30. ^ "Электронное письмо Ричарда Столмена о emacs-devel".
  31. ^ «Серия выпусков GCC 4.8: изменения, новые функции и исправления». Получено 4 октября, 2013.
  32. ^ "bootstrap: требование обновления до C ++ 11". Получено 18 мая, 2020.
  33. ^ «Изменения, новые функции и исправления выпусков GCC 3.4».
  34. ^ «Изменения, новые функции и исправления выпусков GCC 4.1».
  35. ^ "GENERIC во внутреннем устройстве коллекции компиляторов GNU".
  36. ^ "GIMPLE во внутреннем устройстве коллекции компиляторов GNU".
  37. ^ «МакКэт». Архивировано 12 августа 2004 года.. Получено 14 сентября, 2017.CS1 maint: BOT: статус исходного URL-адреса неизвестен (связь)
  38. ^ "Лори Дж. Хендрен".
  39. ^ Новильо, Диего (декабрь 2004 г.). «От источника к двоичному: внутреннее устройство GCC». Журнал Red Hat. Архивировано из оригинал 1 апреля 2009 г.
  40. ^ «Здесь демонстрируется профильная оптимизация».
  41. ^ "Плагины". Онлайн-документация GCC. Получено 8 июля, 2013.
  42. ^ Старынкевич, Василий. "Плагины GCC на примере MELT" (PDF). Получено 10 апреля, 2014.
  43. ^ «О GCC MELT». В архиве из оригинала 4 июля 2013 г.. Получено 8 июля, 2013.
  44. ^ «Транзакционная память в GCC».
  45. ^ "Lewis Hyatt - [PATCH] wwwdocs: Поддержка документов для расширенных идентификаторов, добавленных в GCC". gcc.gnu.org. Получено 27 марта, 2020.
  46. ^ «Рекомендации по использованию расширенных идентификаторов для языков C и C ++». www.open-std.org. Получено 27 марта, 2020.
  47. ^ "Интерфейсы GCC". gnu.org. Получено 25 ноября, 2011.
  48. ^ "Серия выпусков GCC 9".
  49. ^ "Серия выпусков GCC 5".
  50. ^ «Серия выпусков GCC 7». gnu.org. Получено 20 марта, 2018.
  51. ^ "Таблица возможностей Fortran 2003, поддерживаемых GNU Fortran". GNU. Получено 25 июня, 2009.
  52. ^ «Таблица возможностей Fortran 2008, поддерживаемых GNU Fortran». GNU. Получено 25 июня, 2009.
  53. ^ "ПАТЧ] Убрать озноб". gcc.gnu.org. Получено 29 июля, 2010.
  54. ^ "GCC UPC (Унифицированный параллельный C GCC)". Intrepid Technology, Inc. 20 февраля 2006 г.. Получено Одиннадцатое марта, 2009.
  55. ^ «Сводка по параметрам (с использованием коллекции компиляторов GNU (GCC))». gcc.gnu.org. Получено 21 августа, 2020.
  56. ^ "Вики проекта Hexagon".
  57. ^ "sx-gcc: портировать gcc на nec sx vector cpu".
  58. ^ «Компилятор GNU для языка программирования Java». Архивировано из оригинал 9 мая 2007 г.. Получено 22 апреля, 2010.
  59. ^ графические калькуляторы # программирование
  60. ^ https://www.gnu.org/software/gcc/releases.html
  61. ^ «Серия выпусков GCC 4.8: изменения, новые функции и исправления».
  62. ^ «Использование коллекции компиляторов GNU». gnu.org. Получено 5 ноября, 2019.
  63. ^ «Исключение времени выполнения GCC». ФСПО. Получено 10 апреля, 2014.
  64. ^ «Справочник услуг ФСПО».

дальнейшее чтение

внешняя ссылка

Официальный

Другой