APL (Programmiersprache)

APL (Programmiersprache)
IBM 5100 Mikrocomputer mit APL-Tastatur

APL, abgekürzt für A Programming Language, ist eine üblicherweise interpretierte Programmiersprache, deren Syntax überwiegend aus Symbolen besteht. Sie wurde von Kenneth E. Iverson und seinen Kollegen[1] bei IBM in den 1960er Jahren als algorithmische Notation[2] 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.

Ab 1975 gab es eine Implementierung auf der IBM 5100, einem PC-ähnlichen Computer, der allerdings ein Mini-Computer war. Obwohl die Maschine nach damaligen Maßstäben durchaus leistungsfähig war, war APL auf der IBM 5100 langsam, denn es handelte sich um eine Simulation des Mainframe-APL-Interpreters.

Die ersten Implementierungen auf PCs benötigten ein Spezial-EPROM, damit der APL-Zeichensatz angezeigt werden konnte. Der APL-Zeichensatz wurde ursprünglich so gewählt, dass die Symbole möglichst selbsterklärend sind, dass sich also die Funktionen aus den Symbolen intuitiv herleiten lassen. Seit einigen Jahren wird der Begriff APL auch als Array Processing Language interpretiert.

Inhaltsverzeichnis

Besonderheiten

Interaktivität

APL war von Anfang an interaktiv: Nach der Eingabe eines Befehls drückt man Enter, der Befehl wird vom Interpreter ausgeführt und das Ergebnis angezeigt. Eine spezielle Anweisung für die Ausgabe des Ergebnisses, wie z. B. der PRINT-Befehl in BASIC ist nicht nötig, existiert aber für den Fall, dass ein Ergebnis angezeigt werden soll, das normalerweise nicht angezeigt würde.

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 als Entwicklungswerkzeug.

Aus heutiger Sicht klingt dies banal, aber APL war die erste Programmiersprache, die diesen Luxus bot: Konkurrierende Sprachen waren noch lange auf Lochkarten angewiesen.

Programmcode

Folgen von Befehlen lassen sich zu Funktionen zusammenfassen. Funktionen können Funktionen aufrufen. In der Tat ist APL die erste der funktionalen Programmiersprachen. Näheres und ein Beispiel siehe unten.

Bis in die 1990er Jahre fehlten APL Kontrollstrukturen. Logik musste durch Sprunganweisungen realisiert werden. In APL werden Kontrollstrukturen seltener als in anderen imperativen Programmiersprachen verwendet, einerseits weil APL-Funktionen (für Beispiele siehe weiter unten) nicht nur Skalare, sondern Datenstrukturen beliebiger Dimension verarbeiten, andererseits, weil es den Operator "Each" gibt.

Datentypen

APL kennt mindestens 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. Variablen müssen nicht deklariert werden, man kann einer Variablen eine Fließkommazahl zuweisen (oder einen Vektor oder eine Matrix von Fließkommazahlen) und danach einen Text, ohne dass es einer besonderen Anweisung davor bedarf.

Speicherverwaltung

Auch die Speicherverwaltung wird vom Interpreter übernommen. Ein APL-Programmierer muss sich während des Programmablaufs weder um das Reservieren noch um das Freigeben von Speicher kümmern. Der Arbeitsspeicher wird im sogenannten Workspace für Variablen und Programme insgesamt zur Verfügung gestellt, er kann beim Programmstart festgelegt werden und in manchen APL-Dialekten auch dynamisch erweitert werden.

Array-Verarbeitung

Fast alle Funktionen in APL sind auch nicht-skalar ausgelegt. Dies bedeutet, dass Funktionen nicht nur auf einzelne Skalare (Zahlen oder Characters), sondern auch auf Vektoren (Zahlenreihen), Matrizen (Tabellen) und mehrdimensional angeordnete Daten angewendet werden können.

Beispiele (die eingerückte erste Zeile ist die Benutzereingabe, die zweite Zeile die Antwort des APL-Interpreters)

In jeder Programmiersprache geht dies (Addition zweier Skalare):

    2 + 3
 5

