APL: Zeichensprache

Schon mal was von APL gehört? Vielleicht nicht, denn diese Programmiersprache gilt vielen als exotisch.

Nun hat sich diese Zeitschrift entschlossen, das bestgehütete Geheimnis der Computerbranche zu lüften: Tatsächlich gehört APL zu den Top 3 der Programmiersprachen (im kommerziellen Bereich) und erfreut sich ständig steigender Beliebtheit.

Das hat Gründe. Der wichtigste ist wohl, daß APL keine Programmiersprache im herkömmlichen Sinn ist, sondern (man verzeihe mir diesen Ausdruck) ein „Denkwerkzeug“. Der Unterschied wird am ehesten bei einem kleinen Rückblick in die Computer-Steinzeit deutlich:

Am Anfang wurde mit Schaltern und Stöpseln programmiert. Mit dem Erscheinen der Lochkarte besserten sich die Arbeitsbedingungen der Programmierer nur unwesentlich; sie mußten weiter in Nullen und Einsen denken, denn der Rechner interessierte sich nur für zwei Dinge: „Loch“ oder „Nichtloch“. Da war es schon ein entscheidender Fortschritt, als Befehle endlich in Form von englischen Sprach-fetzen geschrieben werden durften. Die Listings waren zwar noch immer von beachtlichem Gewicht, aber man konnte sie leichter „lesen“ als die Zahlenkolonnen der Frühzeit. Der nächste Schritt war, mehrere Rechnerkommandos zu einem Befehl zusammenzufassen und Kontrollstrukturen einzuführen. Und das war’s dann auch schon.

Auch heutige Rechner arbeiten brav einen Befehl nach dem anderen ab und lösen jede Aufgabe in kleinste Schritte auf. Herkömmliche Programmiersprachen spiegeln diese Vorgehensweise wider. Um eine Problemstellung auf den Computer zu bringen, muß man sich detailliert mit der „Denkweise“ seines Rechners auseinandersetzen: Schritt für Schritt, Loop für Loop. Das eigentliche Problem „versteht“ die Maschine nicht.

Anfang der sechziger Jahre begann bei IBM die Entwicklung der legendären /360. Diese für damalige Verhältnisse extrem komplexe Maschine ließ sich nicht mehr „von Hand“ entwerfen. Es hätte einfach zu lange gedauert. Die Ingenieure benötigten eine Sprache, um die geplante Rechnerlogik beschreiben zu können. Die bekannten Programmiersprachen haben aber mit Logik (im menschlichen Sinne) wenig zu tun.

Da traf es sich gut, daß ein Kollege während eines Lehrauftrags in Harvard ähnliche Probleme hatte: Er wollte seinen Studenten mathematische Logik beschreiben und hatte eine dafür geeignete Schreibweise entwickelt: APL. Es zeigte sich, daß mit dieser Notation auch Parallelprozesse des geplanten Rechners darstellbar waren.

Zu diesem Zeitpunkt war APL eine reine „Tafelsprache“: Kein Computer kann mit Kreide programmiert werden. Aber die Entwickler bei IBM waren von ihrem neuen Werkzeug so angetan, daß sie es in der Folgezeit auf einen Rechner umsetzten. APL (bzw. seine Vorstufen) war in der Firma bald so begehrt, daß es schließlich 1968 auch für Kunden zugänglich gemacht wurde.

Die Entwicklungsgeschichte verdeutlicht, daß mit APL zum ersten Mal eine Notation menschlicher Denkweisen auf den Computer gebracht wurde, statt wie üblich die Computerlogik menschlicher zu verpacken. Was das im Einzelnen bedeutet, ist für Leute, die ständig in Schleifen denken müssen, allerdings nur schwer nachvollziehbar.

Datenstrukturen

Die Befehle eines APL heißen Funktionen. Sie sind allesamt dafür konzipiert, auf Strukturen zu operieren, das heißt, auf Datengebilden mit beliebig vielen Elementen. Das können sowohl Einzelelemente („Skalare“) wie auch Vektoren oder Arrays („Matrizen“) mit mehreren Dimensionen sein. Diese „Variablen“ heißen nicht nur so, sie sind auch tatsächlich flexibel: APL kennt keine Deklarationen oder feste Größen von Datenstrukturen.

