Definition

Compiler (Kompilierer)

Was ist ein Compiler (Kompilierer)?

Ein Compiler (Kompilierer) ist ein spezielles Programm, das den Quellcode einer Programmiersprache in Maschinencode, Bytecode oder eine andere Programmiersprache übersetzt. Der Quellcode ist in der Regel in einer für Menschen lesbaren Hochsprache wie Java oder C++ geschrieben. Ein Programmierer schreibt den Quellcode in einem Code-Editor oder einer integrierten Entwicklungsumgebung (IDE), die einen Editor enthält, und speichert den Quellcode in einer oder mehreren Textdateien. Ein Compiler, der die Quellprogrammiersprache unterstützt, liest die Dateien, analysiert den Code und übersetzt ihn in ein für die Zielplattform geeignetes Format.

Compiler, die Quellcode in Maschinencode übersetzen, sind auf bestimmte Betriebssysteme und Computerarchitekturen ausgerichtet. Diese Art der Ausgabe wird manchmal auch als Objektcode bezeichnet (was nichts mit objektorientierter Programmierung zu tun hat). Der ausgegebene Maschinencode besteht vollständig aus binären Bits – 1en und 0en – so dass ihn die Prozessoren auf den Zielcomputern lesen und ausführen kann. Ein Compiler kann zum Beispiel Maschinencode für die Linux x64-Plattform oder die Linux ARM 64-Bit-Plattform ausgeben.

Einige Compiler können Quellcode statt in Maschinencode auch in Bytecode übersetzen. Bytecode, der erstmals in der Programmiersprache Java eingeführt wurde, ist eine Zwischensprache, die auf jeder Systemplattform ausgeführt werden kann, auf der eine Java Virtual Machine (JVM) oder ein Bytecode-Interpreter läuft. Die JVM oder der Interpreter wandelt den Bytecode in Anweisungen um, die der Hardwareprozessor versteht und ausführt. Eine JVM ermöglicht es, den Bytecode durch einen Just-in-Time-Compiler neu zu kompilieren.

Einige Compiler können Quellcode in eine andere höhere Programmiersprache übersetzen, statt in Maschinencode oder Bytecode. Diese Art von Compiler wird als Transpiler, Transcompiler, Source-to-Source-Übersetzer oder anderweitig bezeichnet. So kann ein Entwickler beispielsweise einen Transpiler verwenden, um COBOL in Java zu konvertieren.

Unabhängig von der Ausgangssprache muss ein Compiler sicherstellen, dass die Logik des Ausgabecodes immer mit der des Eingabecodes übereinstimmt und dass bei der Konvertierung des Codes nichts verloren geht. Ein Compiler ist im engeren Sinne ein Übersetzer und muss sicherstellen, dass die Ausgabe korrekt ist und die ursprüngliche Logik beibehält.

Wie funktioniert ein Compiler?

Compiler unterscheiden sich in den Methoden, die sie zur Analyse und Umwandeln von Quellcode in Ausgabecode verwenden. Ihnen ist aber meistens gemein, dass sie folgende Schritte ausführen:

  • Lexikalische Analyse. Der Compiler zerlegt den Quellcode in Lexeme, das heißt einzelne Codefragmente, die bestimmte Muster im Code darstellen. Die Lexeme werden zur Vorbereitung der syntaktischen und semantischen Analyse in Token umgewandelt.
  • Syntax-Analyse. Der Compiler prüft, ob die Syntax des Codes auf der Grundlage der Regeln für die Ausgangssprache korrekt ist. Dieser Vorgang wird auch als Parsing bezeichnet. In diesem Schritt erstellt der Compiler in der Regel abstrakte Syntaxbäume, die die logischen Strukturen bestimmter Codeelemente darstellen.
  • Semantische Analyse. Der Compiler überprüft die Gültigkeit der Logik des Codes. Dieser Schritt geht über die Syntaxanalyse hinaus, indem er die Genauigkeit des Codes validiert. Bei der semantischen Analyse wird zum Beispiel geprüft, ob den Variablen die richtigen Typen zugewiesen wurden oder ob sie richtig deklariert wurden.
  • IR-Code-Generierung. Nachdem der Code alle drei Analysephasen durchlaufen hat, erzeugt der Compiler eine Zwischendarstellung (Intermediate Representation, IR) des Quellcodes. Der IR-Code erleichtert die Übersetzung des Quellcodes in ein anderes Format. Er muss jedoch den Quellcode in jeder Hinsicht genau darstellen, ohne Funktionen auszulassen.
  • Optimierung. Der Compiler optimiert den IR-Code in Vorbereitung auf die endgültige Codegenerierung. Art und Umfang der Optimierung hängen vom jeweiligen Compiler ab. Bei einigen Compilern kann der Benutzer den Grad der Optimierung konfigurieren.
  • Erzeugen des Ausgabecodes. Der Compiler generiert den endgültigen Ausgabecode unter Verwendung des optimierten IR-Codes.
Abbildung 1: Das Diagramm zeigt die sechs Schritte, die ein Compiler absolviert.
Abbildung 1: Das Diagramm zeigt die sechs Schritte, die ein Compiler absolviert.

Compiler werden manchmal mit Programmen verwechselt, die Interpreter genannt werden. Die beiden unterscheiden sich jedoch in wichtigen Punkten. Compiler analysieren und konvertieren Quellcode, der in Sprachen wie Java, C++, C# oder Swift geschrieben wurde. Sie werden in der Regel verwendet, um Maschinencode oder Bytecode zu erzeugen, den das Zielsystem verarbeiten kann.

Interpreter erzeugen weder IR-Code noch speichern sie den erzeugten Maschinencode. Sie verarbeiten den Code zur Laufzeit anweisungsweise, ohne den Code vorher zu konvertieren oder ihn für eine bestimmte Plattform vorzubereiten. Interpreter werden für Code verwendet, der in Skriptsprachen wie Perl, PHP, Ruby oder Python geschrieben wurde.

Diese Definition wurde zuletzt im Mai 2024 aktualisiert

Erfahren Sie mehr über Softwareentwicklung