In APL geht aber auch die Addition Vektor und Skalar:

    2 3 4 + 3
 5 6 7

und auch die Addition zweier Vektoren:

    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. Eine selbstverständliche Ausnahme: Ausdrücke in Klammern werden zuerst abgearbeitet. Daher gilt:

    10×2+3
 50

aber:

    (10×2)+3
 23

Variablen

In APL müssen Variablen nicht deklariert oder typisiert werden (siehe Datentypen). Eine Variable wird erzeugt, indem man einen Namen, gefolgt von einem Zuweisungspfeil (←), gefolgt vom Wert bzw. den Werten der Variablen definiert:

     XWERT←456.78
     YVECT←56 23 81.8 796 0.014 8.9 20
     TEXT1←'Dies ist ein Text'

Das Konzept der Konstanten, also unveränderbar deklarierter Werte, gibt es in APL nicht, es kann aber simuliert werden durch die Definition einer niladischen (=akzeptiert keine Argumente) Funktion, die ein explizites Ergebnis zurückliefert.

Geltungsbereich

Jede Zuweisung erzeugt eine globale Variable, d.h. die Variable ist "überall" sicht- und änderbar. Man kann den Geltungsbereich von Variablen aber einschränken, indem man den Namen der Variablen in die Kopfzeile einer Funktion aufnimmt. Eine solche Variable wird als lokal bezeichnet, da sie nur zur Laufzeit der Funktion sichtbar ist.

Wenn allerdings eine Funktion F1 eine lokale Variable A definiert und anschließend eine Funktion F2 aufruft, dann ist A innerhalb von F2 sicht- und änderbar, was heute als Designmakel gilt. Die "Direct Functions" in Dyalog APL verhalten sich allerdings anders: Dort sind lokale Variable tatsächlich im engeren Sinne lokal und auch in aufgerufenen Funktionen unsichtbar.

Arrays

Daten jeder Art werden in APL Arrays genannt. Arrays können unterschiedliche Dimensionen haben. Ein einzelner Wert wird Skalar genannt. Mehrere Werte nebeneinander bilden einen Vektor. Die Funktion zur Verkettung (Konkatenieren) mehrerer Skalare ist das Komma. Dabei ergibt sich die Besonderheit, dass man einen einzelnen Wert mit Nichts verketten kann und einen Vektor erhält, der aus einem einzigen Element besteht. Auch leere Vektoren sind erlaubt: Das sind Vektoren, die überhaupt kein Datenelement enthalten, sondern nur die Strukturinformation.

Werte, die in Zeilen und Spalten angeordnet sind, bilden Tabellen, auch Matrizen oder zweidimensionale Arrays genannt.

Die Dimension eines Arrays wird in APL mit dem griechischen Buchstaben Rho angegeben. Wenn von dem Rank eines Arrays die Rede ist, meint man die Anzahl der Dimensionen des Arrays, also Rho von Rho. Demzufolge ist der Rank eines Skalar 0, der Rank eines Vektors ist 1, der einer Tabelle 2 usw.

Die Ebenen eines dreidimensional angeordneten Arrays heißen Planes. Es sind Arrays mit n Dimensionen möglich, die Anzahl ist nur begrenzt durch die maximale Größe der Integer-Indizierung (231-1) und den zur Verfügung stehenden Speicherplatz.

Ein „Nested Array“ in APL2

Im Jahre 1986 brachte IBM ein erheblich erweitertes APL mit dem Namen APL2 auf den Markt. Die Erweiterung bestand hauptsächlich darin, dass jedes Element eines Arrays aus beliebigen anderen Datenstrukturen bestehen kann (Nested Array). Damit ergeben sich verschachtelte Strukturen. Da dies schwer vorstellbar ist, rechts ein Beispiel. Es handelt sich dabei um eine „normale“ numerische Matrix mit 4 Zeilen und 5 Spalten. Jedoch besteht das 2. Element der 2. Zeile aus einem Textvektor und das 4. Element der 3. Zeile aus einer 2x2 Matrix. Es lassen sich somit auch die Textlabels mit den numerischen Werten zu einer Tabelle verknüpfen. APL2 eröffnete die Möglichkeit, auch mixed arrays sowie einfache und komplexe Listen zu erzeugen.