Jede Variable kann jederzeit gebildet werden (durch Zuweisung), vergrößert oder verkleinert werden (z. B. durch Anhängen, Einfügen, Entfernen), eine andere Struktur bekommen oder den Datentyp wechseln. Apropos Datentyp: Für den Programmierer braucht es nur die Unterscheidung zwischen Zahlen und Text - den Rest erledigt APL. Intern arbeitet APL mit vier Typen: Text (im Byte-Format), Integer (meist vier Bytes pro Wert), Fließkomma (meist im IEEE-Format mit 64 Bit - „Double Precision“) und Boolean (1 Bit pro Wert).

Es ist schon sehr angenehm, beim Programmieren nicht mit den Feinheiten der Rechner-internen Datenrepräsentation herumbasteln zu müssen: Bei manchen Berechnungen weiß man nicht von vorneherein, ob reelle Zahlen auftauchen werden. APF legt die Werte nach Bedarf ab; kommen nur ganze Zahlen vor, wird halt platzsparend im Integerformat abgelegt, gibt es plötzlich Nachkommastellen, wechselt die Maschine zum Float-Format. Daher muß man auch nicht festlegen, mit welcher Genauigkeit gerechnet werden soll: APF merkt von selbst, wenn es krumme Werte gibt.

Dies alles soll übrigens nicht heißen, daß Sie keine vollständige Kontrolle über die Details hätten. Man kann in APF die Rechengenauigkeit einschränken; man kann bestimmte Formate forcieren und in den Bits eines Characters wühlen -- man muß es aber nicht, wenn man den Kopf für das Wesentliche freihalten will.

Programmieren mit „Icons“

Das Datenhandling ist also schon recht „menschenfreundlich“ geregelt. Wie aber sieht es mit der Programmierung aus? Als ST-Computer-Leser sind Sie sicherlich an die GEM-Oberfläche des Atari-Betriebssystems gewöhnt. Wenn Sie aber nun ein Programm in einer der üblichen Sprachen schreiben wollen, hat es sich auch schon mit den Icons. Stattdessen müssen halbe Romane in einer Art „Pidgin-Englisch“ in den Editor gehackt werden. Um die Übersicht zu behalten, ist alle naslang ein Ausdruck fällig - die meisten Subroutinen passen nicht auf eine Bildschirm-Seite.

APL braucht kein Englisch. Es hat Symbole. Sicher, die sind nicht so schön wie die GEM-Icons, aber immerhin haben die meisten von ihnen eine augenfällige Bedeutung. Jedes Symbol wird mit einer Taste aufgerufen und ist genau so groß wie ein Character: Das ist ein APL-Befehl. Keine langen Wörter, keine reservierten Ausdrücke, kein Pseudo-Englisch. Für eine in den sechziger Jahren entwickelte Sprache war das revolutionär. Aber im Zeitalter der grafischen Benutzeroberflächen und der Icons fragt man sich doch, ob die anderen Sprachen noch auf der Höhe der Zeit sind. Diese ketzerische Frage ist allerdings nicht so ganz ernst zu nehmen: Natürlich haben die verschiedenen Sprachen ihre Berechtigung. Nur wenn ich zum Beispiel sehe, daß komplexe Anwendungen, die nicht massenhaft verbreitet werden, weil sie zu speziell sind, in C programmiert werden, kommen mir die Tränen. So eine Mühsal ist doch unbezahlbar!

APL-Befehle sind aber nicht nur kompakt, sie lassen sich auch verknüpfen. Damit passen in eine Programmzeile komplexe Ausdrücke oder Berechnungen - so wird ein Programm kurz und übersichtlich. Um mehrere Kommandos aneinanderhängen zu können, braucht es nur eine einzige Regel: Rechts vor links. Das heißt, ein APL-Ausdruck wird immer von rechts nach links aufgelöst, es sei denn, man verwendet Klammern.

Der Effekt ist verblüffend: Die meisten mathematischen Ausdrücke können wie in der Schule notiert werden. Bei den Grundrechenarten („Punktrechnung vor Strichrechnung“) stimmt das zwar nicht, aber begeben Sie sich mal in die höheren Gefilde der Algebra! Die oft verwirrenden (und meist willkürlichen) Regeln anderer Sprachen gibt es nicht. Und: Eigene Routinen folgen derselben Syntax wie die eingebauten Funktionen. Damit lassen sich beide in einem Ausdruck mischen, ohne daß es zu unerwünschten Seiteneffekten kommt.

