Apollo-11: использование включения вместо компоновщика

9

Недавно оцифрованный и превращенный в репозиторий исходный компьютерный исходный код Apollo 11 был доступен для просмотра на Github .

В репозитории MAIN.agc автор репозитория комментирует, что они

разбить огромный монолитный исходный код на более мелкие, более управляемые куски - т.е. на отдельные исходные # файлы.

Чуть позже автор заявляет

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

Я знаю, что такое линкеры, и я понимаю их смысл, но я никогда не слышал о фразе (насколько это касается ASM), «соединенной посредством включения».

Что это значит? Учитывая, что линкеры имеют большое значение в программировании, мне любопытно, что такое замена линкеров «средствами включения» и как она работает.

8protons
источник
7
Примером «присоединения посредством включения» будет #includeдиректива в C. Другими словами, вместо того, чтобы код кода компилировался на компоненты, которые затем связывались вместе, похоже, что $нотация включает в себя содержимое этого файла, чтобы создать один большой исходный файл. Этот один большой исходный файл затем компилируется как единый объект.
Дэвид Арно
1
@DavidArno Ваш комментарий кажется лучшим ответом, чем любой из двух ответов, находящихся в настоящее время на доске.
Росс Прессер

Ответы:

18

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

Йорг Миттаг
источник
-2

Как простое включение сравнивается со ссылками?

Так что простое включение осуществляется с помощью #include "someCFile.c".

По умолчанию компоновщики добавят библиотеку времени выполнения. С включением это должно быть включено.

Я подозреваю, что включение заняло бы меньше места, так как объектам не нужно иметь таблицы, содержащие точки входа и потенциально переменные с именами. При динамическом связывании должна быть таблица точек входа. Я не уверен, удалит ли это статическая ссылка или нет, я подозреваю, что это не так.

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

Учитывая размер двоичного файла, включение будет больше.

Учитывая время компиляции, включение займет больше времени.

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

Роберт Барон
источник
2
Я не думаю, что это отвечает на вопрос «что это такое и как это работает».
Тофро
Тофро: Я интерпретировал «Что это значит?» как это будет означать с практической точки зрения с точки зрения размера двоичного файла и скорости выполнения.
Роберт Барон
«включение было бы больше» - не понимаю этого. Если код внутри, он внутри и использует пробел - независимо от того, как он попал в двоичный файл. Даже не соглашайтесь на время компиляции - полная сборка займет идентичное время. Вы набираете скорость только при выполнении инкрементных сборок, и я сомневаюсь, что это уже практиковалось в 60-х годах
до
Скорость выполнения будет выше, так как все функции минимальной операционной системы находятся в исполняемом файле, так что это просто вызовы, а не использование прерываний (я рассматриваю минимальную операционную систему, такую ​​как DOS, в которой используются прерывания 8086). совершать системные звонки). Кроме того, поскольку будет включена вся операционная система, это будет занимать больше места, чем когда это не так, и увеличит время компиляции.
Роберт Барон