Im Zuge dieser Erweiterung wurden auch neue sog. "primitive Funktionen" (primitive funktions) zur Bearbeitung der neuen Datenstrukturen eingeführt sowie die alten Funktionen angepasst bzw. in ihrem Geltungsbereich erweitert. Andere APL-Hersteller brachten ähnliche Erweiterungen ihrer Implementierungen heraus, wobei es jedoch feine Unterschiede gibt, die die Portierung eines Programms von einer Implementierung zur anderen – obwohl durchaus möglich – etwas erschweren. Heute gilt die APL2-Implementation als Referenz für alle Hersteller, man bemüht sich größtmögliche Kompatibilität.

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 (siehe darunter stehendes Ergebnis):

   +/ 3 4 5  ==  3 + 4 + 5
12

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, erzeugt aber Zwischenergebnisse und reduziert den Rang des Ergebnisses nicht (Reduce verwandelt einen Vektor in ein Skalar, eine Matrix in einen Vektor usw. – dies verringert die Notwendigkeit von Programmschleifen):

   +\ 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

Es gibt 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 +.× 40 50 60
320
APL-Statement

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.
  • Die Formel "+.×" symbolisiert das Matrizenprodukt.

Selbstdefinierte Funktionen

Zusätzlich zu den eingebauten Funktionen (primitive functions) kann man seine eigenen Funktionen schreiben, die dann selbstdefinierte Funktion (user-defined function) genannt werden. Eine solche Funktion kann kein (niladisch), ein (monadisch) oder zwei (dyadisch) Argumente erwarten bzw. verlangen. Gemäß seiner Abstammung als mathematischer Notation erwarten monadische APL-Funktionen ihr Argument rechts während dyadische Funktionen ein rechtes und ein linkes Argument erwarten.

Die Funktion kann einen Wert zurückliefern.

Beispiel für eine dyadische Funktion:

R ← Scale Runde Numeric

Dabei sei "Scale" die Zahl der Dezimalstellen, auf die das Argument "Numeric" zu runden ist; das Ergebnis steht in R. Anwendung:

   2 Runde 3.14159265
3.14

Funktionen können sich über mehrere Zeilen erstrecken. In Funktionen können andere Funktionen aufgerufen werden. Verzweigungen erfolgten ursprünglich mittels (evtl. bedingten) Sprungbefehlen und Zielmarken (labels). Heute wird diese Technik kaum noch verwendet: Außer APL2 bieten alle modernen Implementationen Kontrollstrukturen.

Programmbeispiel zur Erläuterung der Wirkungsweise von APL

r←scale Runde numeric
⍝ Standardwert für "scale" ist 2, wenn der Wert
⍝ beim Aufruf nicht spezifiziert wurde.
:If 0=⎕NC'scale'
    scale←2
:EndIf
r←(10*-scale)×⌊0.5+numeric×10*scale

Diese Funktion und seine Anwendung sollen die Eigenschaften von APL erläutern:

Programmbeispiel

  • Zeile 0: Definition der Funktion mit zwei Argumenten "scale" und "numeric" und einem expliziten Ergebnis r.
  • Zeile 1+2: Kommentarzeile (erkennbar an der „Lampe“ als erstem Zeichen).
  • Zeile 3: Mit einer :If-Bedingung wird geprüft, ob die NameClass (NC) des Namens 0 ist. 0 bedeutet "nicht definiert".
  • Zeile 4: Wenn die Bedingung in Zeile 3 erfüllt ist (=Wert ist unbekannt), wird "scale" auf 2 gesetzt.
  • Zeile 5: Ende des :If-Block
  • Zeile 6: Hier findet die eigentliche Rundung statt. Kennzeichnend ist das "Weiterreichen" errechneter Werte von rechts nach links, z. B. die Multiplikation des Parameters "numeric" mit den Rundungsstellen "scale" (numericx10*scale). Der dadurch erzeugte um "scale" Zehnerpotenzen größere Wert wird anschließend (also links davon) kaufmännisch (Addition von 0.5) gerundet (L-Funktion, genannt floor) und somit von weiteren Dezimalstellen befreit, so dass er nun ein ganzzahliger Wert ist. Das Ergebnis wird in die links stehende Multiplikation mit (10*-numeric) weitergereicht, die den Wert wieder um "scale" Zehnerpotenzen verringert. Dies ist das Ergebnis r der Funktion.