Funktionen

Die Übereinstimmung von APL-Funktionen und eigenen Routinen geht bis in’s Detail: Selbst die Bezeichnung ist identisch. Routinen (Module) werden ebenfalls „Funktionen“ genannt. Ob Sie also schreiben

A + B

oder eine eigene Additionsfunktion „plus“ benutzen

A plus B

ist beliebig. Im Beispiel sind „A“ und „B“ jeweils Variablen. Dabei ist es gleichgültig, ob es sich um Skalare, Vektoren oder Matrizen handelt: Der Ausdruck muß nur „wohlgeformt“ sein, das heißt, jedem Element in A muß ein Element in B entsprechen. Ausnahme: Wenn eine der Variablen aus nur einem Wert besteht, wird dieser zu allen Werten der anderen Variablen addiert.

    1 + 4 7 9   Ausdruck
5 8 10          Ergebnis
    1 2 3 + 4 5 6
5 7 9

Aber APL kann nicht nur 1 und 1 zusammenzählen. Zu den üblichen Multiplikations- und Divisions-Funktionen kommen hinzu: Logarithmus, Reziprokwertberechnung, die Modulo-Funktion, Pi (mal X), Binominalkoeffizient, Fakultät, trigonometrische Funktionen... APL, das Mathe-Genie. Kein Wunder, wurde es doch von einem Mathematiker formuliert. Aber die Aufzählung ist unvollständig. Selbstverständlich gehören Vergleiche (größer, kleiner, größer-gleich, kleiner-gleich, ungleich, gleich), logische Funktionen (AND, OR, NAND, NOR und NOT), Aufrunden, Abrunden, Negieren, Potenzieren, und ein programmierbarer Zufallszahlengenerator zum mathematischen Sprachumfang (die Vergleiche gelten auch für Text).

Die Möglichkeit, ganze Matrizen am Stück zu „verwursten“, läßt die Frage nach der Fähigkeit aufkommen, lineare Gleichungssysteme zu formulieren: Das geht. Die Matrixinversion ist als APL-Befehl vorhanden. Ein Zeichen. In Pascal braucht das entsprechende Programm drei Druckseiten, in denen vor allem mit den Unzulänglichkeiten des Computers herumgemacht werden muß. Der eigentliche Zweck des Pascal-Listings geht höchstens aus den Kommentaren hervor. Das APL-Symbol dokumentiert sich hingegen selbst: Es ist ein Rahmen (für „Matrix“) mit einem Divisionszeichen darin. Kein Schrägstrich! Ein Divisionszeichen, wie in der Schule. Bei der Multiplikation sieht man auch keine Sterne, sondern ein kleines Kreuzchen. Warum sollen wir wegen eines dummen Computers nochmal in die Schule? Soll der doch umdenken.

Soweit die leidige Mathematik. Viele Funktionen gelten gleichermaßen für Zahlen wie für Text: Das Sortieren (auf- und abwärts), das Suchen von Zahlen oder Zeichen („Index“), das Vergleichen, die Abfrage („Element von“), das Umwandeln von Daten („Encode“ und „Decode“) - damit lassen sich Zahlen in unterschiedliche Zahlensysteme „übersetzen“ (z.B. hexadezimal, oktal...) oder Texte „verschlüsseln“.

Dann gibt es eine Reihe von Befehlen, um Datenstrukturen zu manipulieren: Rotieren, spiegeln, um einen bestimmten Betrag drehen, in eine gewünschte Richtung... Alles hochinteressant, wenn man mal mit mehr als zwei Dimensionen zu tun hat. Man kann eine Anzahl von Zeichen entnehmen oder entfernen, von „vorn“ oder von „hinten“ (wo, bitte, hat eine 6-dimensionale Matrix ihr Hinterteil?). In jeder Struktur läßt sich zudem jeder einzelne Wert einzeln ansprechen (per „Indizierung“).

Na gut. Die Aufzählung ist lange nicht komplett. Es fehlen etwa die „Operatoren“, die so etwas wie „Funktionen der Funktionen“ darstellen - das sind Befehle, die als Argument(e) ein oder zwei Funktionen bekommen, die ihrerseits auf Daten operieren. Damit lassen sich beispielsweise Vergleiche auf komplexe Datenstrukturen anwenden, Zeilen in Matrizen suchen oder Funktionstabellen erstellen.

