50 Jahre Pascal

In den frühen 1960er Jahren dominierten die Sprachen Fortran (John Backus, IBM) für wissenschaftliche und Cobol (Jean Sammet, IBM, und DoD) für kommerzielle Anwendungen. Programme wurden auf Papier geschrieben, dann auf Karten gestanzt, und man wartete einen Tag auf die Ergebnisse. Programmiersprachen wurden als wesentliche Hilfsmittel und Beschleuniger des Programmierprozesses erkannt.

Ein Poster von Pascals Syntaxdiagrammen, das stark mit Pascal identifiziert wird.
Ein Poster von Pascals Syntaxdiagrammen, das stark mit Pascal identifiziert wird.

Von Niklaus Wirth
Communications of the ACM, März 2021, Vol. 64 Nr. 3, Seiten 39-41

1960 veröffentlichte ein internationales Komitee die Sprache Algol 60. Es war das erste Mal, dass eine Sprache durch prägnant formulierte Konstrukte und eine präzise, formale Syntax definiert wurde. Zwei Jahre später erkannte man, dass einige Korrekturen und Verbesserungen notwendig waren. Vor allem aber sollte der Anwendungsbereich erweitert werden, denn Algol 60 war nur für wissenschaftliche Berechnungen (numerische Mathematik) gedacht. Unter der Schirmherrschaft der IFIP wurde eine Arbeitsgruppe (WG 2.1) gegründet, die sich mit diesem Projekt befasste.

Die Gruppe bestand aus etwa 40 Mitgliedern mit fast ebenso vielen Meinungen und Ansichten darüber, wie ein Nachfolger von Algol aussehen sollte. Es folgten viele Diskussionen, und manchmal endeten die Debatten sogar erbittert. Anfang 1964 wurde ich Mitglied, und bald wurde ich aufgefordert, einen konkreten Vorschlag auszuarbeiten. In dem Ausschuss hatten sich zwei Fraktionen gebildet. Die eine strebte nach Algol 60 einen zweiten Meilenstein an, eine Sprache mit radikal neuen, ungetesteten Konzepten und weitreichender Flexibilität. Sie wurde später als Algol 68 bekannt. Die andere Fraktion blieb bescheidener und konzentrierte sich auf realistische Verbesserungen der bekannten Konzepte. Schliesslich drängte die Zeit: PL/1 von IBM stand kurz vor dem Erscheinen. Mein Vorschlag, obwohl technisch realistisch, unterlag jedoch der kleinen Mehrheit, die einen Meilenstein favorisierte.

Es reicht nie aus, eine Sprache nur auf dem Papier zu postulieren. Es musste auch ein solider Compiler gebaut werden, der in der Regel ein sehr komplexes Programm war. In dieser Hinsicht waren die grossen Industrieunternehmen im Vorteil gegenüber unserer Arbeitsgruppe, die sich auf Enthusiasten an den Universitäten stützen musste. Ich verliess die Gruppe 1966 und widmete mich zusammen mit einigen Doktoranden an der Stanford University dem Bau eines Compilers für meinen Vorschlag. Das Ergebnis war die Sprache Algol W, die ab 1967 an vielen Orten auf grossen IBM-Computern zum Einsatz kam. Sie wurde recht erfolgreich. Der Meilenstein Algol 68 erschien und versank dann schnell unter seinem eigenen Gewicht in der Bedeutungslosigkeit, obwohl einige seiner Konzepte in späteren Sprachen überlebten.

Meiner Meinung nach war Algol W jedoch nicht vollkommen zufriedenstellend. Es enthielt noch zu viele Kompromisse, da es aus einem Ausschuss hervorgegangen war. Nach meiner Rückkehr in die Schweiz entwarf ich eine Sprache nach meinen eigenen Vorstellungen: Pascal. Zusammen mit ein paar Assistenten schrieben wir ein Benutzerhandbuch und konstruierten einen Compiler. Dabei machten wir eine schlimme Erfahrung. Wir hatten vor, den Compiler in Pascal selbst zu beschreiben, ihn dann von Hand nach Fortran zu übersetzen und schliesslich mit Fortran zu kompilieren. Dies führte zu einem grossen Misserfolg, da es in Fortran keine Datenstrukturen (Records) gab, was die Übersetzung sehr mühsam machte. Nach dieser unglücklichen und teuren Lektion gelang ein zweiter Versuch, bei dem anstelle von Fortran die lokale Sprache Scallop (M. Engeli) verwendet wurde.

