Mathias Diwo

Was ist ein Compiler?

Ein Compiler ist ein Computerprogramm, welches den in einer Hochsprache geschriebenen Quellcode in eine Maschinensprache auf niedriger Ebene umwandelt. Er übersetzt den Code einer Programmiersprache in eine andere Sprache, ohne die Bedeutung des Codes zu verändern. Darüber hinaus optimiert der Compiler den Endcode hinsichtlich Ausführungszeit und Speicherplatz.

Der Kompilierungsprozess umfasst grundlegende Übersetzungsmechanismen und Fehlererkennung. Der Compilerprozess durchläuft am Frontend eine lexikalische, syntaktische und semantische Analyse, sowie am Backend eine Codegenerierung und -optimierung.

Funktionen von Compilern

  • Gewährleistung der Korrektheit
  • Schnelligkeit der Kompilierung
  • Erhaltung der korrekten Bedeutung des Codes
  • Optimierung der Geschwindigkeit des Zielcodes
  • Erkennung legaler und illegaler Programmkonstrukte
  • Gute Fehlerberichterstattung und -behandlung
  • Unterstützung beim Debugging des Codes

Arten von Compilern

Es gibt verschiedene Arten von Compilern:

  • Single-Pass-Compiler
  • Two-Pass-Compiler
  • Multipass-Compiler

Single-Pass-Compiler:

Ein Single-Pass-Compiler wandelt den Compiler-Quellcode direkt in Maschinencode um. Ein Beispiel hierfür ist die Pascal-Sprache.

Two-Pass-Compiler:

Ein Two-Pass-Compiler ist in zwei Abschnitte unterteilt:

  • Frontend: Hier wird der Quellcode der Intermediate Representation (IR) zugeordnet.
  • Backend: Hier wird die IR dem Zielcomputer zugeordnet.

Die Two-Pass-Compiler-Methode vereinfacht auch den Retargeting-Prozess und ermöglicht mehrere Frontends.

Multipass-Compiler

Ein Multipass-Compiler verarbeitet den Quellcode oder den Syntaxbaum eines Programms mehrmals. Es unterteilt ein großes Programm in mehrere kleine Programme und verarbeitet diese. Dabei werden mehrere Zwischencodes erstellt. Alle diese Multipass-Vorgänge verwenden die Ausgabe der vorherigen Phase als Eingabe. Dadurch wird weniger Speicher benötigt. Ein Multipass-Compiler wird auch als „Wide Compiler“ bezeichnet.

Aufgaben des Compilers:

Die Hauptaufgaben des Compilers sind:

  • Zerlegung des Quellprogramms in Teile und Zuordnung einer grammatikalischen Struktur
  • Konstruktion des gewünschten Zielprogramms aus der Zwischendarstellung und Erstellung der Symboltabelle
  • Kompilierung des Quellcodes und Erkennung von Fehlern
  • Verwaltung der Speicherung aller Variablen und Codes
  • Unterstützung für separate Kompilierung
  • Lesen und Analyse des gesamten Programms und Übersetzung in semantisch Äquivalentes
  • Übersetzung des Quellcodes in Objektcode, je nach Maschinentyp

Geschichte des Compilers:

Ein wichtiger Meilenstein in der Geschichte des Compilers ist wie folgt:

  • Das Wort „Compiler“ wurde erstmals in den frühen 1950er Jahren von Grace Murray Hopper verwendet.
  • Der erste Compiler wurde von John Backus und seiner Gruppe zwischen 1954 und 1957 bei IBM entwickelt.
  • COBOL war die erste Programmiersprache, die 1960 auf verschiedenen Plattformen kompiliert wurde.
  • Die Untersuchung von Scan- und Parsing-Problemen wurde in den 1960er und 1970er Jahren fortgesetzt, um eine vollständige Lösung bereitzustellen.

Schritte für Sprachverarbeitungssysteme:

Um das Konzept des Compilers zu verstehen, müssen zunächst einige andere Tools verstanden werden, die mit Compilern zusammenarbeiten.

Präprozessor: Der Präprozessor wird als Teil des Compilers betrachtet. Er erzeugt Eingaben für den Compiler und befasst sich mit Makroverarbeitung, Erweiterungen, Spracherweiterungen usw.

Interpreter: Ein Interpreter ist ähnlich wie ein Compiler, übersetzt jedoch Hochsprache Zeile für Zeile in Maschinensprache auf niedriger Ebene. Der Hauptunterschied besteht darin, dass der Interpreter den Code Zeile für Zeile liest und transformiert, während der Compiler den gesamten Code auf einmal liest und den Maschinencode erstellt.