Wirkungsweise bzw. Anwendung

Beispiele:

   1 Runde 3.14159265
3.1 
   Runde 3.14159265
3.14 
   3 Runde 3.14159265 77.123 99.9
3.141 77.123 99.900
   Runde 2 2 ρ(ι4)÷7
0.14 0.29
0.43 0.57
  • 1. Paar der Verwendung: Anwendung der Funktion auf Pi, Rundung auf 1 Stelle (siehe auch weiter oben).
  • 2. Paar der Verwendung: Rundung von Pi auf 2 Stellen, Test des Default-Wertes (linkes Argument fehlt).
  • 3. Paar der Verwendung: Rundung eines Vektors auf 3 Stellen (rechts fehlende Nullen werden ergänzt).
  • 4. Paar der Verwendung: Rundung einer Matrix (Tabelle) auf 2 Stellen (Default) – zwei Zeilen und zwei Spalten erzeugt durch die Funktion ρ aus der Division der ersten vier natürlichen Zahlen (ι4, Funktion iota) durch 7.

Die Funktion "Runde" kann nicht nur wie oben gezeigt interaktiv ausgeführt werden, sie kann auch in anderen Programmen verwendet werden, z.B.:

X ← 4 Runde +/MAT

Dabei sei MAT eine Matrix ("Tabelle") mit beliebigen Zahlen, die durch die "Summenreduktion" ("+/") spaltenweise summiert wird. Die entstehenden n-stelligen Zahlen (ein Vektor) werden auf 4 Dezimalen gerundet der Variablen X zugewiesen. Stattdessen könnte man auch damit "weiterrechnen", z. B. mit 2 multiplizieren:

2 x 4 Runde +/MAT

Mächtigkeit und Lesbarkeit

APL ist mächtig: Es gibt (abhängig von der Version) rund 70 "primitive", d.h. im Interpreter verankerte (im Gegensatz zu selbst definierten) Funktionen. Diese werden durch ca. 50 Symbole dargestellt, von den rund 20 Symbole zwei verschiedene Funktionen repräsentieren in Abhängigkeit davon, ob sie nur mit einem rechten Argument (monadisch) oder mit einem linken und einem rechten Argument (dyadisch) aufgerufen werden. Ein Beispiel:

  • In 8 ÷ 4 wird die Funktion "÷" dyadisch als Division verwendet. Das Ergebnis ist 2.
  • In ÷.25 wird die Funktion "÷" monadisch verwendet; sie liefert den Kehrwert des rechten Arguments. Das Ergebnis ist 4.

Die meisten der in APL "eingebauten" Funktionen wirken sowohl auf Skalare als auch auf Vektoren, Matrizen und Arrays. Wo in anderen Programmiersprachen Schleifen verwendet werden müssen, um eine Menge von Werten zu verarbeiten, genügt in der Regel bei APL der Einsatz einer primitiven Funktion. Darüber hinaus können viele dieser Funktionen mittels Operatoren erweitert werden.

Neben den primitiven Funktionen, die immer aus einem einzelnen Zeichen bestehen, gibt es eine große Anzahl von System-Funktionen und -Variablen. Datum und Uhrzeit sind z.B. in einer Systemvariablen []TS (für TimeStamp) abfragbar. Systemvariablen gehören nicht zum "primitiven" Sprachumfang, sondern sind abhängig von der Implementation. Auch Systemfunktionen sind teilweise implementationsabhängig. Sie stellen z.B. Schnittstellen zu anderen Programmiersprachen und zum Betriebssystem bereit.