Pascal

Wie sein Vorläufer Algol 60 zeichnete sich Pascal2 durch eine präzise Definition und einige übersichtliche Grundelemente aus. Seine Struktur, die Syntax, wurde formal in Extended BNF definiert. Anweisungen beschrieben Zuweisungen von Werten an Variablen, bedingte und wiederholte Ausführung. Darüber hinaus gab es Prozeduren, und diese waren rekursiv. Eine wesentliche Erweiterung waren Datentypen und Strukturen: Die elementaren Datentypen waren Ganzzahlen und reelle Zahlen, boolesche Werte, Zeichen und Aufzählungen (von Konstanten). Die Strukturen waren Arrays, Records, Dateien (Sequenzen) und Zeiger. Prozeduren verfügten über zwei Arten von Parametern, Wert- und Variablen-Parameter. Prozeduren konnten rekursiv verwendet werden. Am wichtigsten war das allgegenwärtige Konzept des Datentyps: Jede Konstante, Variable oder Funktion war von einem festen, statischen Typ. Dadurch enthielten Programme viel Redundanz, die ein Compiler zur Überprüfung der Typkonsistenz nutzen konnte. Dies trug zur Erkennung von Fehlern bei, und zwar vor der Ausführung des Programms.

Genauso wichtig wie die Hinzufügung von Funktionen waren die Streichungen (in Bezug auf Algol). Wie C.A.R. Hoare einmal bemerkte: Eine Sprache zeichnet sich nicht nur dadurch aus, was sie dem Programmierer erlaubt zu spezifizieren, sondern noch mehr durch das, was sie nicht erlaubt. In diesem Sinne wurde der Parameter name in Algol weggelassen. Er wurde selten verwendet und verursachte erhebliche Komplikationen für einen Compiler. Außerdem wurde das Algol-eigene Konzept gestrichen, wonach lokale Variablen global sein konnten, um die Aktivierung der Prozedur, für die sie als lokal deklariert wurden, zu "überleben". Die for-Anweisung von Algol wurde drastisch vereinfacht, wodurch komplexe und schwer verständliche Konstrukte wegfielen. Aber die while- und repeat-Anweisungen wurden für einfache und transparente Wiederholungssituationen hinzugefügt. Dennoch blieb die umstrittene goto-Anweisung bestehen. Ich war der Meinung, dass es für die Programmiergemeinschaft zu früh war, ihr Fehlen zu akzeptieren. Es wäre zu nachteilig für die allgemeine Akzeptanz von Pascal gewesen.
Pascal war leicht zu lehren, und es deckte ein breites Spektrum von Anwendungen ab, was ein wesentlicher Vorteil gegenüber Algol, Fortran und Cobol war. Das Pascal-System war effizient, kompakt und einfach zu benutzen. Die Sprache wurde stark von der neuen Disziplin der strukturierten Programmierung beeinflusst, die vor allem von E.W. Dijkstra vertreten wurde, um die drohende Softwarekrise abzuwenden (1968).

Rasch wurden die Computer schneller, und damit wuchsen die Anforderungen an die Anwendungen, aber auch an die Programmierer.

Pascal wurde 1970 veröffentlicht und zum ersten Mal in grossen Kursen an der ETH Zürich im grossen Stil eingesetzt. Wir hatten sogar eine Untermenge Pascal-S definiert und einen kleineren Compiler gebaut, um Rechenzeit und Speicherplatz auf unserem grossen CDC-Rechner zu sparen und die Durchlaufzeit für die Studierenden zu reduzieren. Damals waren Rechenzeit und Speicherplatz noch sehr knapp.

Pascalsche Spreizung und Verteilung

