Der Compiler: Welche Aufgabe hat er?

Ein Compiler dient dazu, einen in einer Programmiersprache geschriebenen Code in eine maschinenlesbare Form zu übertragen. Er stellt somit eine Art Übersetzer zwischen einem Softwareentwickler und einem Computer dar. Praktisch besteht er aus einer Sammlung von Programmen, die verschiedene Aufgaben oder Zwischenschritte übernehmen. In den meisten Fällen unterliegt er einer Open Source Lizenz, so dass Compiler kostenlos verwendet, individuell angepasst und frei verbreitet werden können.

Wie arbeitet ein Compiler?

Der Compiler schreibt als Übersetzer aus einem Source Code ein ausführbares Programm. Er kommt meist bei einer der sogenannten „hohen“ Programmiersprachen wie C, C++, Visual Basic .NET oder teilweise in Java zum Einsatz und wandelt Befehle in einen von der Umgebung abhängigen Maschinencode um. Dieser besteht aus sehr abstrakten Rechenschritten, die per Hand extrem zeit- und arbeitsintensiv zu schreiben wären und ausgesprochen umfangreiche Fachkenntnisse voraussetzen.

Nach seinem Start interpretiert der Compiler den Source Code Zeile für Zeile und erstellt daraus schrittweise eine lauffähige Software, die nicht mehr als Text, sondern als hexadezimale Anweisungen vorliegt. Dieses Vorgehen besitzt mehrere Vorteile wie zum Beispiel eine deutlich schnellere Ausführung und eine Verschleierung (Obfuscation) von Abläufen und Routinen, um etwa eine ungenehmigte Verwendung des Quellcodes zu verhindern oder einen sicheren Kopierschutz zu implementieren.

Welche Aufgaben übernimmt der Compiler?

Neben seiner primären Funktion als Übersetzer dient der Compiler zahlreichen weiteren Zwecken, die das Programmieren erleichtern und unter anderem die Möglichkeiten einer Programmiersprache erweitern. Wesentliche Merkmale populärer Lösungen wie gcc oder g++ umfassen beispielsweise:

  • Kontrolle des Quellcodes auf fehlerhafte oder fehlende Routinen
  • Überprüfung von Variablen auf ihre Deklarierung und zulässige Vergleiche
  • Hinweise auf die Verwendung veralteter oder in Zukunft obsoleter Befehle
  • Einbindung fremder Bibliotheken und Auflösung von Abhängigkeiten zwischen ihnen
  • Optimierung der Programme auf Speicherverbrauch und Performance
  • Fehlermeldung bei einer versehentlich mehrfachen Verwendung von Namen oder Bezeichnungen
  • Einbindung von Werkzeugen oder erweiterten Logs für das Debugging
  • Kompilieren von Programmen für andere, fremde Umgebungen wie leistungsschwache Prozessoren

Indem der Nutzer bestimmte Parameter (Flags) setzt oder deaktiviert, lassen sich Compiler bei ihrer Arbeit nach persönlichen Bedürfnissen und dem angestrebten Ziel auf vielfältige Weisen individualisieren. Viele integrierte Entwicklungsumgebungen (IDE) betten sie in ihre Oberfläche ein und erlauben eine gezielte Konfiguration oder das Kompilieren von Programmen für spezialisierte Systeme wie Embedded Computer und Mikroprozessoren.

Was sind die Unterschiede zwischen einem Compiler und einem Interpreter?

Sowohl der Compiler wie der Interpreter sind Übersetzer. Sie unterscheiden sich jedoch deutlich in ihrer Arbeitsweise: Durch das Kompilieren entsteht ein eigenständig lauffähiges Programm, das allerdings auf zusätzliche Dateien – beispielsweise Software-Bibliotheken oder in Klartext geschriebene Konfigurationen – angewiesen sein kann. Ein Entschlüsseln des ursprünglichen Quellcodes gestaltet sich als sehr schwierig bis unmöglich.

Bei einem Interpreter arbeiten Programme hingegen in einer im Hintergrund laufenden Umgebung, die je nach Programmiersprache einen bestimmten Befehlssatz in einer festen Struktur zur Verfügung stellt. Ein Source Code wird hier nicht dauerhaft übersetzt, sondern während des Ausführens in Echtzeit „interpretiert“ und in Maschinensprache umgeschrieben.

In die reale Welt übertragen, ließe sich der Unterschied folgendermaßen beschreiben: Ein Compiler arbeitet wie ein klassischer Übersetzer, nach dessen Arbeit kein direkter Rückschluss auf den Ursprung mehr möglich ist. Gleichzeitig muss das Ziel die Übersetzung verstehen können, so dass kompilierte Programme grundsätzlich bestimmte Rahmenbedingungen voraussetzen.

Der Interpreter entspricht hingegen einem Simultan-Dolmetscher, der permanent anwesend ist und zwischen Source Code und unterschiedlichen Betriebssystemen kommunizieren kann. Typische Beispiele für interpretierte Programmiersprachen sind etwa Shell-Skripte für Server mit Windows oder Linux, PHP, Python und Perl.