Was ist der unterschied zwischen einem Linker und dem Compiler?

2 Antworten

Ein Compiler übersetzt Code, der in einer sog. höheren Programmiersprache geschrieben ist, in Maschinensprache (das ist die Sprache, die die CPU eines Computers direkt versteht, weil jedes Wort darin für den Aufruf einer in Hardware realisierten Funktion steht).

Die meisten Programme aber, die wir in C, C++, Java oder ähnlichen Sprachen schreiben, bestehen aus sehr vielen Dateien, die vom Programmierer geschriebenen Sourcecode darstellen (man nennt sie Compilations Units, zu deutsch: Übersetzungseinheiten: Texte also, die einzeln einem Compiler vorgelegt werden). 

Wenn man also z.B. eine Anwendung (ein sog. Programm) hat, deren Sourcecode aus 11 in C++ geschriebenen Dateien *.cpp besteht, so wird der Compiler daraus 11 Dateien *.o erzeugen, die in Maschinensprache geschriebenen Text enthalten (sog. Object Code). Die aber müssen nun zusammengesetzt werden zu einem einzigen Text, der in einer Datei *.EXE oder *.DLL zu finden ist. Dieses Zusammensetzen ist Aufgabe eines Programms, das man den Linker (genauer: den Linkage Editor, zu deutsch: den Binder) nennt.

Er kopiert die 11 Dateien *.o zu einer einzigen zusammen - zu einer EXE oder einer DLL - und ersetzt dann darin jede relative Adresse durch eine absolute. 

Der Unterschied zwischen einer EXE und einer DLL ist einfach der, dass eine EXE die Programmwurzel darstellt: den Code also, der schon beim Aufruf des Programms in den Hauptspeicher geladen wird. Eine DLL dagegen enthält Ergänzungen (zusätzlichen Code also), die erst dazu geladen (d.h. in den Hauptspeicher geholt werden), wenn Bedarf dafür besteht. Auch dann wird - ohne dass der Anwender das merkt - der Linkage Editor aufgerufen, denn er muss ja aus in der DLL enthaltenen relativen Adressen absolute machen.

Nebenbei: Es ist nicht unbedingt so, dass alle ein Programm darstellenden Objektcode-Dateien *.o aus Dateien entstanden sein müssen, die in derselben Programmiersprache geschrieben wurden. Im Extremfall kann jede der Source-Dateien in einer anderen Programmiersprache geschrieben sein. 


grtgrt  15.06.2015, 19:14

Ein Programm in mehreren Übersetzungseinheiten realisiert zu haben hat mindestens den Vorteil, dass dann mehrere Personen zeitlich parallel an seiner Realisierung arbeiten können: Jede schreibt den Sourcecode zu nur einigen wenigen dieser Compilation Units.

Übersetzungseinheiten, die man immer wieder -- vor allem auch in unterschiedlichen Anwendungen gut gebrauchen kann, werden in sog. Code-Bibliotheken verwaltet (die dem Linker dann als Parameter mit genannt werden müssen).

Ein typisches Java oder .NET Programm etwa besteht zum weitaus größten Teil aus Code, der sich in Code-Bibliotheken findet, die schon der Hersteller der Programmierplattform erzeugt hat. 

1

Der Linker verknüpft etwas mit den dll . der compiler kompiliert den quelltext