Bald wurde Pascal an mehreren Universitäten bekannt, und das Interesse an seiner Verwendung im Unterricht stieg. Wir erhielten Anfragen nach möglicher Hilfe bei der Implementierung von Compilern für andere Grossrechner. Es war meine Idee, einen hypothetischen Computer zu postulieren, der auf verschiedenen anderen Grossrechnern einfach zu realisieren wäre und für den wir an der ETH einen Pascal-Compiler bauen würden. Der hypothetische Computer wäre mit relativ geringem Aufwand und mit leicht verfügbaren Werkzeugen (Assemblern) schnell implementierbar. So entstand die Architektur Pascal-P (P für portable), und diese Technik erwies sich als äusserst erfolgreich. Die ersten Kunden kamen aus Belfast (C.A.R. Hoare). Zwei Assistenten brachten zwei schwere Kartons mit Lochkarten nach Zürich, den Compiler, den sie für ihren ICL-Computer entwickelt hatten. An der Grenze wurden sie kontrolliert, denn es bestand der Verdacht, dass die Löcher zollpflichtige Geheimnisse enthalten könnten. All dies geschah ohne internationale Projektorganisationen, ohne Bürokratie und Forschungsbudgets. Heute wäre das unmöglich.

Eine interessante Folge dieser Entwicklungen war das Entstehen von Benutzergruppen, meist von jungen Enthusiasten, die Pascal fördern und verbreiten wollten. Den Kern bildete die Gruppe um Andy Mickel in Minneapolis, wo sie regelmäßig einen Pascal-Newsletter veröffentlichte. Diese Bewegung trug wesentlich zur schnellen Verbreitung von Pascal bei.

Einige Jahre später kamen die ersten Mikrocomputer auf den Markt. Es handelte sich um kleine Computer mit einem auf einem Chip integrierten Prozessor und 8-Bit-Datenpfaden, die auch für Privatpersonen erschwinglich waren. Man erkannte, dass Pascal für diese Prozessoren geeignet war, da es einen kompakten Compiler besaß, der in den kleinen Speicher (64K) passte. Eine Gruppe um Ken Bowles an der Universität von San Diego und Philippe Kahn bei Borland Inc. in Santa Cruz umgab unseren Compiler mit einem einfachen Betriebssystem, einem Texteditor und Routinen zur Fehlererkennung und -diagnose. Sie verkauften dieses Paket für 50 Dollar auf Disketten (Turbo Pascal). Dadurch verbreitete sich Pascal sofort, vor allem in Schulen, und wurde für viele der Einstieg in die Programmierung und Informatik. Unser Pascal-Handbuch wurde ein Bestseller.

Diese Ausbreitung blieb nicht auf Amerika und Europa beschränkt. Russland und China nahmen Pascal mit Begeisterung auf. Dies wurde mir erst später bewusst, während meiner ersten Reisen nach China (1982) und Russland (1990), als mir ein Exemplar unseres Handbuchs vorgelegt wurde, das in (für mich) unleserlichen Zeichen und Symbolen geschrieben war.

Pascals Nachfolger

Doch die Zeit blieb nicht stehen. Die Computer wurden immer schneller, und damit stiegen auch die Anforderungen an die Anwendungen und an die Programmierer. Programme wurden nicht mehr von einzelnen Personen entwickelt. Jetzt wurden sie von Teams erstellt. Die Sprachen mussten Konstruktionen anbieten, die Teamarbeit unterstützten. Eine einzelne Person konnte einen Teil eines Systems, ein so genanntes Modul, entwerfen und dies relativ unabhängig von anderen Modulen tun. Die Module würden später automatisch verknüpft und geladen werden. Fortran bot diese Möglichkeit bereits, aber nun musste ein Linker die Konsistenz der Datentypen auch über Modulgrenzen hinweg überprüfen. Dies war keine einfache Angelegenheit!

Module mit Typkonsistenzprüfung über die Grenzen hinweg waren in der Tat die primäre Erweiterung von Pascals erstem Nachfolger Modula-2 (für modulare Sprache, 1979). Sie entwickelte sich aus Pascal, aber auch aus Mesa, einer bei Xerox PARC entwickelten Sprache für die Systemprogrammierung, die ihrerseits auf Pascal zurückging. Mesa war jedoch zu wild gewachsen und musste "gezähmt" werden. Modula-2 enthielt auch Elemente für die Systemprogrammierung, die Konstrukte zuließen, die von bestimmten Eigenschaften eines Computers abhingen, wie sie für Schnittstellen zu Peripheriegeräten oder Netzwerken notwendig waren. Damit wurde die Essenz höherer Sprachen geopfert, nämlich die maschinenunabhängige Programmierung. Glücklicherweise können solche Teile nun aber in spezifischen "Low-Level"-Modulen lokalisiert und damit ordnungsgemäss isoliert werden.

