# PL0-Compiler - Linearisierung des Zwischencodes

- Einführung
- Scanner und Parser
- Die Symboltabelle
- Übersetzung in Zwischencode
- Linearisierung des Zwischencodes
  - Vorbetrachtungen
  - Linearisierung
- Optimierung des Zwischencodes
- Das Linux-Backend
- Der Interpreter
- Downloads und Informationen

## Vorbetrachtungen

Wird ein zu compilierendes Programm in eine Zwischensprache überführt, so wird diese in einem ersten Schritt intern als Baumstruktur repräsentiert. Dadurch sind bestehende Programmabhängigkeiten auf einfachste Art und Weise zu erkennen, da diese als Unteräste im Zwischencode-Baum des betreffenden Baumknotens zu finden sind. So müssen z.B. bei einer simplen Aufgabe, wie Addition zweier Zahlen, die Operanden einer Operation aus dem Speicherbereich der Applikation geladen werden, bevor sie gemeinsam in einer Alu miteinander verarbeitet werden können. Zur Verdeutlichung siehe dazu Abbildung 5.1, mit nachfolgend geschachtelt dargestellter Textform.

    MOVE(MEM(+(TEMP(Temp fp), CONST(12))), +(CONST(3), CONST(4)))

Abbildung 5.1: Baumdarstellung des Zwischencodes

Soll dieser Code auf einer Neuman-Architektur abgearbeitet werden, stellt die interne Repräsentation in einer Baumstruktur ein Problem dar, da ein solches Programm nur schwer, mit Hilfe von Traversierung, sequentiell ausgeführt werden kann. Anders würde es bei einer Datenfluss-Architektur aussehen, doch diese sind, wie weithin bekannt, immer nur Spezial-Architekturen und nicht Gegenstand des Hauptseminares. Aus diesem Grund geschieht die Linearisierung des Zwischencodes als ein Schritt von vielen innerhalb des Compilers.

## Linearisierung

Allgemein betrachtet, ist es bei der Linearisierung notwendig, die geschachtelten Ausdrücke der Zwischensprache in der richtigen Reihenfolge aufzulösen. Dies geschieht durch Traversierung der gegebenen Baumstruktur nach dem rechter-, linker-, Wurzel-Knoten Prinzip. Da die Wurzelknoten die Ergebnisse ihrer Kindknoten in der geschachtelten Schreibweise implizit vorfinden, diese syntaktische Abhängigkeit jedoch bei der Linearisierung verloren geht, müssen an die entsprechenden stellen temporäre Variablen gesetzt werden, welche an die entsprechenden Ergebnisse der repräsentierenden Kindknoten gebunden werden. Siehe dazu nachfolgende Skizzen:

Abbildung 5.2: MOVE(x, BINOP(+, 1, 2))

    BINOP(+, temp, 1, 2)
    MOVE(x, temp)

Übersetzung in Zwischencode | Optimierung des Zwischencodes