Codegeneration (Bearbeiter)

In der Informatik ist Codegeneration der Prozess, durch den ein Codegenerator eines Bearbeiters etwas Zwischendarstellung des Quellcodes in eine Form umwandelt (z.B, Maschinencode), der durch eine Maschine (häufig ein Computer) sogleich durchgeführt werden kann.

Hoch entwickelte Bearbeiter führen normalerweise vielfache Pässe über verschiedene Zwischenformen durch. Dieser Mehrstufenprozess wird verwendet, weil viele Algorithmen für die Codeoptimierung leichter sind, einer nach dem anderen zu gelten, oder weil sich der Eingang zu einer Optimierung auf die durch eine andere Optimierung durchgeführte Verarbeitung verlässt. Diese Organisation erleichtert auch die Entwicklung eines einzelnen Bearbeiters, der vielfache Architekturen ins Visier nehmen kann, weil sich nur die letzte von den Codegenerationsstufen (der backend) vom Ziel bis Ziel ändern muss. (Für weitere Informationen über das Bearbeiter-Design, sieh Bearbeiter.)

Der Eingang zum Codegenerator besteht normalerweise aus einem Syntaxanalyse-Baum oder einem abstrakten Syntax-Baum. Der Baum wird in eine geradlinige Folge von Instruktionen gewöhnlich auf einer Zwischensprache wie drei Adresscode umgewandelt. Weitere Stufen der Kompilation können oder können "Codegeneration" je nachdem nicht genannt werden, ob sie eine bedeutende Änderung in der Darstellung des Programms einschließen. (Zum Beispiel würde ein Guckloch-Optimierungspass wahrscheinlich "Codegeneration" nicht genannt, obwohl ein Codegenerator einen Guckloch-Optimierungspass vereinigen könnte.)

Hauptaufgaben in der Codegeneration

Zusätzlich zur grundlegenden Konvertierung von einer Zwischendarstellung in eine geradlinige Folge von Maschineninstruktionen versucht ein typischer Codegenerator, den erzeugten Code irgendwie zu optimieren. Der Generator kann versuchen, schnellere Instruktionen zu verwenden, weniger Instruktionen zu verwenden, verfügbare Register auszunutzen, und überflüssige Berechnung zu vermeiden.

Aufgaben, die normalerweise ein Teil einer "" Generationscodephase eines hoch entwickelten Bearbeiters sind, schließen ein:

  • Instruktionsauswahl: Welche Instruktionen zu verwenden.
  • Instruktionsterminplanung: In der Ordnung, jene Instruktionen zu stellen. Terminplanung ist eine Geschwindigkeitsoptimierung, die eine kritische Wirkung auf pipelined Maschinen haben kann.
  • Register-Zuteilung: die Zuteilung von Variablen zu Verarbeiter-Registern.
Bei
  • Fehlersuchprogramm-Datenerzeugung auf Anfrage so der Code kann die Fehler beseitigt werden.

Instruktionsauswahl wird normalerweise durch das Tun eines rekursiven Postordnungstraversals auf dem abstrakten Syntax-Baum, das Zusammenbringen besonderer Baumkonfigurationen gegen Schablonen ausgeführt; zum Beispiel könnte der Baum in eine geradlinige Folge von Instruktionen durch das rekursive Erzeugen der Folgen für und, und dann das Ausstrahlen der Instruktion umgestaltet werden.

In einem Bearbeiter, der eine Zwischensprache verwendet, kann es zwei Instruktionsauswahl-Stufen - ein geben, um den Syntaxanalyse-Baum in den Zwischencode und eine zweite Phase viel später umzuwandeln, um den Zwischencode in Instruktionen vom Befehlssatz der Zielmaschine umzuwandeln. Diese zweite Phase verlangt kein Baumtraversal; es kann geradlinig getan werden, und schließt normalerweise einen einfachen Ersatz von zwischensprachigen Operationen mit ihrem entsprechenden opcodes ein. Jedoch, wenn der Bearbeiter wirklich ein Sprachübersetzer ist (zum Beispiel, derjenige, der Eiffel zu C umwandelt) dann kann die zweite Codegenerierungsphase Gebäude eines Baums aus dem geradlinigen Zwischencode einschließen.

Laufzeitcodegeneration

Wenn Codegeneration an der Durchlaufzeit, als in gerade rechtzeitig der Kompilation (JIT) vorkommt, ist es wichtig, dass der komplette Prozess in Bezug auf die Zeit und Raum effizient ist. Zum Beispiel, wenn regelmäßige Ausdrücke interpretiert und verwendet werden, um Code an der Durchlaufzeit zu erzeugen, wird eine non-determistic Zustandsmaschine häufig statt einer deterministischen erzeugt, weil gewöhnlich der erstere schneller geschaffen werden kann und weniger Speicherraum besetzt als die Letzteren. Trotz seines allgemein erzeugenden weniger effizienten Codes kann JIT Codegeneration die Kopierfräsinformation ausnutzen, die nur an der Durchlaufzeit verfügbar ist.

Zusammenhängende Konzepte

Die grundsätzliche Aufgabe, Eingang auf einer Sprache zu nehmen und Produktion auf einer nichttrivial verschiedenen Sprache zu erzeugen, kann in Bezug auf die Kerntransformationsoperationen der formellen Sprachtheorie verstanden werden. Folglich sind einige Techniken, die für den Gebrauch in Bearbeitern ursprünglich entwickelt wurden, gekommen, um auf andere Weisen ebenso verwendet zu werden. Zum Beispiel nimmt YACC (und doch ein Anderer Bearbeiter-Bearbeiter) Eingang in der Backus-Naur-Form und wandelt es zu einem parser in C um. Obwohl es für die automatische Generation eines parser für einen Bearbeiter ursprünglich geschaffen wurde, wird yacc auch häufig verwendet, um Schreiben-Code zu automatisieren, der jedes Mal modifiziert werden muss, wenn Spezifizierungen geändert werden. (Sieh zum Beispiel http://www.artima.com/weblogs/viewpost.jsp?thread=152273.)

Viele einheitliche Entwicklungsumgebungen (IDEN) unterstützen eine Form der automatischen Quellcodegeneration häufig mit Algorithmen genau wie Bearbeiter-Codegeneratoren, obwohl allgemein weniger kompliziert. (Siehe auch: Programm-Transformation, Datentransformation.)

Nachdenken

Im Allgemeinen versuchen eine Syntax und semantischer Analysator, die Struktur des Programms aus dem Quellcode wiederzubekommen, während ein Codegenerator diese Strukturinformation (z.B, Datentypen) verwendet, um Code zu erzeugen. Mit anderen Worten fügt der erstere Information hinzu, während der Letztere etwas von der Information verliert. Eine Folge dieses Informationsverlustes ist, dass Nachdenken schwierig oder sogar unmöglich wird. Um dieses Problem zu entgegnen, betten Codegeneratoren häufig syntaktische und semantische Information zusätzlich zum für die Ausführung notwendigen Code ein.

Siehe auch

  • Vergleich von Codegenerationswerkzeugen

Puja (Hinduismus) / Surfbrett
Impressum & Datenschutz