Software Gems: The Computer History Museum Historical Source Code Series
Ken Iverson an der Harvard University
Tausende von Programmiersprachen wurden in den ersten 50 Jahren des Computerzeitalters erfunden. Viele von ihnen ähnelten sich, und viele folgten dem traditionellen, evolutionären Weg ihrer Vorgänger.
Aber einige revolutionäre Sprachen hatten eine Ausrichtung, die sie von ihren allgemeineren Brüdern unterschied. LISP war für die Listenverarbeitung gedacht. SNOBOL war für die Manipulation von Zeichenketten gedacht. SIMSCRIPT diente der Simulation. Und APL war für die Mathematik gedacht, wobei der Schwerpunkt auf der Array-Verarbeitung lag.
Das, was schließlich zu APL wurde, wurde 1957 von Harvard-Professor Kenneth E. Iverson als mathematische Notation und nicht als Computerprogrammiersprache erfunden. Zwar gab es bereits andere matrixorientierte Symbolsysteme, darunter die von Einstein erfundene prägnante Tensornotation, doch waren diese eher auf die mathematische Analyse und weniger auf die Synthese von Algorithmen ausgerichtet. Iverson, der ein Schüler von Howard Aiken war, lehrte seinen Harvard-Studenten die so genannte „Iverson-Notation“, um Algorithmen zu erklären.
Iverson wurde 1960 von IBM eingestellt, um mit Adin Falkoff und anderen an seiner Notation zu arbeiten. In seinem inzwischen berühmten Buch „A Programming Language“ von 1962 sagt er, die Notation sei für die Beschreibung von „Prozeduren …, die Algorithmen oder Programme genannt werden“, und dass sie eine Sprache sei, weil sie „eine beträchtliche syntaktische Struktur“ aufweise. Aber zu diesem Zeitpunkt war es nur eine Notation, die man lesen konnte, und keine Sprache zur Programmierung von Computern. In dem Buch werden zahlreiche Beispiele für die Verwendung der Sprache sowohl als Beschreibungsinstrument (z. B. zur Dokumentation der Definition von Computerbefehlen) als auch als Mittel zum Ausdruck allgemeiner Algorithmen (z. B. zum Sortieren und Suchen) angeführt. In Erwartung des Widerstands gegen etwas so Neues sagt er im Vorwort: „Es ist die zentrale These dieses Buches, dass die beschreibende und analytische Kraft einer angemessenen Programmiersprache die beträchtlichen Anstrengungen, die für ihre Beherrschung erforderlich sind, reichlich belohnt.“ Vielleicht wollte er darauf hinweisen, dass das Beherrschen der Sprache nicht trivial ist. Vielleicht wollte er auch darauf hinweisen, dass andere Notationssprachen seiner Meinung nach nicht „angemessen“ waren.
Das Team erkannte natürlich bald, dass die Notation in eine Programmiersprache für Computer umgewandelt werden konnte. Diese Sprache, die ab 1966 APL genannt wurde, betonte die Array-Manipulation und verwendete unkonventionelle Symbole. Sie war wie keine andere Programmiersprache, die bis dahin erfunden worden war.
APL wurde populär, als IBM „APL360“ für seinen Großrechner System/360 einführte. Im Gegensatz zu den meisten anderen Sprachen jener Zeit war APL360 auch eine vollständige interaktive Programmierumgebung. Der Programmierer, der an einer elektromechanischen Schreibmaschine saß, die mit einem Timeshare-Computer verbunden war, konnte APL-Anweisungen eingeben und erhielt sofort eine Antwort. Programme konnten auf einem Computer definiert, getestet, ausgeführt und gespeichert werden, der gleichzeitig von Dutzenden anderer Personen benutzt wurde.
Ganz in 360-Assemblersprache geschrieben, übernahm diese Version von APL die Kontrolle über die gesamte Maschine. Sie implementierte ein komplettes Timesharing-Betriebssystem zusätzlich zu einer Hochsprache.
Mit der Erlaubnis von IBM freut sich das Computer History Museum, den Quellcode der „XM6“-Version von APL für das System/360 aus den Jahren 1969-1972 für nicht-kommerzielle Zwecke zur Verfügung zu stellen.
Die Textdatei enthält 37.567 Zeilen, die Code, Makros und globale Definitionen beinhalten. Die 90 Einzeldateien sind durch ‚./ ADD“-Befehle getrennt. Um auf dieses Material zugreifen zu können, müssen Sie den Bedingungen der hier angezeigten Lizenz zustimmen, die nur die nicht-kommerzielle Nutzung erlaubt und Ihnen nicht das Recht gibt, es an Dritte zu lizenzieren, indem Sie Kopien an anderer Stelle im Web veröffentlichen.
Download APL360 Source Code
Jürgen Winkelmann an der ETH Zürich hat eine erstaunliche Arbeit geleistet, diesen Quellcode in ein lauffähiges System zu verwandeln. Weitere Informationen finden Sie unter MVT for APL Version 2.00.
Creating the APL Programming Language
Iverson’s Buch „A Programming Language“ 1 verwendet eine grafische Notation, die nur schwer direkt als Programmiersprache für Computer zu verwenden gewesen wäre. Er betrachtete sie als eine Erweiterung der Matrixalgebra und verwendete gängige mathematische typografische Konventionen wie tiefgestellte und hochgestellte Buchstaben sowie Unterscheidungen, die auf der Gewichtung oder der Schriftart der Zeichen basieren. Hier ist zum Beispiel ein Programm zum Sortieren von Zahlen:
Um die Notation für die Verwendung als Computerprogrammiersprache zu linearisieren, die über eine Tastatur eingegeben wird, mussten die APL-Implementierer natürlich auf die Verwendung von beschrifteten Pfeilen für Kontrollübertragungen verzichten. Aber ein Merkmal, das sie bis zu einem gewissen Grad beibehalten konnten, war die Verwendung spezieller Symbole für primitive Funktionen, wie in diesem Programm, das Huffman-Codes erzeugt, gezeigt wird:
APL verwendet Symbole, die der Standardmathematik näher stehen als der Programmierung. Um die unkonventionellen Symbole zu unterstützen, verwendete APL360 eine eigens entworfene Tastatur mit Sonderzeichen in Großbuchstaben.
APL360 verwendete eine eigens entworfene Tastatur
Auch wenn es mehr Sonderzeichen gab, als auf die Tastatur passten, wurden einige durch Überstreichen zweier Zeichen eingegeben. So wurde zum Beispiel das Zeichen ⍋, ein primitiver Operator, der zum Sortieren verwendet wurde, durch Eingabe von ∆ (Shift H), dann Backspace und ∣ (Shift M) erzeugt. Es gab keinen Platz mehr für Groß- und Kleinbuchstaben, so dass APL nur Großbuchstaben unterstützte.
Für das Drucken von Programmen brachten Iverson und Falkoff IBM dazu, eine spezielle Schriftkugel für ihre Terminals 1050 und 2741 zu entwerfen, die den IBM Selectric-Schreibmaschinenmechanismus verwendeten.
Jetzt konnten Programme sowohl eingetippt als auch gedruckt werden. Hier ist zum Beispiel die gedruckte Version eines Programms aus dem APL Language Manual 2, das die mathematische Determinante einer Matrix berechnet:
A Taste of APL
APL ist eine prägnante Hochsprache, die sich von den meisten anderen Sprachen, die in den 1960er Jahren entwickelt wurden, in mehrfacher Hinsicht unterscheidet:
Order of evaluation: Ausdrücke in APL werden von rechts nach links ausgewertet, und es gibt keine Hierarchie der Funktionspriorität. Wenn man z.B. den Ausdruck
2×4+3
eingibt, gibt der Computer sofort den resultierenden Wert
ein, und nicht, wie in vielen anderen Sprachen mit Vorrang der Operatoren, den Wert 11. Natürlich können Klammern verwendet werden, um einen Unterausdruck zu gruppieren und die Auswertungsreihenfolge zu ändern. Allgemein gilt, dass das rechte Argument einer Funktion der Wert des Ausdrucks rechts davon ist.
Automatische Erstellung von Vektoren und Arrays: Eine höherdimensionale Struktur wird automatisch erzeugt, indem ein Ausdruck ausgewertet wird, der sie zurückgibt, und Skalare können frei gemischt werden. Zum Beispiel,
A ← 2 + 1 2 3
erzeugt den Vektor „1 2 3“, fügt den Skalar 2 hinzu und erzeugt die Variable A, um den Vektor zu halten, dessen Wert
3 4 5
Variablen werden nie deklariert; sie werden automatisch erzeugt und nehmen die Größe und Form des Ausdrucks an, der ihnen zugewiesen wird.
Eine Fülle von Primitiven: APL verfügt über eine Fülle von eingebauten Funktionen (und „Operatoren“, die auf Funktionen angewendet werden, um verschiedene Funktionen zu erhalten), die auf Skalaren, Vektoren, Arrays, sogar höherdimensionalen Objekten und Kombinationen davon arbeiten. Der Ausdruck für die Summe der Zahlen im oben erstellten Vektor „A“ lautet beispielsweise einfach
+/A
wobei / der „Reduktions“-Operator ist, der bewirkt, dass die Funktion auf der linken Seite nacheinander auf alle Elemente des Operanden auf der rechten Seite angewendet wird. Der Ausdruck zur Berechnung des Durchschnitts der Zahlen in A verwendet ebenfalls die primitive Funktion ρ, um die Anzahl der Elemente in A zu bestimmen:
(+/A) ÷ ρA
Hier sind einige Tabellen aus dem 1970 erschienenen „APL360 User’s Manual“ 3, die einen Eindruck von der Leistungsfähigkeit und Raffinesse der eingebauten APL-Funktionen und Operatoren vermitteln. (Klicken Sie auf die Bilder für größere Versionen.)
APL ermutigt Sie, anders über das Programmieren zu denken und temporäre hochdimensionale Datenstrukturen als Zwischenwerte zu verwenden, die dann mit den mächtigen Primitiven reduziert werden. Ein berühmtes Beispiel ist das folgende kurze, aber vollständige Programm zur Berechnung aller Primzahlen bis zu R.
(~T∊T∘.×T)/T←1↓⍳R
So wird dieser Ausdruck ausgewertet:
Ausdruck |
Bedeutung |
Wert, wenn R gleich 6 ist |
|||||||||||||||||||||||||
⍳R |
Erzeuge einen Vektor von Zahlen von 1 bis R. |
1 2 3 4 5 6 |
|||||||||||||||||||||||||
T←1↓ |
Verwerfen Sie das erste Element des Vektors und weisen Sie den Rest dem temporären Vektor T zu. |
2 3 4 5 6 |
|||||||||||||||||||||||||
T∘.×T |
Erstelle das äußere Multiplikationsprodukt: eine Tabelle, die das Ergebnis der Multiplikation jedes Elements von T mit jedem Element von T enthält. |
|
|||||||||||||||||||||||||
T∊ |
Verwenden Sie den Operator „Mengenmitgliedschaft“, um herauszufinden, welche Elemente von T in der Tabelle enthalten sind. |
0 0 1 0 1 |
|||||||||||||||||||||||||
~ |
Negativieren Sie das Ergebnis, um festzustellen, welche Elemente von T nicht in der Tabelle enthalten sind. Dies sind die ganzen Zahlen, die keine Vielfachen in der Tabelle haben. |
1 1 0 1 0 |
|||||||||||||||||||||||||
( )/T |
Wählen Sie die Elemente von T, die wir identifiziert haben. Dies sind alle Primzahlen, die kleiner als R sind. |
2 3 5 |
Beachten Sie, dass es in diesem Programm keine Schleifen gibt. Die Leistungsfähigkeit von APL-Ausdrücken bedeutet, dass bedingte Verzweigungen und Schleifen viel seltener benötigt werden als in traditionelleren Programmiersprachen.
APL-Operatoren können auf einfache Weise für alle Arten von Berechnungen verwendet werden, die normalerweise Schleifen erfordern würden. Ein Ausdruck, der die Anzahl der Elemente des Vektors X berechnet, die größer als 100 sind, lautet zum Beispiel
+/X>100
Das funktioniert, weil X>100 einen Bitvektor aus 0en und 1en zurückgibt, der anzeigt, welche Elemente von X größer als 100 sind, und +/ alle Bits in diesem Vektor addiert.
Aber bedingte Ausführung und Schleifen werden natürlich manchmal benötigt. Im Lichte späterer Entwicklungen in der strukturierten Programmierung ist APLs einziges Primitiv zur Kontrollübergabe, die Anweisung „GO TO LINE x“ →, besonders schwach. Hier ist ein Beispiel für eine Funktion, die den größten gemeinsamen Teiler ihrer beiden Argumente berechnet. Die letzte Anweisung erzeugt eine Schleife, indem sie an den Anfang verzweigt. In Zeile 2 führt die bedingte Übergabe der Kontrolle an Zeile 0 dazu, dass die Funktion beendet wird und den Wert zurückgibt, der G zuletzt zugewiesen wurde.
Wenn Sie mehr über die APL-Sprache der 1960er Jahre erfahren möchten, lesen Sie das Referenzhandbuch „APL Language“ 2 und Paul Berrys „APL360 Primer“ 4 aus dem Jahr 1969.
Die Sprache hat sich im Laufe der Jahre natürlich weiterentwickelt, und neuere Versionen enthalten Kontrollstrukturen wie IF-THEN-ELSE.
Wie APL implementiert wurde
Die erste Computerimplementierung der APL-Notation war ein stapelorientierter Sprachinterpreter, der 1965 in FORTRAN für den IBM 7090-Großrechner geschrieben wurde, und zwar von Larry Breed im IBM-Forschungszentrum in Yorktown Heights, New York, und Philip Abrams, damals Doktorand an der Stanford University.
Die erste interaktive Version wurde bald darauf für die 7093 (eine experimentelle 7090 mit virtuellem Speicher) von Larry Breed und Roger Moore geschrieben. Sie lief unter dem TSM-Timesharing-System und wurde scherzhaft „IVSYS“ genannt, was sich auf „IBSYS“ reimt, den Namen für das Standardbetriebssystem 7090. In einer E-Mail aus dem Jahr 2012 schreibt Breed:
IVSYS ermöglichte das An- und Abmelden, die sofortige Ausführung und die Definition von Funktionen; es bot Arbeitsbereiche, sowohl aktive als auch gespeicherte. Die Implementierung dieser Funktionen war rudimentär; meistens haben wir das verwendet, was das TSM-Projekt uns für Login/Logout/Speichern von Dateien angeboten hat. Wir hatten nur wenige Wochen Zeit, die 7093 zu nutzen, bevor sie außer Dienst gestellt wurde und Roger und ich mit der Planung für ein eigenständiges System auf System/360 begannen. In diesen Wochen sahen Ken und seine Gruppe zum ersten Mal, wie eine ausführbare APL aussehen würde.
Eine weitere Implementierung einer Teilmenge der Sprache wurde 1967 für den IBM 1130 Minicomputer erstellt.
Die erste Implementierung von APL, die außerhalb von IBM weite Verbreitung fand, war für das IBM System/360. Unter dem Namen „APL360“ wurde sie im November 1966 zuerst bei IBM in Betrieb genommen. (Die Schreibweise „APL360″ hatte, da der Backslash der APL-„Expansions“-Operator war, auch eine versteckte Bedeutung: „APL erweitert die 360″).
Breed sagt über die Zeit kurz davor,
Diese Zeit, Anfang 1966, war die Übergangszeit von der Iverson Notation zu APL. (In der Tat kam Adin im Frühjahr ’66 mit „APL“ an.) Die Verfeinerung und Erweiterung der Sprache und der Umgebung dauerte viele Jahre. Es wurde so gut wie kein Code hinzugefügt, um eine kommerzielle Version zu erstellen, nur Papierkram.
Ab August 1968 war APL360 für IBM-Kunden als nicht unterstütztes („Typ III“) Programm in IBMs „Contributed Program Library“ 5 verfügbar. Die Hauptimplementierer waren Larry Breed, Dick Lathwell und Roger Moore; andere, die dazu beigetragen hatten, waren Adin Falkoff und Luther Woodrum.
Frühe APL-Entwickler, von links nach rechts: Dick Lathwell, Ken Iverson, Roger Moore, Adin Falkoff, Phil Abrams, Larry Breed. Das Foto wurde etwa 1983 aufgenommen.
Aufgrund der dynamischen Natur der APL-Variablen wurde APL360 als Interpreter implementiert, nicht als Compiler, der Maschinencode erzeugt. Die Programme wurden in einer internen Form gespeichert, die als „Codestring“ bezeichnet wurde und direkt dem entsprach, was der Benutzer eingetippt hatte. Der Interpreter untersuchte dann den Codestring, während das Programm ausgeführt wurde, und wies dynamisch Variablen zu und konfigurierte sie neu, wenn Ausdrücke ausgewertet wurden.
Die ersten Versionen von APL360 übernahmen die Kontrolle über die gesamte Maschine. Es war also eine Kombination aus Betriebssystem, Dateisystem, Timesharing-Monitor, Befehlsinterpreter und Programmiersprache. Angesichts des begrenzten Hauptspeichers wurden die Arbeitsbereiche der Benutzer je nach Bedarf auf die Trommel oder die Festplatte ausgelagert. Die Leistung war beeindruckend, was Larry Breed in seiner klaren und prägnanten Beschreibung der Implementierung auf die Fähigkeit zurückführt, das Betriebssystem auf die Anforderungen der Sprache zuzuschneiden.
APL360 war eine Konversationssprache, die eine schnelle Reaktion und effiziente Ausführung für bis zu 50 gleichzeitige Benutzer ermöglichte. Jeder Benutzer verfügte über einen „aktiven Arbeitsbereich“, der Programme, Variablen und den Status der unterbrochenen Programmausführung enthielt. Systembefehle wie „)LOAD“, „)SAVE“ und „)COPY“ verwalteten die Bibliothek der gespeicherten Arbeitsbereiche des Benutzers. Andere Systembefehle steuerten Sprachfunktionen; mit „)ORIGIN“ konnte der Programmierer beispielsweise festlegen, ob Vektoren und Arrays mit 0 oder 1 beginnend nummeriert werden sollten.
APL war für viele Programmierer der Generation, die unter der Stapelprogrammierung mit Lochkarten gelitten hatte, die erste Einführung in die interaktive Zeiteinteilung.
Anwendungen von APL
Selbst bevor es eine Computerprogrammiersprache war, war die Iverson-Notation als Sprache zur Dokumentation von Algorithmen für Menschen nützlich. Das klassische Beispiel ist die formale Definition der Befehlssatzarchitektur des neuen IBM System/360-Computers, die in einem Artikel im IBM Systems Journal von Adin Falkoff, Ken Iverson und Ed Sussenguth 1965 veröffentlicht wurde.
Die Beschreibung, die eher formal als verbal ist, wird durch eine Reihe von Programmen erreicht, die durch gemeinsame Variablen interagieren, die in Verbindung mit Hilfstabellen verwendet werden… Obwohl die formale Beschreibung vollständig und in sich geschlossen ist, wird Text als Hilfe für das anfängliche Studium bereitgestellt.
Aber der in der Arbeit enthaltene Text ist viel mehr als das. Er ist eine zeilenweise Erläuterung der formalen Beschreibung, was bedeutet, dass er auch eine Demonstration und Erläuterung der deskriptiven Kraft von APL ist.
Die Notation verwendet den grafischen Stil für Kontrollübertragungen, der in Iversons Buch zu finden war. Hier ist zum Beispiel die Beschreibung einer Speicherzugriffsoperation. (Zum Vergrößern bitte anklicken.)
Der Übergang der APL von einer Notation für Veröffentlichungen zu einer interaktiven Computerprogrammiersprache hat ihr zum Erfolg verholfen. Als die APL360-Implementierung verfügbar war, förderten IBM und andere die Nutzung durch die Entwicklung verschiedener Anwendungen wie dieser:
- Starmap: Ein Satz von APL-Funktionen zur Berechnung und Darstellung der Positionen von Sternen und Planeten. 8 9 Es wurde 1973 von Paul Berry von IBM und John Thorstensen geschrieben, damals Astronomiestudent am Bryn Mawr College, heute Professor für Physik und Astronomie am Dartmouth College. Es verwendet klassische Lösungen der Keplerschen Gleichungen für ein bestimmtes Datum und eine bestimmte Zeit sowie eine Reihe von Koordinatendrehungen, um zu zeigen, wo die Planeten und Sterne in der Himmelsschale erscheinen würden.
- IBGS: Interactive Business Game Simulation: „Eine allgemeine Computer-Management-Simulation, die Entscheidungsfindung und Planung in den Funktionsbereichen Produktion, Marketing und Finanzen beinhaltet.“
- Nullstellen und Integrale in APL: „Unter Verwendung sowohl klassischer Methoden wie der von Newton und Muller als auch neu entwickelter Methoden wie der von Jenkins und Traub findet es reelle Nullstellen einer reellen Funktion, reelle und komplexe Nullstellen eines Polynoms mit reellen oder komplexen Koeffizienten und komplexe Nullstellen einer komplexen Funktion.“
- Graphpak – Interaktives Grafikpaket für APL360: „…Fähigkeiten, die von der Unterstützung von Grafikschnittstellen auf der untersten Ebene bis zu mehreren Anwendungsbereichen auf höheren Ebenen reichen…Eine Plotkomponente…linear oder logarithmisch…Kurvenanpassung… Eine Komponente für darstellende Geometrie ermöglicht die Definition, Skalierung, Vergrößerung, Translation, Rotation und projizierte Darstellung dreidimensionaler Objekte.“
- Graphen und Histogramme in APL: „erzeugt Kurven und Balkendiagramme auf einem Schreibmaschinenterminal“.
- APL Koordinatengeometrie-System: „löst Koordinatengeometrie-Probleme interaktiv an einem Terminal…zur Verwendung durch Vermesser, Bauingenieure, Stadtplaner…“
- APL/PDTS – Programming Development Tracking System: „…zur Unterstützung von Managern und Planern bei der Überwachung der Leistung im Vergleich zum Plan bei der Programmierung von Entwicklungsprojekten.“ MINIPERT: „Ein CPM-System (Critical Path Method) für das Projektmanagement“
- APL Econometric Planning Language: „Der praktizierende Wirtschaftswissenschaftler, Wirtschaftsprognostiker oder Lehrer erhält einfach zu bedienende Werkzeuge für die interaktive Modellerstellung und Modelllösung.“
- APL Financial Planning System: „Ermöglicht dem Finanzanalysten und -planer, Berichte zu entwerfen, Berechnungsanweisungen zu spezifizieren, Daten einzugeben und zu ändern und gedruckte Berichte mit sofortiger Bearbeitung zu erhalten.“
- APL Text Editor and Composer: „Dieses Programm wurde entwickelt, um Text interaktiv an einem Terminal zu verarbeiten … Es enthält Funktionen zum Eingeben, Überarbeiten, Verfassen, Drucken und Speichern von Text … für Sekretärinnen, Wissenschaftler, Ingenieure, Verwaltungsangestellte und alle anderen, die Papiere, Briefe, Berichte oder Spezifikationen erstellen.“
Viele dieser Anwendungen legten Wert auf Interaktivität, was eine enorme Produktivitätssteigerung gegenüber der damals üblichen Stapelverarbeitung bedeutete. Darüber hinaus konnten mit APL Anwendungen viel schneller entwickelt werden. In einer E-Mail aus dem Jahr 2012 merkte Larry Breed an,
In allen Bereichen macht die Geschwindigkeit, mit der APL-Programme geschrieben werden können, sie für die Modellierung und das Prototyping wertvoll … Ein Beispiel: Um 1973 benötigte Continental Can ein Inventarsystem für seine 21 Produktionsstätten. Ihr Team von FORTRAN-Programmierern hatte ein Jahr lang gearbeitet, ohne dass ein Erfolg in Sicht war. Ein STSC-Verkäufer baute an einem Wochenende ein brauchbares Arbeitsmodell in APL Plus.
Die Bereiche, in denen APL die größte Verbreitung hatte, waren wissenschaftliche, versicherungsmathematische, statistische und finanzielle Anwendungen. Einzelheiten über die Entwicklung von APL in den ersten 25 Jahren finden Sie in der Sonderausgabe 1991 des IBM System Journal 10 mit 12 Beiträgen und einem Aufsatz zu diesem Thema.
APL Lob und Kritik APL wurde ursprünglich nicht als Programmiersprache entwickelt. Wie Iverson sagte,
Das ursprüngliche Motiv für die Entwicklung von APL war es, ein Werkzeug zum Schreiben und Lehren bereitzustellen. Obwohl APL vor allem in der kommerziellen Programmierung genutzt wurde, glaube ich weiterhin, dass ihr wichtigster Nutzen noch nicht ausgeschöpft ist: als einfache, präzise, ausführbare Notation für den Unterricht in einer Vielzahl von Fächern.11
Mit so vielen knappen und ungewöhnlichen Symbolen haben APL-Computerprogramme, wie die mathematische Notation, die sie inspiriert hat, eine Prägnanz und Eleganz, die viele ansprechend finden. APL zieht fanatische Anhänger an. Alan Perlis (der erste Empfänger des Turing-Preises der ACM im Jahre 1966) war einer von ihnen:
Der Blick über einen einzigen Satz kann ein kompliziertes, geniales und schönes Zusammenspiel von Bedienung und Kontrolle aufdecken, das in anderen Programmiersprachen erst nach mehreren Seiten Text sichtbar wird. Man beginnt die Entstehung und Bedeutung des Stils zu schätzen. 12
Viele finden die Freiheit des Ausdrucks in APL befreiend.
Ich habe sie früher als ‚faschistische Programmiersprache‘ bezeichnet, weil sie diktatorisch starr ist. …Wenn Pascal faschistisch ist, ist APL anarchistisch. 13
Aber APL-Programme sind oft kryptisch und schwer zu entschlüsseln. Einige haben gescherzt, dass es eine „Nur-Schreib-Sprache“ ist, weil selbst der Autor eines Programms später Schwierigkeiten haben könnte, es zu verstehen. Sie inspiriert zu Programmiertricksereien. Der Herausforderung, einen APL-„Einzeiler“ zu schreiben, um einen kompletten komplexen Algorithmus zu implementieren, kann man nur schwer widerstehen. Hier sind zum Beispiel zwei verschiedene APL-Einzeiler, die Versionen von John Conways „Spiel des Lebens“ implementieren:
Leben←{1 ω∨.∧3 4=+/,¯1 0 1∘.⊖¯1 0 1∘.⌽⊂ω}
Nicht für schwache Nerven, klar. Der niederländische Informatiker Edsger Dijkstra sagte,
APL ist ein Fehler, der bis zur Perfektion durchgeführt wurde. Es ist die Sprache der Zukunft für die Programmiertechniken der Vergangenheit: Sie schafft eine neue Generation von Programmiermuffeln. 14
Aber Fans von APL würden sagen, dass die kryptische APL-Kodierung ein schlechter Programmierstil ist, der jede Sprache befallen kann. APL biete eine reichhaltigere Palette für den Ausdruck von Algorithmen, so das Argument, so dass man härtere Probleme schneller und mit weniger irrelevantem syntaktischem Durcheinander lösen könne.
Wie auch immer man dazu steht, APL und die von ihr inspirierten Sprachen wie APL2 und J sind immer noch ein aktiver Teil des vielfältigen Programmiersprachenuniversums.
Eine kurze Biographie von Ken Iverson
Kenneth Eugene Iverson wurde am 17. Dezember 1920 auf einer Farm in der Nähe von Camrose, Alberta, Kanada geboren. Bis zum Ende der 9. Klasse wurde er in ländlichen Einraumschulen unterrichtet. Dann brach er die Schule ab, weil er auf dem Höhepunkt der Depression auf der Familienfarm arbeiten musste. Später sagte er, der einzige Grund, die Schule fortzusetzen, wäre gewesen, Lehrer zu werden, und das war ein Beruf, den er auf keinen Fall wollte. Während der langen Wintermonate lernte er allein Kalkül.
1942 wurde er eingezogen, und während seines Dienstes belegte er genügend Fernkurse, um die High School fast abzuschließen. Nach dem Militärdienst erwarb er einen B.A. in Mathematik und Physik an der Queen’s University in Kingston Ontario und anschließend einen M.A. in Physik an der Harvard University. Im Jahr 1954 promovierte er bei dem Computerpionier Howard Aiken mit einer Arbeit zum Thema „Machine Solutions of Linear Differential Equations: Applications to a Dynamic Economic Model“.
Nach Abschluss seiner Promotion trat Iverson in die Harvard-Fakultät ein, um in Aikens neuem Programm für automatische Datenverarbeitung zu unterrichten. Er war dort ein Jahr lang als Dozent und fünf Jahre lang als Assistenzprofessor tätig. Er war zunehmend frustriert über die Unzulänglichkeit der konventionellen mathematischen Notation zur Beschreibung von Algorithmen und begann daher, seine eigenen zu erfinden.
Im Jahr 1960 trat Iverson auf Anraten von Frederick Brooks, der einer seiner Lehrbeauftragten in Harvard gewesen war und nun bei IBM arbeitete, in das neue IBM-Forschungszentrum in Yorktown Heights, New York, ein. Die beiden arbeiteten gemeinsam an der weiteren Entwicklung der neuen Notation. 1962 veröffentlichte Ken das inzwischen klassische Buch „A Programming Language“ 1, dessen Titel der Notation, die bis dahin informell als „Iverson’s notation“ bezeichnet worden war, den Namen APL gab.
Iverson arbeitete während seiner gesamten Zeit bei IBM weiter an der Entwicklung der APL. 1980 verließ er IBM und kehrte nach Kanada zurück, um für I.P. Sharp Associates zu arbeiten, die einen auf APL basierenden Timesharing-Dienst eingerichtet hatten.
Im Jahr 1987 zog er sich aus dem bezahlten Arbeitsverhältnis zurück und widmete seine volle Aufmerksamkeit der Entwicklung eines moderneren APL-Dialekts. APL wurde erfolgreich für kommerzielle Zwecke eingesetzt, aber Iverson wollte eine neue, einfache, ausführbare Notation entwickeln, die sich besser für den Unterricht eignet und zu geringen Kosten erhältlich ist. Die erste Implementierung dieser Sprache, J genannt, wurde auf der APL90-Benutzerkonferenz angekündigt.
Iversons Fähigkeit, solche Sprachen zu entwickeln, entsprang seiner „schieren Freude an Sprache und Worten“, erinnert sich seine Tochter Janet Cramer. „Er las Wörterbücher, wie man Romane liest.“ Iverson hielt es für wichtig, dass die Sprache, sowohl die englische als auch die mathematische, klar und prägnant kommuniziert.
Mit seinen Mitarbeitern, zu denen auch sein Sohn Eric gehörte, arbeitete Iverson weiter an der Entwicklung von J und veröffentlichte weiterhin fleißig. Am Samstag, dem 16. Oktober 2004, erlitt er einen Schlaganfall – während er an einem J-Tutorial arbeitete – und starb drei Tage später, am 19. Oktober, im Alter von 83 Jahren.
Es gibt viele Geschichten über Ken Iverson. Hier sind ein paar:
Ken hat in Harvard keine Festanstellung bekommen. Er war fünf Jahre lang Assistenzprofessor und die Fakultät beschloss, ihn nicht für eine Beförderung vorzuschlagen. Ich fragte ihn, was schief gelaufen sei, und er sagte: „Nun, der Dekan rief mich zu sich und sagte: ‚Das Problem ist, dass Sie nichts außer einem kleinen Buch veröffentlicht haben'“. Dieses eine kleine Buch wurde später mit dem Turing Award ausgezeichnet. Ich denke, das ist eher ein Kommentar zu der konventionellen Denkweise bei Beförderungsverfahren als ein Kommentar zu Ken; es ist ein Kommentar zu akademischen Verfahren und zu Harvard.
– Fred Brooks, A Celebration of Kenneth Iverson, 2004-11-30
In einem frühen Vortrag erläuterte Ken die Vorteile des toleranten Vergleichs. Ein Zuhörer fragte ungläubig: „Sie meinen doch nicht etwa, dass, wenn A=B und B=C ist, A nicht gleich C sein kann?“ Ohne mit der Wimper zu zucken, antwortete Ken: „Jeder Schreiner weiß das!“ und ging zur nächsten Frage über.
– Paul Berry
In einem geselligen Gespräch mit Ken sagte ich: „Weißt du, Ken, du bist mein Lieblingssprachentwickler und Don Knuth ist mein Lieblingsprogrammierer.“ Und Ken sagte sofort: „Was ist denn mit meiner Programmierung los?“
– Joey Tuttle, A Celebration of Kenneth Iverson, 2004-11-30
1973 oder 1974 hielten Ken und ich einen Vortrag bei Kodak in Rochester vor einer Gruppe von 40 bis 50 Programmierern, die in PL/I arbeiten mussten. In der Fragerunde sagte ein leitender Angestellter: „Wenn ich Sie richtig verstanden habe, schlagen Sie vor, dass wir eine neue Denkweise annehmen sollten.“ Daraufhin sprang Ken von seinem Stuhl auf und sagte: „Ja, das ist genau das, was ich sage!“
– Joey Tuttle, A Celebration of Kenneth Iverson, 2004-11-30
Danksagungen
Dank an Michael Karasick, Yvonne Perkins, Steve Selbst und Ken Edwards von IBM für die Beendigung meiner zehnjährigen Odyssee, um die Erlaubnis zur Veröffentlichung des APL-Quellcodes zu erhalten. Dank an Curtis Jones, Larry Breed, Paul Berry und Roy Sykes für ihre Kommentare zu einem frühen Entwurf dieses Artikels.
– Len Shustek
Bibliographie
- K. E. Iverson, A Programming Language, John Wiley and Sons, Inc. 1962.
- IBM, „APL Language,“ March 1975.
- IBM, „APL360 User’s Manual“, März 1970.
- IBM, Paul Berry, „APL360 Primer – Student Text,“ 1969.
- L. M. Breed und R. H. Lathwell, „APL360“, 1968.
- L. M. Breed und R. H. Lathwell, „The Implementation of APL360,“ in ACM Symposium on Experimental Systems for Interactive Applied Mathematics, 1967.
- A. D. Falkoff, K. E. Iverson und E. H. Sussenguth, „A Formal Description of SYSTEM/360,“ IBM Systems Journal, vol. 3, no. 3, pp. 198-261, 1964.
- P. C. Berry und J. R. Thorstensen, „Starmap,“ 1978.
- P. C. Berry und J. R. Thorstensen, „Starmap,“ IBM Systems Development Division, 1975.
- IBM Systems Journal, vol. 30, no. 4, 1991.
- K. E. Iverson, „A Personal View of APL,“ IBM Systems Journal, vol. 30, no. 4, 1991.
- A. J. Perlis, „In Praise of APL: A Language for Lyrical Programming,“ SIAM News, June 1977.
- B. McCormick, „A Programming Language,“ 2000,2002.
- E. W. Dijkstra, „How Do We Tell Truths That Might Hurt?“,“ SIGPLAN Notices, vol. 17, no. 5, Mai 1982.
- A. D. Falkoff und K. E. Iverson, „The Design of APL,“ IBM Journal of Research and Development, vol. 17, no. 4, 1973.
- A. D. Falkoff und K. E. Iverson, „The Evolution of APL,“ SIGPLAN Notices, vol. 13, no. 8, pp. 45-57, August 1978.
- L. Breed, „How We Got to APL1130,“ 10 May 2004.
- ACM, „Proceedings of the APL’69 Conference on APL“, SUNY Binghamton, NY, 1969.
- „The Origins of APL – 1974“; ein wunderbares Interview mit den ursprünglichen Entwicklern von APL.
Historische Quellcode-Veröffentlichungen
- MacPaint and QuickDraw Source Code, 18. Juli 2010
- APL Programming Language Source Code, 10. Oktober 2012
- Adobe Photoshop Source Code, 13. Februar 2013
- Apple II DOS Source Code, 12. November 2013
- Microsoft MS-DOS Early Source Code, 25. März 2014
- Microsoft Word for Windows Version 1.1a Source Code, March 25, 2014
- Early Digital Research CP/M Source Code, October 1, 2014
- Xerox Alto Source Code, October 21, 2014
- Electronic Arts DeluxePaint Early Source Code, July 22, 2015