Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

GNU Compiler Collection ( GCC ) является оптимизирующий компилятор , вырабатываемые Проект GNU поддерживает различные языки программирования , аппаратных архитектур и операционных систем . Фонд свободного программного обеспечения (FSF) распространяет GCC как бесплатное программное обеспечение под Стандартной общественной лицензией GNU (GNU GPL). GCC - ключевой компонент инструментальной цепочки GNU и стандартный компилятор для большинства проектов, связанных с GNU и ядром Linux.. GCC, насчитывающий примерно 15 миллионов строк кода в 2019 году, является одной из крупнейших существующих программ с открытым исходным кодом. [4] Он сыграл важную роль в росте бесплатного программного обеспечения как инструмент и как пример.

Когда он был впервые выпущен в 1987 году Ричард Столлман , GCC 1.0 был назван GNU C Compiler , так как он только обработал язык программирования Си . [1] В декабре того же года он был расширен для компиляции C ++ . Передние концы были позже разработаны для Objective-C , Objective-C ++ , Fortran , Java , Ada , D и К , среди других. [6] Спецификации OpenMP и OpenACC также поддерживаются компиляторами C и C ++. [7] [8]

GCC был перенесен на широкий спектр платформ и архитектур наборов команд , вероятно, больше, чем любой другой компилятор, [ ласковые слова ], и широко используется в качестве инструмента при разработке как бесплатного, так и проприетарного программного обеспечения . GCC также доступен для многих встраиваемых систем , включая чипы на базе ARM и Power ISA .

Помимо того , что GCC является официальным компилятором операционной системы GNU , он был принят в качестве стандартного компилятора во многих других современных Unix-подобных компьютерных операционных системах , включая большинство дистрибутивов Linux . Большинство операционных систем семейства BSD также перешли на GCC вскоре после его выпуска, хотя с тех пор FreeBSD , OpenBSD и Apple macOS перешли на компилятор Clang [9], в основном по политическим и лицензионным причинам. [10] [11] [12] GCC также может компилировать код для Windows , Android., iOS , Solaris , HP-UX , AIX и DOS. [13]

История [ править ]

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

GCC впервые был выпущен 22 марта 1987 года, доступный по FTP из MIT . [18] Столлман был указан как автор, но процитировал других за их вклад, в том числе Джека Дэвидсона и Кристофера Фрейзера за идею использования RTL в качестве промежуточного языка, Пола Рубина для написания большей части препроцессора и Леонарда Тауэра за «части языка». парсер, генератор RTL, определения RTL и описание машины Vax ". [19] Компилятор GNU, описанный Питером Х. Салусом как «первый хит свободного программного обеспечения» , появился как раз в то время, когда Sun Microsystems отделяла свои инструменты разработки от своей операционной системы., продавая их по отдельности по более высокой комбинированной цене, чем предыдущий комплект, что побудило многих пользователей Sun купить или загрузить GCC вместо инструментов поставщика. [20] В то время как Столлман считал GNU Emacs своим основным проектом, к 1990 году GCC поддерживал тринадцать компьютерных архитектур, превосходил по производительности компиляторы нескольких поставщиков и коммерчески использовался несколькими компаниями. [21]

Вилка EGCS[ редактировать ]

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

В 1997 году группа разработчиков сформировала Experimental / Enhanced GNU Compiler System (EGCS), чтобы объединить несколько экспериментальных форков в один проект. [22] [17] В основе слияния лежал моментальный снимок разработки GCC (сделанный примерно в версии 2.7.2, а затем в версии 2.81). Слияния включены g77 (Fortran), PGCC ( P5 Pentium -Оптимизация GCC), [17] многие C ++ усовершенствования, и много новых архитектур и операционных систем вариантов. [23]

В то время как оба проекта внимательно следили за изменениями друг друга, разработка EGCS оказалась значительно более активной, настолько, что FSF официально остановила разработку своего компилятора GCC 2.x, одобрила EGCS в качестве официальной версии GCC и назначила проект EGCS GCC. сопровождающих в апреле 1999 года. С выпуском GCC 2.95 в июле 1999 года два проекта снова были объединены. [24] [17] GCC с тех пор поддерживается разнообразной группой программистов со всего мира под руководством руководящего комитета. [25]

GCC 3 (2002) удалил интерфейс для CHILL из-за отсутствия поддержки. [26]

До версии 4.0 интерфейсная часть Fortran g77поддерживала только FORTRAN 77 , но позже была отброшена в пользу новой интерфейсной части GNU Fortran, которая поддерживает Fortran 95, а также большую часть Fortran 2003 и Fortran 2008 . [27] [28]

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

Поддержка Cilk Plus существовала с GCC 5 до GCC 7. [30]

GCC был перенесен на широкий спектр архитектур с набором команд и широко используется в качестве инструмента для разработки как бесплатного, так и проприетарного программного обеспечения . GCC также доступен для многих встраиваемых систем , включая Symbian (называемый gcce ), [31] чипы на базе ARM и Power ISA . [32] Компилятор может работать с широким спектром платформ, включая игровые консоли, такие как PlayStation 2 , [33] Cell SPE для PlayStation 3, [34] и Dreamcast . [35]Он был перенесен на большее количество типов процессоров и операционных систем, чем любой другой компилятор. [36] [ нужен лучший источник ]