Definierte Funktionen passen sich nahtlos in dieses Konzept ein. Sie können monadisch oder dyadisch sein und ohne spezielle Syntax mit den primitiven Funktionen zusammen in einem Statement verwendet werden. Es können sogar selbst programmierte Funktionen als Argumente eines Operators verwendet werden oder Operatoren selbst programmiert werden.

Da die primitiven Funktionen von APL nur aus einem einzigen Zeichen bestehen und diese Funktionen zudem ungeheuer mächtig sind, kann keine andere Sprache mit vergleichbarer 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.[3]

Kritiker sprechen von APL gelegentlich als von einer «Write-once-read-never»-Sprache. Diesem Urteil liegen zwei Missverständnisse zugrunde:

  1. Der Versuch, eine Zeile APL zu verstehen, ohne die Sprache gelernt zu haben, kann nur scheitern.
  2. Wenn in einer Zeile APL soviel passiert wie in zwei Seiten C-Code, dann sollte man realistischer Weise davon ausgehen, dass man die eine Zeile APL-Code in etwa der gleichen Zeit versteht, die man zum Verstehen der zwei Seiten C-Code benötigt.

Tatsache ist, dass APL sich insbesondere in Bereichen bewährt hat, in denen sich die Anforderungen konstant und schnell ändern: Hedge-Funds, Versicherer, Portfolio-Verwalter u.ä.

Die verwendeten Symbole, die Kürze der Formulierung und die variable Manipulation abstrakter Objekte (die erwähnten Skalare, Vektoren, Matrizen usw. – sowohl in Zahlen- wie in Textform und sogar gemischt) machen APL zu einer "Sprache für Mathematiker" (wofür sie ja auch anfangs konzipiert war). Sie erfordert abstraktes Denken und räumliches Vorstellungsvermögen, ist dadurch aber auch "elegant" und "schön".

Ausführungsgeschwindigkeit

Da APL interpretiert wird, kann es vergleichsweise langsam in der Ausführung sein. 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-Programme wie auch andere Interpreter-Programme sehr schnell sein.

Als funktionale Sprache ist APL prinzipiell geeignet, Multiprozessormaschinen auszunutzen. In diesem Bereich gibt es derzeit die größten Weiterentwicklungen der am Markt erfolgreichen APL-Implementationen.

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 war APL sehr erfolgreich und wurde nicht nennenswert weiterentwickelt. Erst seit ca. 1992 haben kleinere Software-Unternehmen (APL2000, Dyalog APL, später auch MicroAPL) APL kontinuierlich weiterentwickelt. Mittlerweile haben diese Implementierungen IBMs APL2 in Sachen Leistungsfähigkeit deutlich hinter sich gelassen. Allerdings ist APL2 die einzige APL-Implementierung, die (auch) auf Mainframes läuft.

Die vielleicht 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.

Besondere Bedeutung hat APL2 heute vor allem noch in der Banken-, Versicherungs- und der Tourismusbranche sowie in Forschung und Entwicklung.

Heute wird APL in kleinen Projekten von spezialisierten Software-Unternehmen 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, Forschungsinstituten und an Universitäten wird es noch immer erfolgreich für diverse Aufgaben genutzt.

APL is alive and well“ und hat ein eigenes Wiki.[4]

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 aber als Irrweg angesehen, da die Verständlichkeit der Symbole vermindert ist.

Einzelnachweise

  1. Falkoff, A.D., K.E. Iverson, The Design of APL, IBM Journal of Research and Development, Volume 17, Number 4, 1973-07.
  2. Iverson K.E.,"Notation as a tool of thought", Communications of the ACM, 23: 444-465 (August 1980).
  3. Als Beispiel möge ein Video auf YouTube dienen, in dem Schritt für Schritt zwei einzeilige APL Funktionen entwickelt werden: die erste Funktion berechnet die nächste Generation gemäß den Regeln für Conways Spiel des Lebens, die zweite Funktion stellt das Spiel dar: Conway's Game Of Life in APL
  4. APL wiki

