Dennis Ritchie entwarf eine bewusst kompakte Sprache, die hardwarenah genug war, um ein Betriebssystem zu schreiben, zugleich aber unabhängig genug von einer bestimmten Maschine, um dieses System auf neue Rechner zu übertragen. Diese Verbindung machte C und Unix zu zwei Grundlagen der modernen Informatik.
Dabei müssen die Beiträge unterschieden werden. Ritchie ist der Hauptentwickler von C. Unix entstand als Gemeinschaftsarbeit in den Bell Labs, angestoßen von Ken Thompson und gemeinsam mit Ritchie und weiteren Ingenieuren entwickelt. Ihre gemeinsame Geschichte zeigt, wie sich eine Programmiersprache und ein Betriebssystem gegenseitig prägen können.
Auf der Suche nach weniger Maschinenabhängigkeit
Dennis MacAlistair Ritchie wurde 1941 in Bronxville im US-Bundesstaat New York geboren. Er studierte Physik und angewandte Mathematik in Harvard und kam dort mit Computern in Berührung. 1967 wechselte er zum Computerforschungszentrum der Bell Labs.
Das Labor arbeitete damals am ehrgeizigen Time-Sharing-System Multics. Nachdem Bell Labs das Projekt 1969 verlassen hatte, experimentierte Ken Thompson auf einer PDP-7 mit einem kleineren System. Zusammen mit Ritchie und Kollegen entwickelte sich daraus Unix.
Frühe Rechner hatten wenig Speicher, und Systemsoftware wurde häufig in Assembler geschrieben. Das ermöglichte präzise Kontrolle, band Programme aber an eine Architektur. Ein Rechnerwechsel erforderte deshalb oft umfangreiche Neuprogrammierung.
Von BCPL und B zu C
Thompson übertrug zunächst Ideen aus BCPL in die Sprache B. Sie eignete sich für einige Aufgaben, doch ihr weitgehend typfreies Modell passte schlecht zur PDP-11 mit ihren unterschiedlichen Datenformaten. Ritchie ergänzte Typen und entwickelte aus „New B“ Anfang der 1970er Jahre C.
C blieb klein. Seine Konstrukte entsprechen relativ direkt Operationen eines Prozessors, während Funktionen, Strukturen, Zeiger und Typen Programme organisierbar machen, ohne jede Anweisung in Assembler schreiben zu müssen.
Ein Zeiger repräsentiert eine Speicheradresse. Das ermöglicht effiziente Systemprogramme und flexible Datenstrukturen, schützt aber nicht automatisch vor Zugriffen außerhalb gültiger Grenzen, der Verwendung bereits freigegebenen Speichers oder falscher Interpretation von Daten. Stärke und Risiko der Sprache beruhen teilweise auf derselben Entscheidung: dem Programmierer zu vertrauen.
Unix wird in C neu geschrieben
Um 1973 wurde der Unix-Kernel größtenteils in C neu geschrieben. Einige hardwareabhängige Teile blieben in Assembler, doch der überwiegende Teil des Systems ließ sich nun mit begrenztem Anpassungsaufwand für eine neue Maschine kompilieren.
Historisch war dies nicht deshalb bedeutsam, weil nie zuvor eine Hochsprache für ein System verwendet worden wäre, sondern weil Unix überzeugend zeigte, dass ein leistungsfähiges Betriebssystem portabel sein konnte. C profitierte anschließend von der Verbreitung von Unix an Universitäten; Unix wiederum von der leichteren Anpassbarkeit durch C.
Diese Beziehung prägte auch die Sprache. C wurde nicht abstrakt entworfen und anschließend auf Unix angewendet: Typen, Operatoren und Bibliothek entwickelten sich im Kontakt mit konkreten Anforderungen. Viele Unix-Werkzeuge wurden in derselben Sprache wie der Kernel geschrieben, was ihre Übertragung zwischen Maschinen vereinfachte.
Der Compiler als Werkzeug der Portabilität
Portabilität entsteht nicht allein aus dem Sprachtext. Sie benötigt Compiler, die dieselben Konstrukte in unterschiedliche Befehlssätze übersetzen, sowie Bibliotheken, die einen Teil der Systemdienste abstrahieren.
In den Bell Labs entwickelte sich C zusammen mit seinen Compilern. Die Sprache musste einfach genug bleiben, um auf verfügbaren Maschinen implementiert werden zu können, und zugleich deren nützliche Eigenschaften zugänglich machen. Daher sind Arrays und Zeiger eng verbunden, Strukturen beschreiben die Anordnung von Daten im Speicher, und Operatoren entsprechen häufig günstigen Maschinenoperationen.
Das bedeutet keine völlige Hardwareunabhängigkeit. Typgrößen, Byte-Reihenfolge und bestimmte Verhaltensweisen können variieren. Portabler Code muss sich auf die Garantien der Sprache stützen statt auf Details einer bestimmten Implementierung. Die Unterscheidung zwischen Standardgarantie und Implementierungsentscheidung wurde für die gesamte Geschichte von C zentral.
Die universitäre Verbreitung von Unix verstärkte einen positiven Kreislauf. Studierende erhielten System, Quellcode und Hauptsprache, entwickelten Werkzeuge, portierten Unix auf weitere Maschinen und trugen diese Praktiken später in die Industrie. C setzte sich daher nicht nur aufgrund abstrakter Eigenschaften durch, sondern reiste mit einer vollständigen Programmierumgebung.
Eine Referenz vor dem Standard
1978 veröffentlichten Brian Kernighan und Dennis Ritchie The C Programming Language. Das als K&R bekannte Buch verband eine knappe Einführung mit Beispielen und einer Beschreibung, die lange als faktische Referenz diente.
Mit der wachsenden Zahl von Compilern wurde ein formaler Standard notwendig. Das ANSI-Komitee X3J11 begann 1983; der US-Standard erschien 1989 und wurde 1990 ISO-Standard. Er präzisierte Sprache und Bibliothek und versuchte zugleich, bestehende Programme zu bewahren.
Ritchie kontrollierte die Entwicklung von C also nicht allein. Nach seiner Entstehung wurde die Sprache zu gemeinsamer Infrastruktur, durch Standards geregelt und auf einer enormen Vielfalt von Prozessoren implementiert.
Ein technisches Erbe mit zwei Seiten
C beeinflusste direkt C++ und Objective-C. Seine Syntax prägte auch Java, JavaScript, C#, Go und viele weitere Sprachen, selbst wenn deren Speicherverwaltung und Ausführungsmodelle grundlegend anders sind.
Am stärksten ist C in niedrigen Softwareschichten präsent: Kernel, Treiber, Systembibliotheken, Mikrocontroller, Datenbanken und Compiler. Eine in C definierte Schnittstelle dient häufig als gemeinsame Sprache zwischen Komponenten verschiedener Technologien.
Diese Präsenz macht C nicht zur universell besten Wahl. Die schwachen Schutzmechanismen begünstigen Sicherheitslücken wie Pufferüberläufe und Lebensdauerfehler. Analysewerkzeuge, Coding-Regeln und sicherere Sprachen versuchen diese Risiken zu reduzieren. Ritchies Einfluss zu verstehen heißt daher auch zu verstehen, warum die Industrie heute manche Operationen stärker absichert, die C direkt offenlegt.
Ritchie, Thompson und die Unix-Kultur
Ritchie wirkte an Unix als Entwickler und Programmierer mit, doch das System einer Person zuzuschreiben würde den Bell-Labs-Kontext ausblenden. Ken Thompson spielte zu Beginn eine entscheidende Rolle; Brian Kernighan, Douglas McIlroy und andere trugen zu Werkzeugen, Ideen und Verbreitung bei.
Ritchie und Thompson erhielten 1983 gemeinsam den Turing Award für ihre Entwicklung der allgemeinen Theorie von Betriebssystemen und insbesondere die Umsetzung von Unix. Die gemeinsame Auszeichnung spiegelt ihre Beiträge besser wider als eine Erzählung vom Einzelgenie.
Ritchie blieb bei Bell Labs und arbeitete später an Plan 9 und Inferno. Er starb 2011. Sein zurückhaltender öffentlicher Stil steht im Kontrast zur Größe seines technischen Erbes.
Warum Dennis Ritchie weiterhin zählt
Ritchie verschob eine Grenze: Systemsoftware musste nicht mehr fast vollständig an Assembler und eine einzelne Maschine gebunden sein. C bot eine bescheidene, aber entscheidende Abstraktionsebene – transparent genug für die Hardware und stabil genug für Portabilität.
Diese Lektion bleibt aktuell. Zwischen Leistung und Schutz, Kontrolle und Abstraktion, Kompatibilität und Fortschritt formuliert jede neue Systemsprache die Kompromisse neu, auf die C eine außerordentlich dauerhafte Antwort gab.
Chronologie
- 1941: Geburt in Bronxville, New York.
- 1963: Physikabschluss in Harvard.
- 1967: Eintritt in die Bell Labs.
- 1969: erste Unix-Arbeiten mit Ken Thompson und dem Bell-Labs-Team.
- 1971: Unix wird auf die PDP-11 portiert.
- 1972: C nimmt ausgehend von B seine erkennbare Form an.
- 1973: der Unix-Kernel wird weitgehend in C neu geschrieben.
- 1978: Veröffentlichung von The C Programming Language mit Brian Kernighan.
- 1983: Ritchie und Thompson erhalten den Turing Award.
- 1989: Veröffentlichung des ANSI-C-Standards.
- 1990: C wird internationaler ISO-Standard.
- 2011: Tod von Dennis Ritchie.
Häufige Fragen
Hat Dennis Ritchie Unix erfunden?
Er war einer der wichtigsten Entwickler, doch Unix war eine Gemeinschaftsarbeit, die Ken Thompson in den Bell Labs initiierte. Ritchie spielte eine zentrale Rolle bei Entwicklung und Neufassung in C.
Warum entwickelte Ritchie C?
Die verfügbaren Sprachen erfüllten die Anforderungen von Unix auf der PDP-11 nur unzureichend. C sollte hardwarenahe Typen und Effizienz mit der Möglichkeit verbinden, Code zwischen Architekturen zu übertragen.
Ist C eine Low-Level-Sprache?
C wird häufig als Sprache mittlerer Ebene beschrieben. Sie bietet höhere Konstrukte wie Funktionen und Typen, legt zugleich Speicheradressen und Datenrepräsentation direkt offen.
Warum war die Neufassung von Unix in C wichtig?
Sie verringerte die Abhängigkeit von maschinenspezifischem Assembler. Unix ließ sich leichter portieren, was seine Verbreitung förderte und die Machbarkeit portabler Systeme demonstrierte.
Welche Rolle spielte Brian Kernighan?
Kernighan entwarf C nicht, trug aber wesentlich zu Dokumentation und Verbreitung bei. Sein Buch mit Ritchie diente vor der Standardisierung als Referenz.
Warum wird C trotz seiner Risiken weiterhin verwendet?
Es erzeugt vorhersehbaren Code, läuft auf nahezu jeder Architektur und integriert sich in zahlreiche bestehende Systeme. Diese Vorteile gehen mit größerer Verantwortung für Speicher und Sicherheit einher.