# APL und "KI"

APL ist nicht unter der Vorgabe entstanden, "künstliche" Intelligenz zu produzieren. Angesichts dessen, daß schon die menschliche Intelligenz weitestgehend unerforscht ist, halte ich den Anspruch auf eine Nachbildung im Elektronengehirn für Quatsch. Aber: Die Methoden, die unter der (falschen) Flagge "Kl" propagiert werden, gibt es unter APL auch.

• APL kann Listen verarbeiten. Jedes Element eines Textes ist einzeln ansprechbar. Mit

’LISTE'[3]

erhalte ich ein S. Will ich wissen, wo das erste T auftaucht, frage ich:

'LISTE' ⍳ 'T*

Antwort: 4-. - Ist ein D enthalten?

'D' ∊ 'LISTE'

Antwort: 0. - Logisch.

• Begriffe lassen sich in einer Matrix speichern, suchen, verändern und ersetzen. Die Liste kann sortiert, erweitert, gekürzt werden. Wahlweise können einzelne Zeilen, Spalten, oder Elemente adressiert werden.

• APL kann Daten zu ausführbarem Code machen (und umgekehrt). Listeneintrag Nr 13 enthalte eine Rechenvorschrift 'A×B' (als editierbaren Text). Mit

⍋Liste [13;]

wird die Anweisung ausgeführt. Ersetzt man die Vorschrift durch eine andere,

Liste[13;] ← 'A÷B' wird bei der nächsten "Aktivierung" (i) eine Division anstelle der Multiplikation ausgeführt. Solche Operationen können geschachtelte Aufrufe enthalten. Besser gesagt: Jeder korrekte APL-Ausdruck wird angenommen.

• Jede selbstgeschriebene Funktion kann mit der Systemfunktion ⎕CR zu Text umgeformt werden, der beliebig vom Programm manipulierbar ist. Mit ⎕FX wird wieder eine Funktion erzeugt, die sofort ausführbar ist. Das heißt: APL-Programme können sich zur Laufzeit selbst verändern und erweitern.

Programmierung

Der Sinn der Auflistung war indes nicht, ein Handbuch zu ersetzen, sondern zu verdeutlichen, daß in APL vieles eingebaut ist, was man in anderen Sprachen erst einbauen oder hinzukaufen muß. Zudem läßt sich erahnen, daß durch die Fähigkeit der Funktionen, auf ganzen Vektoren oder Matrizen zu operieren, viele Loops überflüssig werden, und mit ihnen der ganze Programmieraufwand für die notwendigen Kontrollstrukturen. Verstehen Sie, warum APL-Routinen (pardon: „Funktionen“) so kurz sein können?

Die Knappheit der Notation ist natürlich keine Tugend „an sich“. Sicher ließe sich viel Papier sparen, wenn man die Übersicht über ein Programm auch am Bildschirm behält, aber im Zeitalter des Waldsterbens kommt es auf das bißchen Holz wohl nicht an, oder? Schlimmer wäre es schon, wenn die Computerzeitschriften die APL-Notation verwenden würden: Womit sollten sie die vielen eingesparten Seiten füllen? Und wie käme der Leser noch zu dem unvergleichlichen Genuß, seitenlange Listings ohne Tippfehler in seinen ST zu hacken? Genug gelästert. Das Wesentliche ist doch, bei der Entwicklung und Wartung komplexer Programme die Übersicht zu behalten. Dieses Ziel unterstützt APL vorbildlich.

Üblicherweise wird bei der Programmierung zweigleisig verfahren:

APL unterstützt beide Verfahren. Einzelne Funktionen (z. B. Datumsberechnung, Mittelwertbildung, Eingabe-Editor) werden separat gebaut und getestet. Da sie mit derselben Syntax verwendet werden wie die eingebauten APL-Befehle, erweitert man damit den Sprachumfang nach seinen Bedürfnissen. Das Ablaufschema eines Programms überträgt man in eine Oberfunktion (wobei in den meisten Fällen eine direkte Umsetzung des Flußdiagramms möglich ist!); die einzelnen Bearbeitungsschritte werden mit Namen in diese Funktion eingetragen. Nach und nach werden diese Namen dann mit Inhalt gefüllt, indem man sie zu Funktionen macht, die ihrerseits jede Menge von Unterfunktionen aufrufen können.

