- A Programming Language
-
APL, abgekürzt für A Programming Language, ist eine üblicherweise interpretierte Programmiersprache. Sie wurde von Kenneth E. Iverson und seinen Kollegen bei IBM in der 1960er Jahren als algorithmische Notation entwickelt. Einige Jahre später wurde APL als Programmiersprache auf Großrechnern implementiert und den Kunden als Timesharing-Option angeboten. Zu jener Zeit wurden IBM-Kugelkopf-Schreibmaschinen als „Terminal“ verwendet. Die ersten Implementierungen auf PCs benötigten ein Spezial-EPROM, damit der APL-Zeichensatz angezeigt werden konnte. Eine Vorläufer-Implementierung gab es schon 1975 auf der IBM 5100. Heute reicht die Installation eines APL-Zeichensatzes aus. Außerdem wurden seinerzeit spezielle Tastaturen verwendet, die später durch eine Bildschirmanzeige der Tastaturbelegung ersetzt wurden.
Inhaltsverzeichnis
Besonderheiten
Interaktivität
APL ist interaktiv: nach der Eingabe eines Befehls bzw. einer Reihe von Befehlen drückt man <Enter>, der/die Befehle werden vom Interpreter ausgeführt und das Ergebnis angezeigt. Tritt ein Fehler auf, erhält man eine entsprechende Meldung. Man kann seine Eingabe modifizieren und erneut ausführen. Die dadurch mögliche direkte Interaktion mit dem Computer ist bis heute einer der großen Vorteile von APL.
Programmcode
Folgen von Befehlen lassen sich zu Programmen zusammenfassen. Bis in die 1990er Jahre fehlten APL Kontrollstrukturen. Logik musste durch Sprunganweisungen realisiert werden, was zu schwer les- und wartbaren Programmen führte.
Datentypen
APL kennt die Datentypen Char, Bool, Int und Float, allerdings muss der Programmierer dies nicht unbedingt wissen beziehungsweise berücksichtigen, denn der Interpreter wandelt die Datentypen automatisch um, wann immer dies notwendig ist. Dies bedeutet auch, dass APL keine Typenprüfung kennt.
Speicherverwaltung
Auch die Speicherverwaltung wird vom Interpreter übernommen. Ein APL-Programmierer muss sich weder um das Reservieren noch um das Freigeben von Speicher kümmern.
Array-Verarbeitung
Fast alle Funktionen in APL sind non-skalar ausgelegt. Dies bedeutet, dass Funktionen nicht nur auf einzelne Skalare, sondern auch auf Vektoren, Matrizen und vieldimensionale Daten angewendet werden können.
Beispiele
In jeder Programmiersprache geht dies:
2 + 3 5
In APL geht aber auch:
2 3 4 + 3 5 6 7
und auch dies:
2 3 4 + 5 6 7 7 9 11
Ausführung und Rangfolge
Es gibt in APL nur eine einzige Rangfolgenregel: alles wird von rechts (!) nach links abgearbeitet (Polnische Notation). Eine selbstverständliche Ausnahme: Ausdrücke in Klammern werden zuerst abgearbeitet. Daher gilt:
10×2+3 50
aber:
(10×2)+3 23
Funktionen und Operatoren
APL kennt sowohl Funktionen als auch Operatoren, aber die Bedeutung der Begriffe ist anders als in der Mathematik: Funktionen werden auf Daten angewendet, Operatoren auf Funktionen und Daten. Funktionen liefern Daten zurück, Operatoren sogenannte „abgeleitete Funktionen“ (engl.: derived function).
Beispiel
Das Zeichen Slash (/) steht für den Operator Reduce. Operatoren erwarten einen oder zwei Operanden. Wird nur ein Operand verwendet, dann muss er links neben dem Operator stehen:
+/
In diesem Beispiel ist der Operand die Funktion „Plus“. Zusammen mit dem Operator wird die abgeleitete Funktion Summiere gebildet.
Angewendet auf einen Vektor:
+/ 3 4 5
bewirkt der Operator Reduce, dass der Operand zwischen die einzelnen Bestandteile des Vektor eingefügt wird. Abstrakt ausgedrückt:
f/ n1 n2 n3 == n1 f n2 f n3
und im konkreten Beispiel:
+/ 3 4 5 == 3 + 4 + 5
Wie mächtig dieses Konzept ist, wird aber erst bei Betrachtung eines anderen Operators klar: Expand (Backslash, \) verwendet den Operanden in der gleichen Weise wie Reduce, gibt aber Zwischenergebnisse aus:
+\ 3 4 5 3 7 12
Weitere Beispiele
x/ 3 4 5 60 x\3 4 5 3 12 60 -/3 4 5 4 -\3 4 5 3 ¯1 4
Selbstverständlich gibt es auch Operatoren, die zwei Operanden verlangen. Der Operator Outer Product (.) ist ein solcher Operator. Verwendet man als Operanden die Funktionen Plus (+) und Mal (x), dann entsteht in APL die Matrizenmultiplikation:
1 2 3 +.x 40 50 60 320
Das funktioniert genauso mit Matrizen. Um dies zu demonstrieren, sind in dem Bild einige Zeilen aus einer APL-IDE (hier Dyalog APL/W) dargestellt. Es werden neben + und x drei APL-Funktionen verwendet:
- Der nach links weisende Pfeil wird in APL verwendet, um die Zuweisung eines Wertes auf einen Variablennamen zu symbolisieren.
- Das einem i ähnelnde Zeichen iota entstammt dem griechischen Alphabet und steht hier für die APL-Funktion Interval. Im ersten Anwendungsfall wird eine Zahlenkette von 1 bis 6 erzeugt.
- Das dem Buchstaben p ähnelnde Zeichen rho entstammt dem griechischem Alphabet und steht für die APL-Funktion shape. Diese Funktion formatiert die rechts angegeben Daten. Die Anzahl der Achsen wird links von dem Zeichen angegeben. In dem ersten Anwendungsfall wird eine Matrix mit 2 Zeilen und 3 Spalten erzeugt.
Mächtigkeit und Lesbarkeit
APL ist mächtig: Keine andere Sprache kann mit dieser Kürze und Stringenz aufwarten. Wo in anderen Programmiersprachen viele Zeilen vonnöten sind, reicht bei APL häufig schon eine Anweisung mit einigen Symbolen aus. Typisch sind die berühmt-berüchtigten „One-Liner“, eine Spielwiese ehrgeiziger APL-Programmierer. So ist es z. B. möglich, das n-Damen-Problem in einer Zeile zu realisieren. Natürlich bedeutet dies zugleich, dass ein APL-Statement auch schwerer zu verstehen ist – dies war ein Hauptargument gegen den kommerziellen Einsatz von APL: die praktische Unwartbarkeit der Programme. Durch eine großzügige Kommentierung des Programms lässt sich das Problem allerdings eingrenzen.
Ausführungsgeschwindigkeit
Da APL interpretiert wird, ist es vergleichsweise langsam in der Ausführung. Dies macht sich besonders dann unangenehm bemerkbar, wenn ein APL-Programm sich um einzelne Datenteilchen kümmern muss, zum Beispiel in einem KeyPress-Event-Handler. Andererseits umfasst APL einen großen Vorrat hochspezialisierter Funktionen, die für die Verarbeitung großer Arrays optimiert sind. Werden diese Funktionen auf große Datenmengen angewendet, dann können APL-Funktionen sehr schnell sein.
Entwicklung und aktuelle Situation
Bis ca. 1985 war IBM mit ihrem APL2-Interpreter auf PCs wie auf Mainframes der führende Anbieter. In den folgenden knapp 10 Jahren wurde die Sprache dann aber nicht nennenswert weiterentwickelt. Erst seit ca. 1992 haben kleinere Software-Firmen (APL2000, Dyalog APL) APL kontinuierlich weiterentwickelt. Mittlerweile haben diese Implementierungen IBMs APL2 in Sachen Leistungsfähigkeit teilweise hinter sich gelassen, während IBM APL2 durch seine Integrationsfähigkeit in die Java-Welt besticht.
Die derzeit beste Implementierung, Dyalog APL, wurde von Microsoft in den Kreis der anerkannten .NET-Sprachen aufgenommen. IBM APL2 ist dagegen erste Wahl in IBMs Websphere Welt.
In den EDV-Abteilungen großer wie mittelgroßer Firmen konnte sich APL nie richtig durchsetzen. Wahrscheinlich beruht jedoch der Erfolg vieler Firmen auf dem Einsatz dieser Programmiersprache weil sie das Werkzeug zum Prototyping mathematisch wissenschaftlicher Verfahren war und in dieser Rolle nie ersetzt wurde. Bedeutung hat APL2 heute noch in der Banken-, Versicherungs- und der Tourismusbranche.
Heute wird APL in kleinen Projekten von spezialisierten Software-Firmen eingesetzt sowie als Werkzeug von Fachleuten, die sich eher als Systemanalytiker oder Business-Analysten denn als Programmierer bezeichnen. Auch in den Fachabteilungen größerer Unternehmen wird es immer noch gerne eingesetzt.
J und APL
In seinen späten Jahren hat der Designer von APL, Ken Iverson, einen zweiten Versuch gewagt. Das Ergebnis ist die Sprache J, die nichts mit Microsofts J zu tun hat. Diese Sprache ähnelt in ihren Konzepten sehr stark APL, verwendet aber ausschließlich Zeichen des ASCII-Zeichensatzes. Dies wird von Anhängern als gewaltiger Fortschritt, von Gegnern als Katastrophe betrachtet.
Weblinks
Implementierungen
Periodika
Über APL
- APL Wiki
- APL-Germany e.V. - Deutsche Anwendervereinigung
- Über APL
- Leichtverständliche Einführung in APL
Syntax
Wikimedia Foundation.