Wie programmiert man Compiler?

...komplette Frage anzeigen

3 Antworten

Da gibt es verschiedene Ebenen.

Auf unterster Ebene die Umsetzung von winzigen Standard-Algorithmen in Maschinenbefehle, auf oberster Ebene die kleinen Nervigkeiten, mit denen wir Programmierer uns Tag für Tag herumschlagen.

Jeder der zahlreichen Entwickler an einem Compiler beschäftigt sich nur mit ein paar dieser Ebenen. Nur die an den untersten Ebenen müssen wirklich die Maschinensprache kennen.

Jeder Schritt zwischen zwei Ebenen macht aus einem etwas weniger umfangreichen etwas abstrakterem Code einen etwas umfangreicheren etwas konkreteren Code. (im allgemeinen.) 

Ein ganz primitives Beispiel:

for(initialization; test; increment)
 body;

wird umgesetzt in

initialization;
while(test) {
body;
increment;
}

Die hohe Kunst besteht nicht darin, einen Quellcode in Maschinencode zu übersetzen, sondern in den zahlreichen Optimierungen (auf jeder Ebene) darin. (Wenn du dir allein schon "Pipelining" im Zusammenhang mit Prozessoren und die zugehörigen Fallstricke anschaust, wird dir schwindelig.)

Ich hab mal in der Uni-Bibliothek in einem ca. 1000-seitigen Buch zum Thema Compilerbau geblättert. Um an einem professionellen Compiler mitarbeiten zu können, braucht man offensichtlich jahrelange Erfahrung..

Nun ja, der Maschinencode selbst wird meist im (schon erwähnten) Assembler geschrieben.

Im Assembler wird zwar 1:1 der Prozessor programmiert, aber für die einzelnen Maschinenbefehle gibt es symbolische Namen, z.B."MOV" (Move=Verschieben) statt "001100110010111". Auch Adressen kann man einfach anhand des Namens eines Datenfeldes eingeben, anstatt die Adresse selbst auszurechnen. Man "MOV"t also in Feld "LAENGE" und nicht an Adresse 0101100010001100. Der Assembler (das gleichnamige Programm) muss natürlich auch geschrieben werden, ist ja auch eine Art Compiler.

Ob nun ein Compiler direkt Maschinencode erzeugt oder zuerst Assembler, ist Geschmackssache. Jedenfalls muss man Arbeitsweise und Möglichkeiten des Prozessors kennen.

Es gibt auch die Möglichkeit, Code in einer "höheren" Programmiersprache wie C zu erzeugen. Höher ist in diesem Fall relativ, C ist ja schon recht maschinennah.

In jedem Fall braucht man am Ende einen, der den Masachinencode kennt, aber der muss man nicht selbst sein, man muss ihn auch nicht selbst kennen.

Zum Programmieren eines compilers verwendet man eine zum Prozessor verfügbare höhere Programmiersprache, wie c+ oder Java. Nur der Hersteller braucht Leute, die bis zum Maschinen Code(Assembler) runter steigen.

weckmannu 01.07.2017, 18:55

PS

Seit Bestehen von Unix gibt es dort Tools, mit denen neue Sprachen generiert werden können.

0

Was möchtest Du wissen?