„Denkwerkzeug“

Beim Erstellen eines Programms ist das Eintippen der Befehle (das, was man gemeinhin „Programmierung“ nennt) meist nicht einmal die halbe Miete. Viel mehr Denk-Arbeit ist beim Umsetzen einer Idee in computergerechte Algorithmen gefragt. Abgesehen davon, daß APL durch seine Fähigkeit, auf Strukturen zu arbeiten, viele Umsetzungsschritte (auf Schleifen) überflüssig macht, ergibt sich ein weiterer Vorteil: Ursprünglich ist APL ja als „Beschreibungssprache“, als Notation, entwickelt worden. Das heißt, Sie können eine gut durchdachte Idee direkt in APL beschreiben. Da ein Rechner Ihre Beschreibung „versteht“, kann er sofort etwas damit anfangen. Die Zeitersparnis ist enorm: In der Industrie wird mit einer dreifach höheren Produktivität kalkuliert.

Um die Datenbehandlung muß man sich nicht allzusehr kümmern. Dank der Fähigkeit von APL, mit mehrdimensionalen Strukturen umgehen zu können, läßt sich etwa eine Adressdatei ganz einfach als dreidimensionales Gebilde aufbauen: Die (zweidimensionalen) „Karteikarten“ werden in die dritte Dimension einsortiert. Damit ist der Karteikasten schon fertig. Solche mehrdimensionalen Strukturen machen die Sache nicht komplizierter, sondern einfacher: Man kann bei der Programmierung seine (menschliche) Vorstellung von Datenformaten („Karteikasten“) beibehalten. Natürlich lassen sich Variablen auch lokal machen, und zwar auf jeder Ebene der Programmhierarchie.

All dies gibt es natürlich nicht umsonst. APL ist von Natur aus eine Interpretersprache. Das macht es ungeeignet für massenhaft verkaufte Standardprogramme. Allerdings: Das Vorurteil, ein Interpreter müsse langsam sein, trifft hier nicht. Jede ernsthafte Implementierung auf Microcomputern ist in Assembler geschrieben; Funktionen werden zudem in einer Art prä-compilierter Form gehalten. Und:

APL arbeitet ja ganze Strukturen auf einen Schlag ab, so daß die bei einem Von-Neumann-Rechner immer nötigen Schleifchen auf der Maschinensprache-Ebene abgewickelt werden -der Interpreter muß die Loop-Verwaltung nicht immer wieder durchkauen. Durch diese Vorteile ist APL ohne weiteres konkurrenzfähig.

# "Datenbank"-Abfrage

Die Suche von Einträgen in Listen nach bestimmten Kriterien ist ein häufig benötigter Vorgang. In APL läßt sich ein relativ einfacher Fall "im Vorbeigehen" lösen:

Es gibt eine Liste, die (zunächst mal) nur aus Schlüsseln besteht. Nennen wir sie "LISTE" .

ABC 5 
DEF 2 
GHI 3 
XYZ 5

Diese Matrix kann beliebig breit/lang sein. Es soll nach jeweils einem Schlüssel (hier: einem Zeichen) in jeweils einer Spalte gesucht werden. Eine erste APL-Funktion könnte so aussehen:

⍒R← Spalte ABFRAGE Schlüssel ; LOG
R←LISTE[;Spalte] ⍝ Spalte extrahieren
LOG ←R € Schlüssel ⍝ logischer Vektor R←LOG/⍳pR ⍝ Zeilennummern

In R (dem Resultat) werden die Nummern der Zeilen von LISTE übergeben, in deren n-te>- Spalte der Schlüssel vorkommt. Also:

4 ABFRAGE '5' ⍝ Funktionsaufruf
1 4 ⍝ Resultat

Jetzt hängen wir an die LISTE mal paar Daten an:

ABC5 Astrid, Bildhübsch, Coburg
DEF2 Dieter, Ekel, Frankfurt
GHI 3 Gert, High, Indien
XYZ5 Zimmermann, Aktenzeichen, ungelöst

Die LISTE enthält all' Ihre Schuldner, Spalte 4 den Betrag in (nicht konvertierbaren) Rubel. Mit einer besseren ABFRAGE wollen Sie wissen, wer von Ihren Schuldnern ein Ekel ist:

