Studium, Ausbildung und Beruf

web uni-protokolle.de
 powered by
NachrichtenLexikonProtokolleBücherForenDienstag, 23. Juli 2019 

Compiler


Dieser Artikel von Wikipedia ist u.U. veraltet. Die neue Version gibt es hier.
Ein Compiler (auch Kompilierer oder Übersetzer ) ist ein Computerprogramm das ein in einer Quellsprache geschriebenes in ein semantisch äquivalentes Programm einer Zielsprache umwandelt. Üblicherweise es sich dabei um die Übersetzung eines einem Programmierer in einer Programmiersprache geschriebenen Quelltextes in Assemblersprache oder Maschinensprache .

Der Compilerbau also die Programmierung eines Compilers ist eigenständige Disziplin innerhalb der Informatik .

Die Bezeichnungen Compiler oder Kompilierer sind eigentlich irreführend weil sie von Zusammenstellung von Tabellen herrühren die der Compiler für seine Datenverwaltung benötigt was aber an Kernaufgabe eines Compilers vorbeigeht.

Verwandt mit einem Compiler ist ein Interpreter der ein Programm nicht in die übersetzt sondern Schritt für Schritt direkt ausführt.

Inhaltsverzeichnis

Aufbau eines Compilers

Es lassen sich im Wesentlichen zwei unterscheiden: eine Analysephase die den Quelltext analysiert und daraus Syntaxbaum erzeugt sowie die Synthesephase die daraus das Zielprogramm erzeugt.

Analysephase (auch "Frontend")

Lexikalische Analyse

Die lexikalische Analyse zerteilt den eingelesenen Quelltext in Token verschiedener Klassen z.B. Schlüsselwörter Bezeichner Zahlen und Operatoren . Dieser Teil des Compilers heißt Scanner oder Lexer.

Ein Scanner benutzt gelegentlich einen separaten Screener um Whitespace ( Leerraum also Leerzeichen Zeilenenden usw.) und Kommentare zu überspringen.

Syntaktische Analyse

Die syntaktische Analyse überprüft ob der Quellcode formal richtig ist d.h. der Syntax (Grammatik) der Quellsprache entspricht. Dabei wird Eingabe in einen Syntaxbaum umgewandelt. Dieser Teil auch als Parser bezeichnet.

Semantische Analyse

Die semantische Analyse überprüft die statische Semantik also "logische Rahmenbedingungen". Zum Beispiel muss Variable deklariert worden sein bevor sie verwendet und Zuweisungen müssen mit ihrem Datentyp kompatibel (verträglich) sein.

Synthesephase (auch "Backend")

Die Synthesephase erzeugt aus dem in Analysephase erstellten Baum den Programmcode der Zielsprache.

Programmoptimierung

siehe unten.

Codegenerierung

Bei der Codegenerierung wird endgültig aus Syntaxbaum Programmcode in der Zielsprache erzeugt. Falls Zielsprache die Maschinensprache ist kann das Ergebnis ein ausführbares Programm sein oder eine so Objektdatei die durch das Linken mit weiteren Objektdateien zu einer Bibliothek oder einem ausführbaren Programm führt.

Programmoptimierung

Üblicherweise bietet ein Compiler Optionen für Optimierungen mit dem Ziel die Laufzeit oder den Speicherbedarf des Zielprogramms zu

Die Optimierung erfolgt in Abhängigkeit von Eigenschaften der Hardware insbesondere wieviele Register der Prozessor des Computers zur Verfügung stellt.

Einige Optimierungen führen dazu dass der Programmkonstrukte in semantisch äquivalente aber günstigere Konstrukte die keine Entsprechung im Quellcode haben. Eine ist dass es bei Aktivierung entsprechender Optimierungen noch möglich ist den Programmablauf mit einem Debugger zu verfolgen.