Zum Verständnis ist kein Hinweis auf einen Computer oder Mechanismus erforderlich.

Abgesehen davon enthielt Modula Konstrukte zur Programmierung nebenläufiger Prozesse (oder quasiparalleler Threads). "Parallele Programmierung" war das beherrschende Thema der 1970er Jahre. Insgesamt wurde Modula-2 ziemlich komplex und für meinen Geschmack und für den Programmierunterricht zu kompliziert. Eine Verbesserung und Vereinfachung erschien wünschenswert.

Aus solchen Überlegungen entstand die Sprache Oberon, wiederum nach einem Sabbatical bei Xerox PARC. Nicht mehr Grossrechner waren im Einsatz, sondern leistungsfähige Workstations mit hochauflösenden Displays und interaktiver Nutzung. Zu diesem Zweck waren am PARC die Sprache und das interaktive Betriebssystem Cedar entwickelt worden. Wieder einmal schien eine drastische Vereinfachung und Konsolidierung wünschenswert. So wurden an der ETH für Oberon ein Betriebssystem, ein Compiler und ein Texteditor programmiert. Dies wurde von nur zwei Programmierern - Wirth und Gutknecht - in ihrer Freizeit während sechs Monaten geleistet. Oberon wurde 1988 veröffentlicht. Die Sprache wurde von der neuen Disziplin der objektorientierten Programmierung beeinflusst. Allerdings wurden ausser der Typerweiterung keine neuen Funktionen eingeführt. Damit wurde erstmals eine Sprache geschaffen, die nicht komplexer, sondern einfacher, aber noch leistungsfähiger als ihr Vorgänger war. Ein höchst wünschenswertes Ziel war endlich erreicht.

Noch heute ist Oberon vielerorts erfolgreich im Einsatz. Ein Durchbruch wie der von Pascal ist jedoch nicht erfolgt. Komplexe, kommerzielle Systeme sind zu weit verbreitet und verankert. Es kann aber behauptet werden, dass viele dieser Sprachen, wie Java (Sun Microsystems) und C# (Microsoft), stark von Oberon oder Pascal beeinflusst wurden.

Um 1995 kamen elektronische Bauteile auf den Markt, die auf Gatterebene dynamisch umprogrammierbar sind. Diese feldprogrammierbaren Gate-Arrays (FPGA) können zu fast jeder digitalen Schaltung konfiguriert werden. Der Unterschied zwischen Hardware und Software wurde immer unschärfer. Ich entwickelte die Sprache Lola (Logiksprache) mit ähnlichen Elementen und der gleichen Struktur wie Oberon, um digitale Schaltungen zu beschreiben. Zunehmend wurden Schaltungen durch formale Texte spezifiziert und ersetzten grafische Schaltpläne. Dies erleichtert den gemeinsamen Entwurf von Hardware und Software, der in der Praxis immer wichtiger wird.

Anmerkungen und Schlussfolgerung

Der Hauptzweck einer höheren Sprache besteht darin, die Abstraktionsebene gegenüber den Maschinenbefehlen zu erhöhen. Beispiele hierfür sind Datenstrukturen im Vergleich zu Wortfeldern im Speicher oder bedingte und sich wiederholende Anweisungen im Vergleich zu Sprungbefehlen. Eine perfekte Sprache sollte in Form von mathematischer Logik, von Axiomen und Folgerungsregeln definiert werden. Um sie zu verstehen, sollte kein Verweis auf einen Computer oder einen Mechanismus notwendig sein. Dies ist die Grundlage der Portabilität. Die Entwickler von Algol hatten dieses Ziel vor Augen, aber es ist sehr schwer zu erreichen, ohne die Ausdruckskraft zu opfern. Dennoch muss sich jede neue Sprache daran messen lassen, inwieweit sie diesem Ziel nahe kommt. Die Folge Pascal-Modula-Oberon ist Zeuge meiner Versuche, dieses Ziel zu erreichen. Oberon ist dem Ziel nahe. Doch nichts ist perfekt.

Originaltext: externe Seite50 years of Pascal (Niklaus Wirth, Communications of the ACM, March 2021, Vol. 64 No. 3, Pages 39-41)

JavaScript wurde auf Ihrem Browser deaktiviert