Als die Informatik noch in Nullen und Einsen gefangen war, schufen Pioniere wie Grace Hopper und John Backus die ersten Compiler, die menschliche Logik in Maschinencode verwandeln. Doch wie entstand das Fundament, ohne das die Welt inzwischen stillstehen würde?
Abstraktion statt Maschinencode: Wie automatische Übersetzer die Programmierung revolutionierten.
(Bild: Dall-E / KI-generiert)
Wer heute ein Programm schreibt, denkt in Funktionen, Variablen, Objekten, Algorithmen oder Datenstrukturen. Ein Entwickler formuliert, was ein System tun soll, und überlässt die konkrete Umsetzung weitgehend den Werkzeugen der Softwareentwicklung. Dass zwischen einem in C++, Rust oder Python geschriebenen Programm und den elektrischen Schaltvorgängen in einem Prozessor eine enorme Übersetzungsleistung liegt, gerät dabei leicht in Vergessenheit. Ohne Compiler wäre Softwareentwicklung bis heute eng an die jeweilige Hardware gebunden. Die Geschichte der Compiler ist deshalb zugleich die Geschichte einer Befreiung: Programmierer mussten sich Schritt für Schritt weniger mit der Sprache der Maschine beschäftigen.
Die erste höhere Programmiersprache
Die Idee für höhere Programmiersprachen stammt nicht aus dem Silicon Valley, sondern aus Deutschland und aus einer Zeit, in der elektronische Computer, wie wir sie heute kennen, noch kaum existierten. Zwischen 1942 und 1945 entwickelte Konrad Zuse den Plankalkül. Zuse ist vor allem als Konstrukteur früher Rechenmaschinen bekannt. Mit dem Plankalkül entwarf er eines der frühesten umfassend ausgearbeiteten Konzepte einer höheren Programmiersprache. Darin finden sich bereits Ideen, die später für die Softwareentwicklung selbstverständlich werden sollten: Variablen, Zuweisungen, logische Operationen, Bedingungen, Schleifen und die Beschreibung komplexerer Algorithmen.
Entscheidend war dabei weniger die konkrete Syntax des Plankalküls als der zugrunde liegende Gedanke. Ein Programm sollte nicht mehr ausschließlich als Folge elementarer Anweisungen für eine ganz bestimmte Maschine formuliert werden. Stattdessen sollte es möglich sein, einen Lösungsweg auf einer höheren Abstraktionsebene zu beschreiben. Die Rechenmaschine rückte damit gedanklich in den Hintergrund. Der Plankalkül blieb jedoch zunächst ein theoretisches Konzept – einen Compiler dafür gab es damals noch nicht.
Die Anfangsjahre
In der Praxis blieb die Programmierung in den 1940er- und frühen 1950er-Jahren strikt an die Hardware gebunden. Programme bestanden aus numerischen Maschinencodes oder einfachen Assembler-Kürzeln wie „ADD“. Ein Programm für eine bestimmte Maschine war auf einer anderen unnutzbar.
In dieser Phase entstanden weltweit erste Ansätze zur automatischen Übersetzung. Bereits 1951 beschrieb der Schweizer Mathematiker Heinz Rutishauser das Konzept der automatischen Programmierung. Etwa zeitgleich entwickelte die US-Informatikerin Grace Hopper das System A-0 und etablierte dafür die Bezeichnung „Compiler“. Auch wenn A-0 nach heutigem Verständnis eher wie ein Lader oder Linker funktionierte, der vorgefertigte Unterprogramme zusammenfügte – und Entwickler wie Alick Glennie 1952 mit Autocode bereits echte Übersetzer bauten –, markierten diese Arbeiten den entscheidenden Wendepunkt: Die Maschine begann erstmals, sich ihre Anweisungen selbst zusammenzusetzen.
Mit zunehmender Leistungsfähigkeit der Computer stieg jedoch die Komplexität der Aufgaben an. Jede zusätzliche Funktion bedeutete neue Speicheradressen und Sprungbefehle. Die händische Programmierung drohte zum Engpass der technischen Entwicklung zu werden. Es reichte nicht mehr aus, nur schnellere Rechner zu bauen – es musste einfacher werden, sie zu programmieren.
Der Durchbruch der Syntax und Struktur
Ein moderner Compiler übernimmt weit mehr als eine reine Wort-für-Wort-Übersetzung. Zwischen dem Quellcode und dem ausführbaren Programm liegen mehrere Ebenen der Analyse und Transformation. Zunächst muss der Compiler den Quelltext analysieren. Zeichen werden in bedeutungstragende Einheiten zerlegt, aus denen anschließend die grammatische Struktur des Programms rekonstruiert wird. Der Compiler muss erkennen, ob eine Anweisung syntaktisch korrekt ist und ob ihre Bestandteile in der vorgesehenen Beziehung zueinander stehen. Danach folgt eine inhaltliche Prüfung von Datentypen, Gültigkeitsbereichen von Variablen und Funktionsaufrufen.
Stand: 08.12.2025
Es ist für uns eine Selbstverständlichkeit, dass wir verantwortungsvoll mit Ihren personenbezogenen Daten umgehen. Sofern wir personenbezogene Daten von Ihnen erheben, verarbeiten wir diese unter Beachtung der geltenden Datenschutzvorschriften. Detaillierte Informationen finden Sie in unserer Datenschutzerklärung.
Einwilligung in die Verwendung von Daten zu Werbezwecken
Ich bin damit einverstanden, dass die Vogel Communications Group GmbH & Co. KG, Max-Planckstr. 7-9, 97082 Würzburg einschließlich aller mit ihr im Sinne der §§ 15 ff. AktG verbundenen Unternehmen (im weiteren: Vogel Communications Group) meine E-Mail-Adresse für die Zusendung von redaktionellen Newslettern nutzt. Auflistungen der jeweils zugehörigen Unternehmen können hier abgerufen werden.
Der Newsletterinhalt erstreckt sich dabei auf Produkte und Dienstleistungen aller zuvor genannten Unternehmen, darunter beispielsweise Fachzeitschriften und Fachbücher, Veranstaltungen und Messen sowie veranstaltungsbezogene Produkte und Dienstleistungen, Print- und Digital-Mediaangebote und Services wie weitere (redaktionelle) Newsletter, Gewinnspiele, Lead-Kampagnen, Marktforschung im Online- und Offline-Bereich, fachspezifische Webportale und E-Learning-Angebote. Wenn auch meine persönliche Telefonnummer erhoben wurde, darf diese für die Unterbreitung von Angeboten der vorgenannten Produkte und Dienstleistungen der vorgenannten Unternehmen und Marktforschung genutzt werden.
Meine Einwilligung umfasst zudem die Verarbeitung meiner E-Mail-Adresse und Telefonnummer für den Datenabgleich zu Marketingzwecken mit ausgewählten Werbepartnern wie z.B. LinkedIN, Google und Meta. Hierfür darf die Vogel Communications Group die genannten Daten gehasht an Werbepartner übermitteln, die diese Daten dann nutzen, um feststellen zu können, ob ich ebenfalls Mitglied auf den besagten Werbepartnerportalen bin. Die Vogel Communications Group nutzt diese Funktion zu Zwecken des Retargeting (Upselling, Crossselling und Kundenbindung), der Generierung von sog. Lookalike Audiences zur Neukundengewinnung und als Ausschlussgrundlage für laufende Werbekampagnen. Weitere Informationen kann ich dem Abschnitt „Datenabgleich zu Marketingzwecken“ in der Datenschutzerklärung entnehmen.
Falls ich im Internet auf Portalen der Vogel Communications Group einschließlich deren mit ihr im Sinne der §§ 15 ff. AktG verbundenen Unternehmen geschützte Inhalte abrufe, muss ich mich mit weiteren Daten für den Zugang zu diesen Inhalten registrieren. Im Gegenzug für diesen gebührenlosen Zugang zu redaktionellen Inhalten dürfen meine Daten im Sinne dieser Einwilligung für die hier genannten Zwecke verwendet werden. Dies gilt nicht für den Datenabgleich zu Marketingzwecken.
Recht auf Widerruf
Mir ist bewusst, dass ich diese Einwilligung jederzeit für die Zukunft widerrufen kann. Durch meinen Widerruf wird die Rechtmäßigkeit der aufgrund meiner Einwilligung bis zum Widerruf erfolgten Verarbeitung nicht berührt. Um meinen Widerruf zu erklären, kann ich als eine Möglichkeit das unter https://contact.vogel.de abrufbare Kontaktformular nutzen. Sofern ich einzelne von mir abonnierte Newsletter nicht mehr erhalten möchte, kann ich darüber hinaus auch den am Ende eines Newsletters eingebundenen Abmeldelink anklicken. Weitere Informationen zu meinem Widerrufsrecht und dessen Ausübung sowie zu den Folgen meines Widerrufs finde ich in der Datenschutzerklärung, Abschnitt Redaktionelle Newsletter.
Erst wenn ein Programm diese Prüfungen durchlaufen hat, beginnt die eigentliche Übersetzungsarbeit. Moderne Compiler erzeugen dabei häufig nicht unmittelbar Maschinencode. Stattdessen wird das Programm zunächst in eine interne Zwischendarstellung (Intermediate Representation) überführt. Diese abstrahierte Form erlaubt es, Optimierungen durchzuführen, ohne dass jede Anpassung speziell für jede Programmiersprache und jede Prozessorarchitektur neu entwickelt werden muss. Erst im letzten Schritt wird der Code auf die Instruktionen der Zielhardware abgebildet.
Der praktische Durchbruch dieser höheren Programmiersprachen kam Ende der 1950er-Jahre mit Fortran. Die bei IBM unter Leitung von John Backus entwickelte Sprache sollte wissenschaftliche Berechnungen vereinfachen. Das eigentliche technische Wagnis lag jedoch im Compiler, denn dieser musste Code erzeugen, der so effizient war, dass er mit handgeschriebenem Assembler-Code konkurrieren konnte.
Parallel dazu entwickelte sich mit Cobol eine zweite wichtige Richtung. Während Fortran vor allem die Welt der Wissenschaft und numerischen Berechnungen adressierte, zielte Cobol auf kaufmännische und administrative Anwendungen. Die Sprache sollte große Mengen geschäftlicher Daten verarbeiten können und legte deshalb besonderen Wert auf eine menschennahe Darstellung von Programmlogik. An deren Entwicklung war Grace Hopper erneut maßgeblich beteiligt.
Einen besonders nachhaltigen Einfluss auf die Entwicklung von Compilern und Betriebssystemen hatte ab den frühen 1970er-Jahren die Programmiersprache C. Dennis Ritchie entwickelte C bei den Bell Laboratories im Umfeld von Unix. C nahm dabei eine Schlüsselrolle ein: Die Sprache bot deutlich höhere Abstraktion als Assembler, erlaubte aber gleichzeitig eine direkte Kontrolle über Speicher und Hardware. Für den Compilerbau war C ein Katalysator. Da Unix größtenteils in C geschrieben war, musste für jede neue Prozessorarchitektur lediglich ein neuer C-Compiler entwickelt werden, um das gesamte Betriebssystem zu portieren.
Vom Übersetzer zum Code-Optimierer
Moderne Mikroprozessoren besitzen komplexe Ressourcen. Die optimale Nutzung ist händisch kaum noch zu bewältigen. Ein Compiler analysiert Abhängigkeiten, entfernt ungenutzten Code, zieht feste Berechnungen vor und wandelt einfache Schleifen durch Vektorisierung in hochparallele Maschinenbefehle um. Zwei Programme mit identischem Quellcode können je nach Compiler und Optimierungseinstellungen völlig unterschiedlich schnell laufen.
Der Compiler ist ein Vermittler zwischen verschiedenen Anforderungen. Er muss den abstrakten Quellcode auf eine konkrete Hardware übertragen und dabei Eigenschaften berücksichtigen, die der ursprünglichen Programmbeschreibung möglicherweise gar nicht anzusehen sind. Ein Entwickler kann beispielsweise lediglich eine mathematische Operation formulieren, während der Compiler entscheiden muss, ob dafür eine einzelne Instruktion, mehrere skalare Operationen oder eine spezielle Vektoreinheit verwendet wird. (mr)