2 ABFRAGE ’E'

Dieter, Ekel, Frankfurt

Aha! Und wer schuldet Ihnen jeweils 5 Rubel?

4 ABFRAGE '5'

Astrid, Bildhübsch, Coburg
Zimmermann, Aktenzeichen, ungelöst

Die passende APL-Funktion sieht dann so aus:

⍒R← Spalte ABFRAGE Schlüssel
R←0 4⍒( LISTE[; Spalte] ∈ Schlüssel)/ LISTE

Das wäre zugleich die "Kompaktversion". Die lokale Variable LOG ist nicht mehr nötig, da Zwischenergebnisse direkt weitergereicht werden. Der Klammerausdruck erzeugt den logischen Vektor (im letzten Beispiel: 1 0 0 1), mit dem die LISTE vertikal "komprimiert" wird. Es bleiben also die Zeilen 1 und 4 übrig. Davon werden die ersten 0 Zeilen, 4 Spalten entfernt, so daß kein Schlüsselfeld angezeigt wird. Passen Sie nur auf, daß der Zimmermann Ihnen nicht durch die Lappen geht!

Anwendung

Ganz klar, daß ein Interpreter in der Entwicklungsphase eines Programmes von Vorteil ist. Bei einem Fehler hält APL die Ausführung an und gibt eine Meldung aus, wobei die fehlerhafte Stelle in einer Programmzeile genau markiert wird. Der Entwickler kann nun ganz gemütlich „per Hand“ herumprobieren, sich Variablen anzeigen lassen, Werte verändern. Anschließend kann das Programm gleich weitermachen.

Anders als manche andere Sprache kennt APL keinen grundsätzlichen Unterschied zwischen dem „Handbetrieb“ und einem Programm. Im sogenannten „Tischrechner-Modus“ kann man also beliebige Operationen ausführen, die aus APL-Befehlen und eigenen Punktionen bestehen können. Dieser Modus wird oft von Entwicklungsingenieuren benutzt, die mit ihrem wissenschaftlichen Taschenrechner nicht zufrieden sind, da er bei linearen Gleichungssystemen nicht mehr mag. Auch für Ausbildungszwecke ist dieser Modus ideal: Mathematische Formeln lassen sich leicht ausprobieren, die Ergebnisse sind direkt verfügbar. Komplexe Vorgänge kann man Schritt für Schritt überprüfen. Der Umgang mit dem Rechner ist dabei genauso simpel wie bei einem Taschenrechner: Wenn Sie „1 + 1“ eingeben, antwortet APL mit einer „2“. Ich habe gehört, das sei nicht selbstverständlich? Warum sollte man denn mit einer zusätzlichen „PRINT“-Anweisung darum betteln müssen, das Ergebnis zu erfahren? Verstehen Sie das?

Für das Erlernen der Sprache ist der Tischrechner-Modus ideal: Alles läßt sich direkt ausprobieren. Zudem hat sich gezeigt, daß gerade die Computer-Neulinge keinerlei Probleme im Umgang mit APL haben, da sie mit ihrem gesunden Menschenverstand viel ungezwungener an diese Sprache herangehen als etwa ein Assembler-Crack, der die „Denkweise“ des Rechners schon voll verinnerlicht hat und bei jedem Befehl schon überlegt, was sich der sensible Computer dabei wohl „denkt“. Soviel übertriebene Rücksicht ist aber bei APL fehl am Platze. Der Rechner soll kein Pflegefall, sondern ein Werkzeug sein. Daß er diesen Zweck mit Hilfe von APL mit erstaunlicher Eleganz erfüllt, ist für kommerzielle Nutzer unbestritten. Und angesichts der neuen, leistungsfähigen Rechnergeneration, wie sie der ST verkörpert, gibt es keinen Grund mehr, auf ein ebenso leistungsfähiges „Denkwerkzeug“ zu verzichten.

