Saturday, 23. August 2008
So steht es im APL2 User's Guide unter "Deviations from APL2 Programming Language Reference": "Any usage of bracket indexing in a selective assignment expression, such as
(2↑V[⍳4])←3
gives SYNTAX ERROR."
Das hat bisher auch stets so "funktioniert". Ich konnte mich also darauf verlassen, dass vom Host migrierte Funktionen an solch einer inkompatiblen Stelle unterbrochen wurden.
Es ist allerdings nicht nur so, dass Workstation APL2 eine selektive Zuweisung kombiniert mit den eckigen Klammern nicht zulässt, es versäumt in einem Spezialfall sogar die oben beschriebene Fehlermeldung. Hier ist der Fall:
V←(1 2 3)(4 5 6)
(1⊃V)[2]←12
Keine Fehlermeldung, kein SYNTAX ERROR, wie doch im User's Guide angekündigt. Sollte es etwa möglich sein, dass mit "Pick" in einer selektiven Zuweisung die Nutzung von eckigen Klammern möglich wird?
Leider nicht. Die Verarbeitung wird zwar ohne Fehler fortgesetzt, aber im obigen Beispiel bleibt V unverändert, als wäre die betreffende Anweisung nicht vorhanden.
Es ist schon schade, dass diese Form der selektiven Zuweisung auf der Workstation nicht funktioniert (man kann die Inkompatibilität immerhin leicht mit Hilfe der Indexfunktion beheben). Es wäre allerdings hilfreich, wenn APL2 Workstation auf solche Stellen konsequent mit einem SYTAX ERROR reagiert.
Sunday, 22. June 2008
... sollte man meinen.
Das könnte auch so sein, denn als Sprache enthält APL eine Vielzahl paralleler Konzepte. So kann die Addition zweier Matrizen auf mehrerer Prozessoren verteilt werden, ohne dass der Entwickler das explizit vorgeben muss. Dies gilt für viele Funktionen und Operatoren, es ist nur eine Frage der jeweiligen Implementierung.
Und genau hier scheitern die heutigen APL-Interpreter: Sie nutzen die inzwischen üblichen mehrfachen Prozessorkerne nicht für diese Art der Parallelität. Man kann nur hoffen, dass die Entwickler von APL-Systemen die Chance, die moderne Prozessorarchitekturen bieten, nutzen werden. APL als Sprache ist dafür bestens geeignet, besser als die meisten anderen Sprachen.
APL2 macht mit der CSD 12 einen ersten Schritt in diese Richtung. Mit den definierten Operatoren PEACHT und PEACHP werden Modelle für ein paralleles "Each" angeboten.
"APL ist parallel" vollständig lesen
Tuesday, 10. June 2008
Was ist das? P15 in Aktion!
Alle beteiligten Variablen sind mit dem neuen Prozessor 15 - "Access Structured Storage" - assoziiert. Dies geschah natürlich bevor der Wert der Variablen erstmalig abgefragt wurde:
'J16 0' 15 ⎕NA 'A'
('ADDRESS' 'A')15 ⎕NA 'ADR'
Die hier erstellte Variable ADR enthält die aktuelle Speicheradresse der Variablen J16. Als Name verweist "A" (und auch die folgenden Namen) auf Speicher außerhalb des APL-Workspaces.
"Prozessor 15 in Aktion" vollständig lesen
Monday, 9. June 2008
Ursache: Ich verändere eine Variable, hier E8←123.456
Wirkung: Weitere Variablen werden ohne Einwirkung von außen modifiziert.
Bug or Feature?
Ein mögliches Szenario: Bei den beteiligten Variablen handelt es sich um "gemeinsame Variablen" zweier APL2-Sitzungen. Die weitere Sitzung reagiert auf die Veränderung der " Shared Variable" E8 und verändert die anderen gemeinsamen Variablen I4, I2, C1 und B1.
Das wäre leicht zu realisieren, es geht aber einfacher.
Saturday, 7. June 2008
E8
0
I4
0 0
⎕AF C1
0 0 0 0 0 0 0 0
8 8⍴B1
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
Keine Frage, alle Variablen sind irgendwie 0. Aber was passiert hier?
"Was ist das?" vollständig lesen
Saturday, 31. May 2008
Eine der wesentlichen Neuerungen der CSD 12 betrifft die DB2-Schnittstelle:
"As of Service Level 12, AP 127 has been re-written to use the CLI interface to DB2."
Dahinter steckt eine große Erleichterung: Nie wieder muss ich APL2 an eine DB2-Datenbank binden bevor ich auf diese per AP127 zugreifen kann.
Aber Vista zerstört so manche Verbesserung: Nach Installation der CSD 12 funktionierte das Deklarieren einer gemeinsamen Variablen mit dem AP127 schlicht und ergreifend nicht. Jeder Versuch brachte nur einen Kopplungsgrad von 1, einen zuwenig, um mit dem AP127 sprechen zu können.
Und wer stand wohl zwischen APL2 und dem AP127? Wie so oft die Benutzerkontensteuerung. Erst nachdem ich sie komplett ausgeschaltet hatte, konnte ich auf eine DB2-Datenbank zugreifen.
Netter Nebeneffekt: Bein Starten von Vista taucht nebenstehende DB2-Fehlermeldung nicht mehr auf und mit DB2 lässt sich wieder so bequem arbeiten wie unter XP.
Aber das ist nicht der einzige Grund, die Benutzerkontensteuerung entgegen der Empfehlung von Mickeysoft auszuschalten.
Monday, 12. May 2008
Zu den Neuerungen des Service Level 12 gehört mit dem P15 ein neuer Assoziierter Prozessor. Auf den ersten Blick ähnelt er konzeptionell dem P12 "Files as Variables", nur dass hier nicht Dateien wie APL-Variablen behandelt werden, sondern Speicher außerhalb des APL2-Arbeitsbereiches.
Diese Neuerung ist für mich die große Überraschung und in ihrer Auswirkung auf das Arbeiten mit APL2 schwer einschätzbar.
Dagegen offenbart sich der Nutzen der folgenden Erweiterungen mehr oder weniger sofort:
"Großes Kino (Folge 2)" vollständig lesen
Sunday, 11. May 2008
Einen Monat früher, als ich erwartet habe ist die CSD 12 für Workstation APL2 verfügbar. Dass mit diesem Service Level die Ausführung von Stored Procedures durch den AP127 möglich wird oder ActiveX Steuerelemente für Dialoge genutzt werden können, war vorhersehbar. Beides bietet weite Felder für neue Anwendungen.
Daneben wartet die CSD 12 mit einer großen und vielen kleineren Überraschungen auf. Die vollständige Liste der Neuerungen findet man wie üblich in der readmec.txt im APL2-Installationsverzeichnis. Hier nur eine Auswahl, die Reihenfolge ist mehr oder weniger willkürlich:
"Großes Kino (Folge 1)" vollständig lesen
Sunday, 27. April 2008
Die meisten Abweichungen zwischen APL2 Versionen für den Mainframe und für Workstations führen bei Ausführung auf einer Workstation umgehend zu einem Fehler. Bei selektiven Zuweisungen wäre das z.B. ein SYNTAX ERROR. So ärgerlich das auch sein mag - vor allem, wenn sie zu Hunderten auftauchen - man kann die Inkompatibilität stante pede beheben. Die Diagnose liegt auf Hand, mit der Behandlung kann sofort begonnen werden.
Leider ist dies nicht immer der Fall. Die fehlende Füllfunktion für den Each-Operator ("No fill function is implemented for the Each operator") muss nicht zum sofortigen Abbruch der betroffenen Anweisung führen. Die Auswirkungen der Inkompatibilität können auch erst viel später in den unendlichen Tiefen einer komplexen Anwendung auftreten.
So geschehen mit
⍕¨NUM_ARRAY
Wie häufig ist das rechte Argument von Format hier numerisch, im vorliegenden Fall allerdings auch leer. Das Ergebnis ist natürlich (wegen "Each") wiederum eine leere Struktur, aber leider eine numerische und keine alphanumerische, wie vernünftigerweise zu erwarten wäre - und wie es APL2 Mainframe auch vorsieht.
"Noch tückischer" vollständig lesen
Sunday, 30. March 2008
Ich hatte von Anfang an ein gute Gefühl bei REPLACEX, eine der wichtigen Neuerungen des APL2 Service Level 11 vom November letzten Jahres. Im ICE von Hamburg nach Berlin hatte ich vor der GSE Herbsttagung 2007 Gelegenheit, REPLACEX ein wenig zu testen. Die Ergebnisse des Vergleichs mit REPLACEV, einer Funktion aus 1 UTILITY, mit verschieden langen Vektoren bzw. Teilvektoren waren überragend. Je länger die Zeichenkette, in der die Ersetzungen vorgenommen wurden, desto größer wurde der Unterschied zugunsten von REPLACEX.
REPLACEX funktionierte sogar noch, als REPLACEV mit WS FULL endgültig aufgeben musste. Dabei ist REPLACEV keine schlechte APL2-Variante für das Ersetzen der Vorkommen einer Zeichenkette durch eine beliebige andere.
Dies waren Versuche außerhalb jeglicher ernsthafter Anwendungen. Tatsächlich gehört das Ersetzen von Teilstrukturen durch Strukturen mit unterschiedlicher Dimension nicht zu den Stärken von APL, nicht nur in Sachen Performance. Das ist anders bei jeweils gleicher Größe. Der einfachste Fall, der im wirklichen Leben auch oft vorkommt, ist das Ersetzen von Dezimalpunkten durch Kommata und umgekehrt.
"Mit Punkt oder Komma" vollständig lesen
Monday, 11. February 2008
Ich vergaß ...
Wie bringe ich nun Workstation APL2 dazu, mit dem Ausdruck 3↑¨⍳N das zu tun, was die APL-Welt auch für N=0 erwartet?
Ganz ohne Änderung geht das natürlich nicht. Aber glücklicherweise ist ken "if N=0 then ... else ..." nötig, ich brauche nicht einmal eine neue Zeile. Mit APL ist vieles einfacher, als mit (fast) allen Programmiersprachen der uns bekannten Welt.
Es auch hier so, wie mit vielen Dingen in der Mathematik: Man nehme etwas hinzu, so dass man sich auf bekannten Grund bewegt, tue das, was man nicht lassen kann, und werfe abschließend Überflüssiges wieder weg.
Konkret in unserem Fall: 1↓3↑¨0,⍳N, wobei nun das Ergebnis für N=0 ein Leervektor vom richtigen Typ ist.
Hat man keinen Mainframe mit APL2 zur Hand, kann man sich eine konforme Implementierung bei APL+Win ansehen.
Friday, 8. February 2008
Die Liste der dokumentierten Abweichungen zwischen den APL2-Implementierungen auf dem Mainframe und für Workstations ist glücklicherweise recht kurz. Viele der hier dokumentierten Inkompatibiltäten haben mich bisher noch nicht tangiert. Andere haben es aber in sich und sollten so bald wie möglich aus der Dokumentation verschwinden, so wie auch folgende "Deviation".
Gestern hat mich wieder mal "No fill function is implemented for the Each operator" erwischt, besser gesagt eine Zeile eines vom Mainframe auf einen PC migrierte Funktion. Das Symptom war ein LENGTH ERROR, der Grund war die falsche Behandlung der Anwendung einer Funktion samt Each-Operator auf einen numerischen Leervektor.
Gemäß der reinen Lehre sollte 3↑¨⍳0 einen Leervektor aus dreielementigen numerischen Vektoren ergeben, oder anders ausgedrückt 0⍴⊂3⍴0. Das ist klar, wenn man N in 3↑¨⍳N sukzessive verringert. Stets erhält man einen Vektor der Länge N mit dreielementigen numerischen Vektoren als Elemente. Im Falle N=0 wählt APL2 für Letzteres den Prototyp ↑0⍴3↑¨⍳N, also 3⍴0.
"Tückisch" vollständig lesen
Thursday, 7. February 2008
Ich habe mich ja schon an den SYTNAX ERROR bei selektiven Zuweisungen der Form (R/M[;I])←V und aller möglichen Varianten gewöhnt. Für das Mainfame APL2 ist dies ein absolut gültiger Versuch, Werte in "M" zu verändern.
Das Workstation APL2 spielt da leider nicht mit. Glücklicherweise akzeptiert es aber die Indexfunktion anstelle der Indexierung mit den eckigen Klammern. So können vom Mainframe kommende selektive Zuweisungen dieser Art schnell ersetzt werden.
Das wird allerdings ein wenig nervig, wenn diese Syntax-Fehler kein Ende nehmen. Bei der hier vorliegen Inkompatibilität handelt es sich wohl um die am häufigsten vorkommende.
Deshalb, und weil es sich bei obiger Zuweisung mit den eckigen Klammern um eine elegante, gut zu lesende Schreibweise handelt, ist es mehr als wünschenswert, dass diese Abweichung des Workstation APL2 von Mainframe Standard endlich beseitigt wird.
Bekannterweise gibt es zwischen APL2 für den Mainframe und Workstation APL2 einige Unterschiede. Es sind nicht viele, aber bei größeren Anwendungen können sie die direkte Ausführbarkeit nach einer Portierung auf den PC ernsthaft behindern.
Diese dokumentierten Abweichungen betreffen im Wesentlichen die Sprache, wie sie in der APL2 Language Reference beschrieben ist. Schnittstellen wohin auch immer und sonstige APL2-Vorrichtungen unterliegen von vornherein keinem Kompatibilitätszwang.
Dazu gehören offensichtlich auch die "Supplied Routines", mitgelieferte assoziierbare Funktionen. Selbst Namensgleichheit bedeutet nicht automatisch Gleichheit in der Funktionsweise. Recht drastisch macht das CTN deutlich:
"CTN ist nicht gleich CTN" vollständig lesen
Monday, 7. January 2008
... einige Tage vor dem 11.11. wurde auf der GSE-Tagung der Service Level 11 für APL2 mit 11 Neuerungen und Verbesserungen vorgestellt. Wie jede CSD enthält auch diese einige Bug-Fixes, möglicherweise sogar 11 an der Zahl, ich habe sie aber nicht gezählt. Hier die 11 Neuerungen kurz gefasst:
"Rechtzeitig zur fünften Jahrezeit" vollständig lesen
|