Связывание против связывания в Аде - PullRequest
0 голосов
/ 01 июня 2018

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

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

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

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

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

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

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

0 голосов
/ 01 июня 2018

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

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

Разработка - это особенность Ada, которая не 'присутствует на многих других языках.Есть объяснение в 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, а затем основную программу Ada,скажем program.adb.

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

...