Apollo-11: Używanie włączenia zamiast linkera

9

Niedawno zdigitalizowany i przekształcony w repozytorium udostępniono oryginalny kod źródłowy komputerowego przewodnika Apollo 11 do przeglądania na Github .

W MAIN.agc autor repozytorium komentuje, że tak

podzielić olbrzymi monolityczny kod źródłowy na mniejsze, łatwiejsze do zarządzania fragmenty - tj. na poszczególne pliki źródłowe #.

Nieco później autor stwierdza

Można zasadnie zapytać, dlaczego dziesiątki tysięcy wierszy źródła są łączone poprzez włączenie, zamiast po prostu pojedynczego złożenia plików źródłowych, a następnie połączenia ich w celu utworzenia pliku wykonywalnego. Odpowiedź jest taka, że ​​pierwotny zespół programistów nie miał linkera.

Wiem, czym są linkery i rozumiem ich sens - ale nigdy nie słyszałem o frazie (o ile chodzi o ASM) „połączone przez włączenie”.

Co to znaczy? Biorąc pod uwagę, że linkery to wielka sprawa w programowaniu, jestem ciekawy, czym jest to substytucja linkerów przez „sposób włączenia” i jak to działa.

8 protonów
źródło
7
Przykładem „połączonych poprzez włączenie” może być #includedyrektywa w C. Innymi słowy, zamiast kodu skompilowanego na komponentach, które następnie są ze sobą połączone, wygląda na to, że $notacja zawiera zawartość tego pliku, w celu wygenerowania jednego dużego pliku źródłowego. Ten jeden duży plik źródłowy jest następnie kompilowany jako pojedynczy obiekt.
David Arno
1
@DavidArno twój komentarz wydaje się lepszą odpowiedzią niż jedna z dwóch odpowiedzi obecnie na tablicy.
Ross Presser,

Odpowiedzi:

18

Wydaje się, że oznaczają proste łączenie / wstawianie tekstu. Innymi słowy, mimo że tekst źródłowy został podzielony na pojedyncze pliki , program nie został podzielony na moduły .

Jörg W Mittag
źródło
-2

Jak prosta integracja różni się od linkowania?

Tak proste włączenie odbywa się za pomocą #include „someCFile.c”.

Domyślnie linkery dodają bibliotekę wykonawczą. Po włączeniu należałoby to uwzględnić.

Podejrzewam, że włączenie zajmie mniej miejsca, ponieważ obiekty nie będą musiały mieć tabel zawierających punkty wejścia i potencjalnie zmienne o nazwach. W łączeniu dynamicznym tablica punktów wejścia musi tam być. Nie jestem pewien, czy statyczne linkowanie usunęło go, czy nie, podejrzewam, że nie.

Jeśli chodzi o szybkość przetwarzania, włączenie jest prawdopodobnie nieco szybsze (zdecydowanie w przypadku bibliotek połączonych dynamicznie), jednak nie jest tak elastyczne, ponieważ wiele aplikacji nie może współużytkować tej samej biblioteki.

Biorąc pod uwagę rozmiar binarny, włączenie byłoby większe.

Biorąc pod uwagę czas kompilacji, włączenie potrwa dłużej.

W przypadku komputera nawigacyjnego NASA proste włączenie było w porządku, ponieważ komputer nawigacyjny uruchomił tylko jeden program.

Robert Baron
źródło
2
Nie sądzę, że to odpowiada na pytanie „co to jest i jak działa”.
tofro
tofro: Zinterpretowałem „Co to znaczy?” co to znaczyłoby z praktycznego punktu widzenia pod względem wielkości binarnej i szybkości wykonywania.
Robert Baron
„włączenie byłoby większe” - nie rozumiem tego. Jeśli kod jest w, to jest w i używa miejsca - niezależnie od tego, jak dostał się do pliku binarnego. Nawet nie zgadzaj się na czas kompilacji - pełna wersja zajmie identyczny czas.
Zyskujesz
Szybkość wykonywania byłaby większa, ponieważ wszystkie funkcje minimalnego systemu operacyjnego znajdują się w pliku wykonywalnym, więc są to tylko wywołania w przeciwieństwie do używania przerwań (rozważam minimalny system operacyjny, taki jak DOS, w którym korzystał z przerwań 8086 do wykonywania połączeń systemowych). Ponadto, ponieważ uwzględniono by cały system operacyjny, zużyłoby to więcej miejsca niż w innym przypadku i wydłużyłoby czas kompilacji.
Robert Baron