Assembler: Der Assembler übersetzt Assemblercode in maschinenverständliche Sprache. Das Ausgabeergebnis des Assemblers wird als Objektdatei bezeichnet, welche eine Kombination aus Maschinenanweisungen und den zum Speichern dieser Anweisungen im Speicher erforderlichen Daten darstellt.

Linker: Der Linker hilft dabei, verschiedene Objektdateien zu verknüpfen und zusammenzuführen, um eine ausführbare Datei zu erstellen. Diese Dateien wurden möglicherweise mit separaten Assemblern kompiliert. Die Hauptaufgabe des Linkers besteht darin, nach aufgerufenen Modulen in einem Programm zu suchen und den Speicherort herauszufinden, an dem alle Module gespeichert sind.

Loader: Der Loader ist ein Teil des Betriebssystems, der dafür zuständig ist, ausführbare Dateien in den Speicher zu laden und auszuführen. Außerdem berechnet er die Größe eines Programms, wodurch zusätzlicher Speicherplatz entsteht.

Cross-Compiler: Ein Cross-Compiler ist eine Plattform im Compilerdesign, die es ermöglicht, ausführbaren Code zu generieren.

Source-to-Source-Compiler: Ein Source-to-Source-Compiler wird verwendet, wenn der Quellcode einer Programmiersprache in den Quellcode einer anderen Sprache übersetzt wird.

Compiler-Konstruktionswerkzeuge wurden eingeführt, als sich computerbezogene Technologien weltweit verbreiteten. Sie werden auch als Compiler-Compiler oder Übersetzer bezeichnet. Diese Tools verwenden eine bestimmte Sprache oder einen bestimmten Algorithmus zur Spezifizierung und Implementierung der Komponente des Compilers.

Beispiele für Compiler-Konstruktionswerkzeuge sind Scannergeneratoren, syntaxgesteuerte Übersetzungsmaschinen, Parsergeneratoren, automatische Codegeneratoren und Datenflussengines.

Warum einen Compiler verwenden?

Es gibt verschiedene Gründe, einen Compiler zu verwenden:

  • Der Compiler überprüft das gesamte Programm, sodass keine Syntax- oder Semantikfehler auftreten.
  • Die ausführbare Datei wird vom Compiler optimiert, sodass sie schneller ausgeführt wird.
  • Er ermöglicht die Erstellung einer internen Struktur im Speicher.
  • Es ist nicht erforderlich, das Programm auf demselben Computer auszuführen, auf dem es erstellt wurde.
  • Das gesamte Programm kann in eine andere Sprache übersetzt werden.
  • Es können Dateien auf der Festplatte generiert werden.
  • Dateien können in einem ausführbaren Format verknüpft werden.
  • Syntaxfehler und Datentypen können überprüft werden.
  • Es hilft dabei, das Verständnis der Sprachsemantik zu verbessern.
  • Es hilft bei der Bewältigung von Leistungsproblemen in der Programmiersprache.
  • Es bietet die Möglichkeit für ein nicht triviales Programmierprojekt.
  • Die beim Erstellen eines Compilers verwendeten Techniken können auch für andere Zwecke nützlich sein.

Anwendung von Compilern:

Das Compilerdesign unterstützt die vollständige Implementierung von High-Level-Programmiersprachen. Es unterstützt auch die Optimierung der Parallelität 

der Computerarchitektur und den Entwurf neuer Speicherhierarchien. Compiler werden häufig zum Übersetzen von Programmen verwendet und in Kombination mit anderen Software-Produktivitätstools eingesetzt.

Zusammenfassung:

Ein Compiler ist ein Computerprogramm, das den in einer Hochsprache geschriebenen Quellcode in eine Maschinensprache auf niedriger Ebene umwandelt. Korrektheit, Geschwindigkeit der Kompilierung und die Wahrung der korrekten Bedeutung des Codes sind einige wichtige Merkmale des Compiler-Designs. Compiler sind in drei Teile unterteilt: 1) Single-Pass-Compiler, 2) Two-Pass-Compiler und 3) Multipass-Compiler. Der Begriff „Compiler“ wurde erstmals in den frühen 1950er Jahren von Grace Murray Hopper verwendet.

Schritte für das Sprachverarbeitungssystem sind: Präprozessor, Interpreter, Assembler, Linker/Loader. Wichtige Compiler-Konstruktionswerkzeuge sind 1) Scannergeneratoren, 2) Syntaxgesteuerte Übersetzungsmaschinen, 3) Parsergeneratoren, 4) Automatische Codegeneratoren. Die Hauptaufgabe des Compilers besteht darin, das gesamte Programm zu überprüfen, damit keine Syntax- oder Semantikfehler auftreten.

{"email":"Email address invalid","url":"Website address invalid","required":"Required field missing"}