Im Folgenden betrachten wir einige Optimierungsmöglichkeiten eines Compilers . Dabei handelt es sich naturgemäß nur Feinabstimmung an einem bestehenden Programm. "Optimierung" bedeutet nicht dass das Programm danach in irgendeiner optimal wäre nur besser. Es ist auch dass das Programm nachher "totoptimiert" ist also Optimierung über das Ziel soweit hinausgeschossen ist das Programm effektiv langsamer ausgeführt wird. Viele moderner Compiler sind solche Abwägungen zwischen dem möglich ist und dem was sinnvoll ist. Grenze zwischen beiden ist meist nicht klar und muss durch Tests herausgefunden werden.

Es sollte nicht vergessen werden dass oft darin besteht den Algorithmus selbst zu bzw. durch einen besseren zu ersetzen.

Reduzierung von Assemblerinstruktionen

Wenn man zum Beispiel in einer Programmiersprache den Inhalt von 2 Variablen vertauscht benötigt man eine Hilfsvariable:

Reduzierung von Assemblerinstruktionen
höhere
Programmiersprache
Assembler ohne Optimierung Assembler mit Optimierung
t = a
a --> Register 1
Register 1 --> t
a --> Register 1
a = b
b --> Register 2
Register 2 --> a
b --> Register 2
b = t
t --> Register 3
Register 3 --> b
Register 1 --> b
Register 2 --> a

Mit Optimierung benötigt man nur 4 anstatt 6 außerdem wird der Speicherplatz für Hilfsvariable t nicht gebraucht. D.h. diese Vertauschung wird ausgeführt und benötigt weniger Hauptspeicher .

Formelauswertung bereits bei der Kompilierung

Die Berechnung des Kreisumfangs mittels

 pi = 3.14 u = 2 pi * r  
optimiert der Compiler zu "u = * r". Die Multiplikation "2 * pi" während der Übersetzung ausgeführt und reduziert so Laufzeit.

Eliminierung toten Programmcodes

Wenn der Compiler erkennen kann dass Teil des Programmes niemals durchlaufen wird dann er diesen Teil bei der Übersetzung weg.

 Beispiel: ... goto 900 200 k=3 i=7 ...  
Wenn in diesem Programm niemals ein auf das Label 200 erfolgt dann kann die Anweisung "200 k=3" verzichtet werden.

Erkennung von nicht benötigten Variablen

Wird eine Variable nicht benötigt dann sie auch nicht berechnet.

 Beispiel: subroutine test (a b) b 2 * a c = 3.14 * return  
Hier wird die Variable c nicht Sie steht nicht in der Parameterliste wird in späteren Berechnungen nicht verwendet wird auch nicht ausgegeben. Deshalb entfällt die "c = 3.14 * b".

Optimierung von Schleifen

Insbesondere Schleifen versucht man zu optimieren indem man

  • möglichst viele Variablen in Registern hält die Schleifenvariable)
  • Berechnungen innerhalb der Schleife die in Durchlauf das selbe ergeben nur einmal berechnet
  • die Schleife komplett auflöst (englisch loop unrolling ) falls die Anzahl der Schleifendurchläufe konstant Die Anweisungen innerhalb der Schleife werden dann (hintereinander) ausgeführt ohne Verwendung einer Schleife.

Reduzierung von Paging zur Laufzeit

Zusammenhängender Code - z.B. eine Schleife sollte zur Laufzeit möglichst auf einer Page Hauptspeicher liegen. Dies kann man evtl. dadurch dass man dem Programmcode geeignete Leeranweisungen ("NOPs" N o OP eration) hinzufügt. Dadurch wird der Programmcode zwar aber wegen des reduzierten Pagings wird das schneller ausgeführt.

  

Bedeutende Compiler

oder auch viele andere die zusammen IDEs ausgeliefert werden (Visual Basic Delphi etc.)...



Bücher zum Thema Compiler

Dieser Artikel von Wikipedia unterliegt der GNU FDL.

ImpressumLesezeichen setzenSeite versendenSeite drucken

HTML-Code zum Verweis auf diese Seite:
<a href="http://www.uni-protokolle.de/Lexikon/Compiler.html">Compiler </a>