Связывание и связывание в Аде

Интересно, в чем принципиальная разница между биндингом и линковкой при работе с кодом на Аде? Я не мог найти хорошее объяснение в Google, поэтому я задаю вопрос.

Что является входом и выходом процесса связывания? Какова связь между связыванием и связыванием? Я предполагаю, что привязка должна быть сделана в первую очередь.

Спасибо, Богдан.


person user3523954    schedule 01.06.2018    source источник


Ответы (2)


С GNAT есть две задачи, которые выполняет компоновщик: во-первых, проверка того, что все необходимые компиляции были выполнены, чтобы закрытие программы было согласованным, и, во-вторых, организация выполнения обработки (эти задачи необходимы для любой системы сборки Ada, но они могут быть реализованы по-разному).

При использовании gnatmake первое из этих заданий обычно лишнее, потому что gnatmake уже организовал все необходимые компиляции. Сделать это неправильно (например, переместив модуль в другую библиотеку и не удалив продукты его компиляции из исходного места) можно, но довольно сложно!

Уточнение — это особенность Ады, которой нет во многих других языках. Объяснение есть на gcc.gnu .org и в других местах, но для простого примера

with Foo;
package Bar is
   Int : Integer := Foo.Value;
   [...]
end Bar;

package Foo is
   function Value return Integer;
   [...]
end Foo;

мы не знаем, что Foo.Value вернет во время компиляции, и мы можем не знать до времени выполнения (что, если он считывает значение из командной строки?), поэтому Foo.Value должен быть в подходящем состоянии для вызова до Bar происходит инициализация.

Инициализация Bar происходит, когда разрабатывается Bar, а также для Foo, поэтому задача gnatbind состоит в том, чтобы распознать это и обеспечить, чтобы Foo был разработан до Bar.

Он делает это, посылая вызовы коду разработки пакетов в функцию (обычно называемую adanit) и main(), которая должна вызываться операционной системой, и вызывает adainit, а затем основную программу Ады, скажем, program.adb.

Затем gnatmake вызывает gnatlink, который берет код, сгенерированный gnatbind, в Аде в файлах с именами b-program.ad[sb], b__program.ad[sb] или b~program.ad[sb] в зависимости от версии компилятора, компилирует его и связывает с закрытием программы для создания окончательного исполняемого файла.

person Simon Wright    schedule 01.06.2018
comment
Спасибо за ответ. Итак, правильно ли говорить так: эта привязка является этапом предварительной обработки, который гарантирует, что код будет работать без каких-либо ошибок, которые могут быть связаны с неинициализированными компонентами sw? Этот этап предварительной обработки работает исключительно с исходным кодом (почти так же, как препроцессор C) и генерирует дополнительный исходный код, который впоследствии будет скомпилирован и связан без каких-либо различий по сравнению с C и C++. - person user3523954; 01.06.2018
comment
Логически ему нужно работать только с исходным кодом, но на самом деле информация о зависимости включает контрольную сумму и дату файлов, с которыми этот файл был скомпилирован. Связывание совсем не похоже на препроцессор C, который изменяет исходный код, видимый компилятору; привязка генерирует дополнительный исходный код. - person Simon Wright; 01.06.2018

Ознакомьтесь с четырьмя пунктами, перечисленными здесь: //docs.adacore.com/gnat_ugn-docs/html/gnat_ugn/gnat_ugn/building_executable_programs_with_gnat.html#binding-with-gnatbind

Вы можете думать об этом как о встроенной команде make, но без перекомпиляции: она обеспечивает согласованность объектов, генерирует правильный порядок инициализации, компилирует ее и передает все компоновщику.

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

person Álex    schedule 01.06.2018
comment
make, done for you — довольно хороший способ взглянуть на это. (Небольшая) часть сложности Ады заключается в размещении информации об исключении Make в исходном коде и обработке этой информации привязкой. Для практических целей вам нужно выучить только один язык (Ada) вместо двух (например, синтаксис C и Make). - person user_1818839; 02.06.2018