Und die Zukunft von APL? Es ist eine Frage der Zeit, bis die heutigen Von-Neumann-Rechner durch Parallelarchitekturen verdrängt werden. Dieser Trend käme APL entgegen: Schon jetzt schließt IBM ihre Vektor-Rechner an APL an, ohne eigene Kommandosprache. Diese Number-Cruncher knabbern sich so genüßlich (und parallel) durch die APL-Matrizen, daß es eine Freude ist. Sicher, da wird das Taschengeld schnell knapp, aber wie wär’s mit einem Parallelrechner aus vielen 68000-CPUs? Daran wird an der Universität Saarbrücken gebaut. Muttersprache: APL. Aber auch jetzt schon wird APL gebraucht: Wegen der damit möglichen kurzen Entwicklungszeiten für flexible, anpassungsfähige Software. Darum vor allem rangiert APL in der Hitliste schon auf Platz 3, nach den „Sauriern“ Cobol und Fortran.

Wollen Sie wissen, was APL eigentlich heißt? „A Programming Language“ -eine Programmiersprache also. Das stimmt. Aber was für eine!

Wolfgang Thomas

# APL-"Icons"

Das erste wichtige Zeichen ist die "Zuweisung" (←). Mit ihr erhalten Variablen einen Inhalt:

C←2*3

In C steht jetzt der Wert 6.Damit läßt sich rechnen:

C * 99 1.088864373 E 77

Die neunundneunzigste Potenz von 6. Bauen wir eine Matrix:

Mat ←3 4p \12

Das Zeichen 'V bewirkt hier die Bildung der Zahlenreihe von 1 bis 12. Der Ausdruck '3 4p' bildet eine Matrix mit 3 Zeilen, 4 Spalten:

       MAT
1  2  3  4 
5  6  7  8 
9 10 11 12

Mit demselben Zeichen wird die Dimension abgefragt:

p MAT
3 4

Ein paar Dreher wären auch nicht schlecht, oder?

⌽ MAT             ¯⌽MAT          ⊖MAT        ⍉MAT
 4  3  2 1     4 1  2  3     9 10 11 12     1 5  9
 8  7  6 5     8 5  6  7     5  6  7  8     2 6 10
12 11 10 9    12 9 10 11     1  2  3  4     3 7 11
                                            4 8 12

Das Hochminus '¯' bezeichnet negative Zahlen, mit dem Minuszeichen '-' ist die Rechenoperation Subtrahieren belegt. Übrigens: Statt der Zahlen kann man auch Zeichen verwenden; anstelle einer zweidimensionalen Matrix geht auch eine mit 7 Dimensionen - oder ein Vektor. Wie's beliebt.

Logische Vektoren spielen in APL eine große Rolle, kann man mit ihnen doch hervorragend Datenstrukturen manipulieren - hier einen Vektor:

    0 1 0 0 1 0 1 0 0 0 0 / 'ST- COMPUTER'
TOP

Der Schrägstrich bedeutet dabei:”Komprimieren" Er kann auch als Operator verwendet werden, d.h mit einer APL-Funktion als (linkem) Argument.

Und noch ein paar Pfeile auf die ST abschieBen?

6 ↓ 'ST-COMPUTER'
PUTER
¯5 ↑ 'ST-COMPUTER'
PUTER

... noch ein Tier? - Bitte sehr:

'ST-COMPUTER' (1 2 8 9 10]
STUTE

Ein “Fenster” dient der Ein- und Ausgabe (I/O):

R← A hole Text vom Bildschirm 6+□ A Eingabeanforderung A der 'Prompt ' □ : 4x2 A die Eingabe (mit RETURN- 14 A '6' plus Eingabe R←□←‘Hallo' A ... Text gleichzeitig an R Hallo A und auf den Schirm

Na, es reicht zunächst mal. Die ST braucht ihre Seiten noch für endlose Basic- und C-Listings Immerhin ist das Prinzip der Sprache APL etwas deutlicher geworden. Möchten Sie sich immer noch die Finger wundtippen? - I like Icons!

APL auf dem ST

Dieser APL-Bericht ist nicht als theoretische Trockenübung gedacht. Wer will, kann etwa die Beispiele auf seinem ST nachvollziehen.

Das APL/68000-ST, mit dem sie auch geschrieben wurden, läuft auf jedem ST ohne Einschränkungen Ein ausführlicher Test folgt in der nächsten Ausgabe der ST-Computer.

Bezugsquelle: gdat mbH

Stapelbrede 39 48 Bielefeld 1



Aus: ST-Computer 09 / 1987, Seite 66

Links

Copyright-Bestimmungen: siehe Über diese Seite