Literatur

  • Bernard Legrand: Mastering Dyalog APL. 2009, ISBN 978-0-9564638-0-7.
  • Kenneth E. Iverson: A Programming Language. Wiley, 1962, ISBN 0471430145.
  • James A. Brown, Sandra Pakin, Raymnod P. Polivka: APL2 at a Glance. Prentice Hall, 1988, ISBN 0130386707.
  • Hans Lochner: APL2-Handbuch. Springer Verlag, 1989, ISBN 978-354-0506775.
  • Wulf-Dieter Wagner: Software-Engineering mit APL2. Springer Verlag, 1992, ISBN 3540544062.
  • Hanspeter Bieri und Felix Grimm: Datenstrukturen in APL2. Springer Verlag, 1992, ISBN 0387557474.
  • Bernhard Legrand: Les APL étendus. Masson, Paris 1994.

Weblinks

 Commons: APL (Programmiersprache) – Sammlung von Bildern, Videos und Audiodateien

Implementierungen

Periodika

Über APL

Syntax


Wikimedia Foundation.

Игры ⚽ Поможем написать реферат

Schlagen Sie auch in anderen Wörterbüchern nach:

  • Programmiersprache/Zeittafel — Jahr Name Entwickler, Hersteller Vorläufer, Vorgänger 1840 Erstes Programm Ada Lovelace * 1946 Plankalkül Konrad Zuse * 1952 A 0 Grace Hopper * …   Deutsch Wikipedia

  • Programmiersprache Haskell — Haskell Basisdaten Paradigmen: funktional, nicht strikt, modular …   Deutsch Wikipedia

  • Apl — Die Abkürzung APL steht für: Abschlusspunkt Linientechnik, Endpunkt des Zugangsnetzes des Telefonnetzes altered peptide ligand, ein mittels Peptiddesign hergestelltes Peptid, das selektiv nur bestimmte T Zellpopulationen beeinflusst American… …   Deutsch Wikipedia

  • APL — Die Abkürzung APL steht für: Abschlusspunkt Linientechnik, Endpunkt des Zugangsnetzes des Telefonnetzes altered peptide ligand, ein mittels Peptiddesign hergestelltes Peptid, das selektiv nur bestimmte T Zellpopulationen beeinflusst American… …   Deutsch Wikipedia

  • APL — 〈Abk. für engl.〉 A Programming Language (eine Programmiersprache) * * * APL   [Abk. für A Programming Language; dt. »eine Programmiersprache«], eine Programmiersprache, die auf ein 1962 veröffentlichtes Buch des an der Harvard Universität tätigen …   Universal-Lexikon

  • Programmiersprache — I. Begriff und Aufgabe:Eine P. ist eine künstliche Sprache zur Verständigung zwischen Mensch und ⇡ Computer. Sie ist durch ihre Syntax (⇡ Syntax einer Programmiersprache) und Semantik (⇡ Semantik einer Programmiersprache) definiert. In einer P.… …   Lexikon der Economics

  • J (Programmiersprache) — J Paradigmen: Rein funktionale Programmiersprache Erscheinungsjahr: 1990 Entwickler: JSoftware Aktuelle Version: 701  (2011 03 07) …   Deutsch Wikipedia

  • Haskell (Programmiersprache) — Haskell Basisdaten Paradigmen: funktional, nicht strikt, modular, deklarativ Erscheinungsjahr …   Deutsch Wikipedia

  • A+ (Programmiersprache) — Paradigmen: Array Erscheinungsjahr: 1988 Entwickler: Arthur Whitney / Morgan Stanley Typisierung: dynamisch, streng …   Deutsch Wikipedia

  • Liste von Hallo-Welt-Programmen/Programmiersprachen — Dies ist eine Liste von Hallo Welt Programmen für gebräuchliche Programmiersprachen. Weitere Beispiele für grafische Benutzeroberflächen, Web Technologien, exotische Programmiersprachen und Textauszeichnungssprachen sind unter Liste von Hallo… …   Deutsch Wikipedia

Share the article and excerpts

Direct link
Do a right-click on the link above
and select “Copy Link”