Ваш типичный компилятор поставляется с двумя основными инструментами: компилятором и компоновщиком.
Компилятор переводит исходный код языка (текст) в объектные файлы машинного языка (двоичные файлы). Возможно, он будет включать некоторую информацию о перемещении объекта, чтобы помочь компоновщику.
Компоновщик берет несколько объектных файлов машинного языка и связывает их все вместе в один машинный исполняемый файл.
Обычно вы должны указать компилятору, где найти все дополнительные файлы, необходимые для выполнения компиляции, а затем вы должны указать компоновщику имя каждого файла, необходимого для соединения вашего исполняемого файла, включая системные библиотеки, которые вы можете использовать. Это может быть довольно сложно, вот тут-то и появляются инструменты сборки, такие как make
.
Ада определена таким образом, что всегда должен быть какой-то библиотекарь, чтобы отслеживать эту информацию для вас. Таким образом, чтобы выполнить полную сборку вашей системы, все, что вам нужно сделать, это попросить библиотекаря собрать для вас исполняемый файл.
Способ, которым Gnat
обрабатывает эту библиотечную функциональность, заключается в том, что предполагается (если не указано иное), что существует взаимно-однозначное соответствие между именами модулей (пакетов) Ada и именами исходных и объектных файлов. Таким образом, если ему нужна спецификация для X
для завершения компиляции, он знает, что нужно перейти к X.ads
, чтобы найти файл спецификации. Когда приходит время связать, он знает, что найдет свой объектный файл в X.o
. Это означает, что если для успешной компоновки ему нужна подпрограмма из пакета X
, она точно знает, как это сделать для вас, когда тупой компоновщик просто потерпит неудачу и сообщит вам полушифрованное имя «символа», который он может ' т найти.
Таким образом, вместо того, чтобы вводить отдельные команды компиляции для каждого модуля в вашей программе, как вы должны делать с C или C ++, вы можете просто использовать gnatmake
, чтобы скомпилировать каждый модуль, который понадобится данному имени исполняемого файла, а затем связать их вместе для вас. Один шаг, легкий горох.
Что касается вашего последнего вопроса, компилятор Gnat Ada написан почти полностью на Ada. Для компиляторов довольно типично, что они пишутся на своем собственном языке и компилируются с использованием самих себя. Это называется self-hosting .
Тем не менее, он связан с GCC, поэтому части, общие с GCC (часть, которая переводит из формата дерева в целевой объектный код и компоновщик, я считаю) написаны на C.