Die ersten Computerprogramme der Welt
- Die ersten Computerprogramme der Welt
- Die interne Differenzmaschine
- Auf einer Seite lesen
Charles Babbage hat ab 1837 innerhalb von drei Jahren 27 Programme für die schließlich unvollendet gebliebene "Analytische Maschine" auf Papier gebracht
Heute wissen wir, dass Charles Babbage (1791-1871), der geniale Mathematiker aus der Universität Cambridge, im neunzehnten Jahrhundert den Computer im Wesentlichen und im Alleingang erfunden hat. Sein erster Versuch auf dem Feld der Rechenmaschinen war die "Difference Engine", ein Gerät womit Tabellen von Funktionen durch wiederholte Addition von "Differenzen" in Spalten erstellt werden konnten (wie in einem Tabellenkalkulationsprogramm heute). In den Jahren 1820-1822 fertigte Babbage den ersten Prototyp an, womit sich der Ansatz im Prinzip bewährte. Die nachfolgende Differenzmaschine, die viel komplizierter und genauer sein sollte, wurde allerdings nicht zu Ende gebaut, da Babbage inzwischen die Idee für einen viel mächtigeren Rechner hatte.
Die "Analytische Maschine" sollte über einen Speicher für Dezimalzahlen, über einen Prozessor für die vier Grundrechenarten und über Kartenleser für Lochkarten verfügen. Über die Lochkarten hätte man Zahlen direkt in den Speicher einspielen können. Das Programm für die Berechnungen wäre ebenfalls auf Lochkarten enthalten. Für die Programmierung war außerdem der bedingte Sprung vorgesehen. Wäre die Analytische Maschine zu Ende gebaut worden, würde sie zweifellos als erster Computer der Welt gelten.
Wir reden aber über die Jahre 1834 bis 1837: In diesem Zeitraum schritt Babbage von den ersten Skizzen zur ersten Beschreibung der Maschine voran. Das Projekt war gewaltig: bis zu 1000 Zahlen mit je 40 Dezimalstellen hätten im Speicher Platz gehabt. Babbage schrieb aber nachts mit Kerzenlicht und als Energiequelle für den mechanischen Entwurf standen eigentlich nur Dampfmaschinen zur Verfügung. Für die Speicherung der Dezimalzahlen sollten Zähne von Zahnrädern dienen. Ein solches Projekt mit den konstruktiven Mitteln, die Babbage zur Verfügung standen, war von Anfang an vielleicht nicht realisierbar und so blieb die Maschine bis zu seinem Tod unvollendet. Nur Teile des Prozessors wurden nachher von seinem Sohn als Prototyp vervollständigt.
Von der Analytischen Maschine sind die Baupläne im Babbage Archiv im Science Museum in London übrig geblieben (Fig. 1). Alan Bromley untersuchte sie in den achtziger Jahren gründlich und konnte damit eine grobe Beschreibung der Maschinenarchitektur liefern.1 So wissen wir, dass die Grundstruktur solide und vielversprechend war - die Realisierung erforderte aber Anfertigungen, die für die damalige Zeit zu ambitioniert waren. Von der Programmierung der Maschine wussten wir bis heute eigentlich wenig, da Babbage selbst nur kurze Darstellungen davon schrieb, während Luigi Menabrea erst im Jahr 1842 seine Zusammenfassung der "Software" der Analytischen Maschine veröffentlichte (als Wiedergabe von Vorträgen, die Babbage 1840 in Italien hielt).2
Im Science Museum in London kann man jedoch heute im "Babbage Archiv" die 27 Programme finden, die der Gelehrte zwischen 1837 und 1840 für die Analytische Maschine schrieb. Sie sind äußerst interessant, weil sie einige unbekannte Details der Architektur von Prozessor und Speicher verraten und weil sie uns auch den lebendigen Prozess des Designs der Analytischen Maschine sehr deutlich vor Augen führen. Die Programme, die 1837 entstanden, unterscheiden sich von den "reifen" Programmen die nur drei Jahre danach im Archiv auftauchen. Manche Designentscheidungen lassen sich so am Code nachvollziehen. Gleichzeitig ist dieser Quellcode der erste der jemals für einen Computer geschrieben wurde - es wäre überflüssig, darauf hinzuweisen, dass Babbage damit als erster Programmierer der Welt gilt, würden nicht anderslautende historisch unhaltbare urban legends im Internet geistern.
Die Programm-Quellen
Seltsam in der Analytischen Maschine, im Vergleich zu heute, ist die Trennung von Befehlen und Variablenadressen. Ein Programm für eine Addition, eine Multiplikation und eine Subtraktion könnte heute so aussehen:
V1 = V2 + V3
V4 = V5 x V6
V7 = V6 - V1
D.h. wir schreiben die Befehle so, wie man sie auf Papier haben würde. Die Identifikatoren V1 bis V7 stehen für Speicherzellen, in denen wir Dezimalzahlen unterbringen können. Die Analytische Maschine hatte jedoch einen Kartenleser für Operationen und einen anderen für die Variablennamen (siehe Fig. 1: "Operation Cards", "Variable Cards"). Das obige dreizeilige Programm würde Babbage in einen Strang für die drei Operationskarten für "+, x, -" und einen getrennten Strang von Lochkarten für die Identifikatoren (1,2,3), (4,5,6), und (7,6,1) spalten.
Diese Lostrennung mag zuerst seltsam erscheinen, bis man aufmerksam die im Babbage Archiv gesammelten Programme liest. Diese sind mit L001 bis L027 durchnummeriert. Das erste Programm trägt das Datum 4.8.1837. Die ersten Programme gelten relativ einfachen arithmetischen Berechnungen, wie die Lösung von zwei Simultangleichungen in zwei Variablen. Die späteren sind relativ komplex, wie z.B. die Multiplikation von zwei Polynomen, d.h. eine algebraische Aufgabe.
In den Babbage-Codequellen entdeckt man schnell folgendes: Prozessor und Speicher sollten in der Analytischen Maschine autonome Einheiten werden. Der Prozessor würde Argumente aus dem Speicher anfordern, der Speicher konnte dann zwei liefern und so den Prozessor "auslösen". Der Prozessor konnte z.B. eine einzige Operation, wie die Addition, zehn Mal wiederholen, womit nur eine Operationskarte für die Addition plus ein interner Zähler von 1 bis 10 notwendig waren, während beim Speicher zehn mal drei Karten gebraucht wurden (zwei Argumente und Resultat für jede Addition). Man hätte damit Operationskarten gespart. Viel wichtiger war jedoch, dass der Speicher die zu liefernden Adressen ändern konnte, womit die Möglichkeit dessen, was wir heute "indirekte Adressierung" nennen, gegeben war. Dazu später mehr.
Das erste Problem, das Babbage beim Entwurf der Maschine und beim Design der Code-Notation hatte, ist das in den ersten Konzepten die Lektüre von Daten aus dem Speicher "destruktiv" ist. Liest man eine Variable als Argument für eine Operation, z.B. V1, enthält am Ende diese Variable eine Null. Will man aber den Inhalt von V1 nicht verlieren, kann man V1 zum Prozessor schicken und gleichzeitig in einer getrennten Adresse (z.B. V12) als Dezimal-Komplement speichern. Das Komplement von 9 is 1, von 8 ist 2, von 7 ist 3, usw. Das hat mir der Drehung der Zahnräder für die Dezimalzahlen zu tun, ist also ein technisches Detail. Der Programmierer musste aber immer vorsehen, wohin ein Datum im Speicher wandern würde und dann, falls notwendig, die gerettete Zahl durch eine zweite Komplementbildung zurück von z.B. V12 zu V1 bringen.
Aber dann, im Januar 1838 im Programm L016, führte Babbage eine neue Notation ein: "lese und behalte" (GR für "give off and retain"). Das bedeutete, dass ein Argument für eine Operation im Normalfall zu Null reduziert wurde, aber falls im Code "GR" stand, würde die ursprüngliche Zahl gerettet. Der Programmierer musste sich also um die zweite Zwischenadresse, die Komplementbildung, usw. nicht mehr kümmern und war damit entlastet. Das hieß aber auch, dass Babbage gewisse technische Verbesserungen in der Maschine vorsehen müsste. Deshalb erkennt man hier am deutlichsten wie die Programmiernotation sich parallel mit der Entwicklung der Maschine vollzog. So wie heute: Wer einen Computer entwirft, legt die Programmierbefehle und die Art der Programmierung gleichzeitig fest.
Unvollendete Notation
Liest man die Babbage-Programme, erlebt man unvermittelt wie der Autor mit der Materie kämpft. Seine Programme sind nicht einfach Code, dafür hätte gereicht, wenn er die Operationskarten und die Variablenkarten aufgelistet hätte. Die Babbage-Programme muten jedoch eher als ein Laufprotokoll der Ausführung an (ein "trace"). Programme werden als Tabellen wiedergegeben: jede Zeile entspricht einer durchgeführten Operation und die Spalten zeigen den momentanen Inhalt der Speicherzellen an. So kann man am deutlichsten darstellen, was in der Maschine intern geschieht, wenn das Programm ausgeführt wird. Der Quellcode selbst wird deshalb nur implizit durch die Tabelle angegeben.
Erst in den Programmen L019 und L020 (1840) macht Babbage den ersten Versuch, explizit den Inhalt der Operations- und Variablenkarten anzugeben. So erfahren wir, dass die Variablenadressen eigentlich als Paare angegeben werden sollten. Die Operation "V1=V2+V3", z.B., braucht ein "Plus" bei den Operationskarten und bei den Variablenkarten die folgenden Paare:
(V2,V2),(V3,0),(0,V1)
Das erste Paar besagt, dass V2 Argument ist, und dass dessen Inhalt nach der Lektüre behalten wird. Das zweite Paar sagt, dass V3 Argument ist, nach der Lektüre kann aber V3 zu Null reduziert werden. Das dritte Paar sagt, dass V1 den Inhalt aus dem Prozessor bekommt, d.h. hier wird das Resultat der Addition gespeichert.
Da Prozessor und Speicher getrennte Einheiten sind, kann man im Speicher sogar zusätzliche Zuweisungen angeben, wie z.B.:
(V2,V2),(V3,0),(0,V1),(V3,V5)
Das neue vierte Paar besagt, dass das Argument V3 in der Speicherzelle V5 gerettet werden soll, auch wenn V3 selbst zu Null reduziert wird. So kann man im Speicher Informationen unabhängig vom Prozessor hin und her bewegen. Der Programmierer muss aber immer im Kopf behalten, wohin die Daten geflossen sind.