Поддерживаемые языки [ править ]

По состоянию на январь 2021 года недавний выпуск GCC 10.2 включает интерфейсы для C ( gcc), C ++ ( g++), Objective-C , Fortran ( gfortran), Ada ( GNAT ), Go ( gccgo) и D (GDC, начиная с 9.1) [37] языки программирования, [38] с расширениями параллельного языка OpenMP и OpenACC , поддерживаемыми начиная с GCC 5.1. [8] [39] Версии до GCC 7 также поддерживали Java ( gcj), что позволяло компилировать Java в собственный машинный код.[40] Что касается поддержки языковых версий, в настоящее время используются C ++ и C по умолчанию [ когда? ] target gnu ++ 14 , надмножество C ++ 14 , и gnu11 , надмножество C11 , также доступны со строгой стандартной поддержкой. Начиная с GCC 9, поддержка C ++ 17 больше не является экспериментальной, и она, или строго gnu ++ 17 , будет по умолчанию в (грядущем) GCC 11. GCC также предоставляет экспериментальную поддержку C ++ 20 . [ необходима цитата ]

Сторонние интерфейсы существуют для многих языков, таких как Pascal ( gpc), Modula-2 , Modula-3 , PL / I и VHDL ( ghdl). [38] Существует несколько экспериментальных веток для поддержки дополнительных языков, таких как компилятор GCC UPC для Unified Parallel C [41] или Rust . [42]

Дизайн [ править ]

Обзор расширенного конвейера компиляции GCC, включая специализированные программы, такие как препроцессор , ассемблер и компоновщик .
GCC следует трехступенчатой ​​архитектуре, типичной для многоязычных и многопроцессорных компиляторов . Все программы дерева преобразуются в общее абстрактное представление на «средний конце», что позволяет оптимизация коды и двоичный код объекты генерации , которые будут общими для всех языков.

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

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

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

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

GCC использует множество стандартных инструментов в своей сборке, включая Perl , [ требуется дальнейшее объяснение ] Flex , Bison и другие распространенные инструменты. Кроме того, в настоящее время для сборки требуется наличие трех дополнительных библиотек: GMP , MPC и MPFR . [ необходима цитата ]

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

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

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

Внешние интерфейсы [ править ]

Внешние интерфейсы состоят из предварительной обработки , лексического анализа , синтаксического анализа (синтаксического анализа) и семантического анализа. Цели внешнего интерфейса компилятора - принять или отклонить программы-кандидаты в соответствии с грамматикой и семантикой языка, выявить ошибки и обработать допустимые представления программ на более поздних этапах компиляции. Этот пример показывает , лексические и синтаксический анализ шагов , выполняемые для простой программы , написанной на C .

Каждый интерфейс использует синтаксический анализатор для создания абстрактного синтаксического дерева данного исходного файла . Благодаря абстракции синтаксического дерева исходные файлы любого из различных поддерживаемых языков могут обрабатываться одной и той же серверной частью . GCC начал использовать парсеры LALR, созданные с помощью Bison , но постепенно переключился на написанные вручную парсеры с рекурсивным спуском для C ++ в 2004 г. [50] и для C и Objective-C в 2006 г. [51] С 2021 г. все интерфейсы используют ручную работу. -писанные парсеры с рекурсивным спуском.

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

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

GENERIC и GIMPLE [ править ]

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

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

При преобразовании исходного кода в GIMPLE [53] сложные выражения разбиваются на трехадресный код с использованием временных переменных . Это представление было вдохновлено представлением SIMPLE предложенного в компиляторе McCAT [54] по Laurie J. Hendren [55] для упрощения анализа и оптимизации в императивных программах .

Оптимизация [ править ]

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

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

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

Бэкэнд [ править ]

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

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

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

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

Стандартная библиотека C ++ (libstdc ++) [ править ]

Проект GCC включает реализацию стандартной библиотеки C ++, называемой libstdc ++, [58] под лицензией GPLv3 License, за исключением связывания приложений с закрытым исходным кодом, когда источники создаются с помощью GCC. [59] Текущая версия - 11.

