GNU Compiler Collection (GCC) |
Автор: admin Просмотров: 9669 Комментарии:
Добавлен: 28 апреля 2015
Обновлено: 29.04.2015 - 15:37
Система компиляторов с поддержкой различных языков. GCC является ключевым компонентом набора инструментов GNU. GCC играет важную роль в развитии свободного программного обеспечения как инструмент и как пример.
GNU C Compiler был так назван когда он обрабатывал только один язык, GCC 1.0 был выпущен в 1987. В декабре этого же года он был расширен до компиляции C++. Позже были разработаны фронт-энды для Objective-C, Objective-C++, Fortran, Java, Ada, Go и других языков.
GCC портирован на самые разные процессорные архитектуры и широко используется для разработки свободных и коммерческих программ. GCC также доступен на большинстве встраиваемых платформ, в том числе на Symbian (так называемый GCCE ), AMCC и Freescale Power Architecture -based chips. GCC также может собирать программы для игровых консолей PlayStation и Dreamcast.
Будучи официальным компилятором операционной системы GNU, GCC был принят в качестве стандартного компилятора многими другими современными Unix-подобными операционными системами, в том числе GNU/Linux и BSD, хотя FreeBSD движется к LLVM. Также доступны версии для Microsoft Windows и других систем.
Дизайн GNU Compiler Collection (GCC)
Внешний дизайн GCC следует соглашениям UNIX. Пользователь вызывает программу-драйвер конкретного языка (gcc для C, g++ для C++ и т.д.), который интерпретирует аргументы командной строки, вызывает актуальный компилятор, запускает ассемблер на выводе и опционально запускает компоновщик.
Каждый компилятор языка это отдельная программа, которая считывает исходный код и выводит машинный код. Все они имеют общую внутреннюю структуру. Front-end языка анализирует исходный код этого языка и производит абстрактное синтаксическое дерево ("дерево" для краткости). Компиляторы с разных языков работают по принципу front-end, т.е. транслируют в некий общий промежуточный "язык GENERIC", который затем единым для всех исходных языков back-end компилятором преобразуется в конечную форму. Эта фраза об этом. Методы оптимизации компиляции и статического анализа кода (такие как FORTIFY_SOURCE, директива компилятора, которая пытается обнаружить переполнение буфера) применяются к коду. Они работают в нескольких представлениях, в архитектурно-независимом GIMPLE и архитектурно зависимом RTL. Затем производится машинный код с использованием специальных архитектурных шаблонов на основе алгоритмов Джека Дэвидсона и Криса Фрейзера.
GCC написан в основном на C за исключением частей на Ada. В комплект входят стандартные библиотеки для Ada, C++ и Java, код которых написан на этих же языках. На некоторых платформах в комплект входят также библиотеки времени выполнения низкого уровня, libgcc, написанный в сочетании с машинно-независимым C и специфическим процессорным кодом, предназначенным в основном для обработки арифметических операций, которые целевой процессор не может выполнять непосредственно.
В мае 2010 года руководящий комитет GCC принял решение разрешить использование компилятора C++ для компиляции GCC. Этот компилятор был предназначен для C плюс подмножество функций из C ++. Когда это приняли, разработчики GCC смогли использовать деструкторы и общие возможности C++.
В августе 2012 года руководящий комитет GCC объявил что GCC теперь использует компилятор C++ в качестве языка реализации. Это означает что для сборки GCC из исходников, требуется компилятор C++ который понимает стандарт ISO/IEC C++03.
Front ends
Каждый front end использует парсер для получения синтаксического дерева абстракций данного исходника. Из-за абстрактного синтаксического дерева, исходные файлы любого поддерживаемого языка могут быть обработаны одним и тем же front end. GCC начал использовать LALR-анализаторы, но постепенно перешел к написанным от руки рекурсивно-спускающимся парсерам для C++ в 2004 году, C и Objective-C в 2006 году. В настоящее время все front end использую рекурсивно-спускающиеся парсеры.
До недавнего времени, древовидное представление программы не было полностью зависимым от целевого процессора. Смыслом дерева было несколько отличаться для front end разных языков и front end могут предоставлять свои собственные деревья кодов. Это было упрощено с введением GENERIC и GIMPLE, двух новых языково-независимых форм, которые были введены с появлением GCC 4.0. GENERIC более сложный и основан на промежуточной реализации GCC 3.x Java front end's. GIMPLE является упрощенным GENERIC, в котором различные конструкции упрощенны. C , C++ и Java front ends производят GENERIC непосредственно в front end. Другие front end вместо этого имеют различные промежуточные представления после парсинга и преобразования их в GENERIC. В любом случае, так называемый "gimplifier" затем преобразует их в более сложную форму в простую SSA -based GIMPLE форму, общий языком для большого количества мощных языков и и не зависящих от архитектурных глобальных (функция "область видимости") оптимизации.
GENERIC и GIMPLE
GENERIC это промежуточное представление языка, используемое в качестве среднего звена во время компиляции исходного кода в двоичный файл. Подмножество, называемое GIMPLE, предназначено для всех front end GCC. Среднее звено GCC делает анализ и оптимизацию всего кода, работая независимо как от языка компиляции так и от целевой архитектуры начиная с GENERIC представления и расширяя его до Register Transfer Language (RTL). GENERIC представление содержит только подмножество императивных конструкций программирования, оптимизированных по среднему звену. При переводе исходного кода GIMPLE, сложные выражения делятся на трёхадресный код при помощи временных переменных. Это представление было предложено компилятором McCAT compiler для упрощения анализа и оптимизации в императивных программ.
Оптимизация
Оптимизация может происходить на любом этапе компиляции. Однако большая часть оптимизации выполняется до синтаксического и семантического анализа в front end и до генерации кода в back end. Таким образом, общее, хотя несколько противоречивое имя этого этапа компиляции - "среднее звено".
Точный набор GCC оптимизации меняется от версии к версии, но включает в себе такие стандартные алгоритмы: оптимизация цикла, удаление общих подвыражений, jump threading, инструкции планирования и так далее. RTL-оптимизация имеет меньшее значение с добавлением глобальных SSA-based оптимизаций на GIMPLE дереве, так как объём RTL-оптимизации более ограничен и имеет меньше выскокоуровневой информации.
Некоторые из этих оптимизаций, выполняемых на этом уровне включают устранение мертвого кода, исключение избыточных частей, глобальная нумерация значений, sparse conditional constant propagation и scalar replacement of aggregates. Выполняются массивы зависимых оптимизаций: автоматическая векторизация и автоматическое распараллеливание. Profile-guided optimization (PGO) также возможно.
Back end
Поведение back end GCC частично определяется макросами препроцессора и функциями специфическими для целевой архитектуры, например для определения байтов, размера слова и соглашении о вызове. front part back end использует их чтобы помочь решить генерацию RTL, поэтому несмотря на RTL, GCC является номинально процессорно-независимым, исходная последовательность абстрактных инструкций уже адаптирована к цели. В любой момент, фактические инструкции RTL, образующие представление программы должны соответствовать описанию машины целевой архитектуры.
Файл описания машины содержит RTL-шаблоны, наряду с ограничениями операнд и фрагментами кода для вывода окончательной сборки. Ограничения указывают что определённый RTL-шаблон может применяться только (например) к определённым аппаратным регистрам или (например) позволять операнду смещения накладывать ограничения размера (например, 12, 16, 24, ... битные смещения и т.д.). Во время генерации RTL, ограничения для данной целевой архитектуры проверяются. Во время генерации RTL, ограничения для данной целевой архитектуры проверяются. Для того чтобы выдать данную фрагмент RTL, он должен соответствовать одному (или более) шаблонов RTL в файл описания машины и соответствовать ограничениям этого шаблона; в противном случае, было бы невозможно преобразовать конечный RTL в машинный код.
К концу компиляции, действительный RTL сводится к строгой форме, в которой каждая команда относится к реальным машинным регистрам и шаблонам из файла описания целевой машины. Формирование строгого RTL является сложной задачей. Важным шагом является распределение регистров, где выбраны реальные аппаратные регистры на замену изначально присвоенных псевдо-регистров. Это сопровождается фазами перезагрузки. Любые псевдо-регистры, которые не были изначально назначены реальным аппаратным регистрам являются "пролитыми" в стёк и для выполнения этого пролива генерируется RTL. Кроме этого, смещения которые слишком велики для того чтобы поместится в фактической инструкции, должны быть разбиты и заменены RTL-последовательностями, которые будут подчинятся ограничению смещения. На заключительном этапе, машинный код собирается вызовом небольших фрагментов кода, связанных с каждым шаблоном для создания реальных инструкций из набора архитектурных команд, используя финальные регистры, смещения and/or addresses into the string is performed. Фрагменты ассемблерной генерации могут быть короткими блоками C-кода, выполняющими некоторую дополнительную работу, но в конечном итоге возвращающими строку содержащую правильный ассемблерный код.
Особенности GCC
Межпроцедурная оптимизация оптимизирует границы объектных файлов, непосредственно улучшая связанные бинарники. Межпроцедурная оптимизация полагается на промежуточный файл, содержащий сериализацию какого-то -Gimple- представления включенного в объектный файл. Файл создаётся с объектным файлом в процессе компиляции исходников. Каждая компиляция генерирует отдельный объектный файл и вспомогательный файл межпроцедурной оптимизации. Когда объектные файлы связаны, компилятор выполняется снова и использует вспомогательные файлы для оптимизации кода через отдельно скомпилированные объектные файлы.
Плагины могут дополнять компилятор GCC. Плагины могут дополнять, заменять и даже удалять middle–end операции на Gimple представлении. Уже опубликовано несколько плагинов, в том числе модуль для Python, который связывает с libpython и позволяет ссылаться на произвольные Python скрипты изнутри компилятора. Плагин MELT обеспечивает высокоуровневый язык Lisp.
Языки
Выпуск 4.6 включает front-ends для C (gcc), C++ (g++), Objective-C, Objective-C++, Fortran (gfortran), Java (gcj), Ada (GNAT), and Go (gccgo).[38] Also available, but not in standard are Pascal (gpc), Mercury, Modula-2, Modula-3, PL/I, D (gdc) и VHDL (ghdl). Также поддерживается популярный стандарт распаралеливания программ OpenMP. Начиная с версии 5.1, есть предварительная поддержка OpenACC.
До версии 4.0 front-end языка Fortran был g77, который поддерживает только FORTRAN77. В более поздних версиях, g77 заменили на GNU Fortran (сохраняющий большую часть расширений g77), который поддерживает Fortran 95 и большую часть Fortran 2003 и Fortran 2008. Front-qnd для CHILL был удалён по причине отсутствия поддержки. Через некоторые экспериментальные ветки доступна поддержка GCC UPC compilerfor Unified Parallel C.
Архитектура
Процессорные архитектуры в версии 4.3:
Alpha,ARM, AVR, Blackfin, Epiphany (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, SPU, SuperH
System/390 / zSeries, VAX, x86-64.
Менее известные процессоры, поддерживаемые в стандартном выпуске:
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, ROMP, RL78, Stormy16, V850, Xtensa.
Процессоры поддерживаемые отдельно от FSF версии:
Cortus APS3, ARC, AVR32, C166 and C167, D10V, EISC, eSi-RISC, Hexagon, LatticeMico32, LatticeMico8, MeP, MicroBlaze, Motorola 6809, MSP430, NEC SX architecture, Nios II and Nios, OpenRISC, PDP-10, PIC24/dsPIC, PIC32.
gcj Java compiler ориентируется на целевую архитектуру или на Java Virtual Machine's Java bytecode. При переориентации GCC на новую платформу, часто используется раскрутка компилятора.
Перевод с Википедии: https://en.wikipedia.org/wiki/GNU_Compiler_Collection
------------------------
ТРИО теплый пол отзыв
Заработок на сокращении ссылок
Earnings on reducing links
Код PHP на HTML сайты
Я уже пять лет не занимаюсь сайтом, так как работаю по 12 часов. Образование у меня среднее, и по этому нет нормальной работы. Если бы сайт приносил по 100$ в месяц, я бы добавлял по 50 статей каждый месяц. Если отправите пожертвования, я оставлю Ваши имена и фамилии в списке благодетелей !
Bitcoin: 1AP3JCZVFpHzZwcAyNztbrbFFiLdnKbY1j
Litecoin LfHXHz4k6LnDNNvCodd5pj9aW4Qk67KoUD
Dogecoin D9HHvKNFZxRhjtoh6uZYjMjgcZewwiUME9
Есть также другие кошельки.
Категория: Программирование, Сборка программ, Компиляторы
Лицензия:
GNU GPL 3 + с НКУ Runtime Library Exception
Интерфейс консольный
Язык программирования:
C++
Сайт проекта
Скачать GNU Compiler Collection (GCC)
Комментарии |