На каком языке написан компилятор Ada gcc gnatmake? - PullRequest
1 голос
/ 18 ноября 2011

Я студент информатики. В настоящее время мы изучаем язык программирования Ada. На данный момент компиляция очень проста: gnatmake source.adb, так что я не имею никакого представления о том, что на самом деле делает или использует gnatmake (скрипт? Бинарный? Что-то еще?). Во всяком случае, мне было интересно, на каком языке был закодирован сам компилятор (также парсер, если он написан на другом языке)?

Ответы [ 4 ]

5 голосов
/ 18 ноября 2011

Ваш типичный компилятор поставляется с двумя основными инструментами: компилятором и компоновщиком.

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

Компоновщик берет несколько объектных файлов машинного языка и связывает их все вместе в один машинный исполняемый файл.

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

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

Способ, которым Gnat обрабатывает эту библиотечную функциональность, заключается в том, что предполагается (если не указано иное), что существует взаимно-однозначное соответствие между именами модулей (пакетов) Ada и именами исходных и объектных файлов. Таким образом, если ему нужна спецификация для X для завершения компиляции, он знает, что нужно перейти к X.ads, чтобы найти файл спецификации. Когда приходит время связать, он знает, что найдет свой объектный файл в X.o. Это означает, что если для успешной компоновки ему нужна подпрограмма из пакета X, она точно знает, как это сделать для вас, когда тупой компоновщик просто потерпит неудачу и сообщит вам полушифрованное имя «символа», который он может ' т найти.

Таким образом, вместо того, чтобы вводить отдельные команды компиляции для каждого модуля в вашей программе, как вы должны делать с C или C ++, вы можете просто использовать gnatmake, чтобы скомпилировать каждый модуль, который понадобится данному имени исполняемого файла, а затем связать их вместе для вас. Один шаг, легкий горох.


Что касается вашего последнего вопроса, компилятор Gnat Ada написан почти полностью на Ada. Для компиляторов довольно типично, что они пишутся на своем собственном языке и компилируются с использованием самих себя. Это называется self-hosting .

Тем не менее, он связан с GCC, поэтому части, общие с GCC (часть, которая переводит из формата дерева в целевой объектный код и компоновщик, я считаю) написаны на C.

4 голосов
/ 18 ноября 2011

В части Ada исходного дерева GCC (gcc/ada) есть ~ 2000 исходных файлов Ada и ~ 50 C исходных файлов. C действует как клей для ОС и других частей GCC. Некоторые (не менее 50) исходных файлов Ada предназначены для таких инструментов, как gnatmake.

Вы можете узнать больше о том, что делает gnatmake, используя опцию -v различными способами: чаще всего я использую gnatmake -v source.adb для обзора, gnatmake source.adb -cargs -v, чтобы показать, как вызывается компилятор, gnatmake source.adb -largs -v для обзора того, что делает компоновщик GNAT gnatlink, и gnatmake source.adb -largs -Wl,-v, чтобы подробно показать, как gnatlink вызывает системный компоновщик.

2 голосов
/ 18 ноября 2011

gnatmake - это просто инструмент, написанный на Аде. Это действует как make. Сам компилятор - это GNAT, который также написан на Ada. Это часть GCC, которая написана на многих языках.

1 голос
/ 18 ноября 2011

Чтобы ответить на часть вопроса "Что это?"и предполагается, что вы находитесь в системе типа Unix / Linux:

$ which gnatmake
/usr/bin/gnatmake
$ file /usr/bin/gnatmake
/usr/bin/gnatmake: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.15, stripped

... так что это двоичный файл :)

...