Другие особенности [ править ]

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

  • Оптимизация времени компоновки оптимизирует границы объектного файла, чтобы напрямую улучшить связанный двоичный файл. Оптимизация времени компоновки полагается на промежуточный файл, содержащий сериализацию некоторого представления Gimple, включенного в объектный файл. [ необходима цитата ] Файл создается вместе с объектным файлом во время компиляции исходного кода. Каждая исходная компиляция создает отдельный объектный файл и вспомогательный файл времени компоновки. Когда объектные файлы связаны, компилятор снова запускается и использует вспомогательные файлы для оптимизации кода в отдельно скомпилированных объектных файлах.
  • Плагины могут напрямую расширять компилятор GCC. [60] Плагины позволяют адаптировать стандартный компилятор к конкретным потребностям с помощью внешнего кода, загружаемого в виде плагинов. Например, плагины могут добавлять, заменять или даже удалять промежуточные проходы, работающие с представлениями Gimple . [61] Несколько подключаемых модулей GCC уже были опубликованы, в частности подключаемый модуль GCC Python, который ссылается на libpython и позволяет вызывать произвольные сценарии Python изнутри компилятора. Цель состоит в том, чтобы позволить писать плагины GCC на Python. Плагин MELT предоставляет высокоуровневый Lisp- подобный язык для расширения GCC. [62]
  • Транзакционная память C ++ при компиляции с помощью -fgnu-tm. [7] [63]
  • Начиная с GCC 10, идентификаторы допускают кодировку UTF-8 (Unicode), т. Е. Исходный код C по умолчанию использует кодировку UTF-8. [64] [65]

Архитектура [ править ]

GCC компилирует Hello World в Windows

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

  • Альфа
  • РУКА
  • AVR
  • Blackfin
  • Богоявление (GCC 4.8)
  • H8 / 300
  • HC12
  • IA-32 ( x86 )
  • IA-64 (Intel Itanium)
  • MIPS
  • Motorola 68000
  • PA-RISC
  • PDP-11
  • PowerPC
  • R8C / M16C / M32C
  • SPARC
  • СПУ
  • SuperH
  • Система / 390 / zSeries
  • VAX
  • x86-64

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

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

  • 68HC11
  • A29K
  • CR16
  • C6x
  • D30V
  • DSP16xx
  • ETRAX CRIS
  • FR-30
  • FR-V
  • Intel i960
  • IP2000
  • M32R
  • MCORE
  • MIL-STD-1750A
  • MMIX
  • MN10200
  • MN10300
  • Motorola 88000
  • NS32K
  • IBM ROMP
  • RL78
  • Бурный16
  • V850
  • Xtensa

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

  • Cortus APS3
  • ARC
  • AVR32
  • C166 и C167
  • D10V
  • EISC
  • eSi-RISC
  • Шестиугольник [67]
  • Решетка
  • Решетка
  • MeP
  • MicroBlaze
  • Motorola 6809
  • MSP430
  • Архитектура NEC SX [68]
  • Ниос II и Ниос
  • OpenRISC
  • PDP-10
  • PIC24 / dsPIC
  • PIC32
  • Пропеллер
  • RISC-V
  • Сатурн (HP48XGCC)
  • Система / 370
  • TIGCC ( вариант m68k )
  • TMS9900
  • TriCore
  • Z8000
  • ЗПУ

GCJ компилятор Java может выбрать либо родной язык архитектуры машины или виртуальной машины Java «s Java байткод . [69] При перенацеливании GCC на новую платформу часто используется самозагрузка . Motorola 68000, Zilog Z80 и другие процессоры также используются в версиях GCC, разработанных для различных программируемых графических калькуляторов Texas Instruments, Hewlett Packard, Sharp и Casio. [70]

Лицензия [ править ]

GCC лицензирован под лицензией GNU General Public версии 3. [71] исключение во время выполнения GCC позволяет составление собственных программ (в дополнение к бесплатному программному обеспечению) с GCC. Это не влияет на условия лицензии исходного кода GCC. [72]

См. Также [ править ]

  • Список компиляторов
  • MinGW
  • LLVM / Clang

Ссылки [ править ]

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

Дальнейшее чтение [ править ]

  • Использование коллекции компиляторов GNU (GCC) , Free Software Foundation, 2008.
  • Внутренние компоненты GNU Compiler Collection (GCC) , Free Software Foundation, 2008.
  • Введение в GCC , Network Theory Ltd., 2004 г. (пересмотрено в августе 2005 г.). ISBN 0-9541617-9-3 . 
  • Артур Гриффит, GCC: Полный справочник . McGrawHill / Osborne, 2002. ISBN 0-07-222405-3 . 

Внешние ссылки [ править ]

Официальный [ править ]

  • Официальный веб-сайт
  • График выпуска GCC
  • План развития GCC

Другое [ править ]

  • Оптимизация GCC
  • Коллекция документации по архитектуре и внутреннему устройству GCC 4.0.2 в IIT Bombay
  • Кернер, Шон Майкл (2 марта 2006 г.). «Новый GCC Heavy по оптимизации» . internetnews.com
  • Кернер, Шон Майкл (22 апреля 2005 г.). «GCC 4.0 с открытым исходным кодом: старше, быстрее» . internetnews.com
  • От источника к двоичному: внутренняя работа GCC , Диего Новилло, Red Hat Magazine , декабрь 2004 г.
  • Статья 2003 года о GENERIC и GIMPLE
  • Marketing Cygnus Support , эссе, посвященное развитию GCC в 1990-е годы, с 30 ежемесячными отчетами в разделе «Inside Cygnus Engineering» ближе к концу.
  • Объявление EGCS 1.0
  • Список возможностей EGCS 1.0
  • Fear of Forking , эссе Рика Моэна , в котором записаны семь хорошо известных вилок, включая GCC / EGCS