In Arraysprachen denken
(github.com/razetime)In der K-Sprache denken
- K-Programmierung erfolgt größtenteils über ein REPL.
rlwrapfür ngn/k ermöglicht das Durchsuchen des Verlaufs mit den Pfeiltasten und ist für die Entwicklung größerer Programme nützlich.- Funktionen werden im REPL getestet und anschließend in den eigentlichen Code übernommen.
- Die hübsche Ausgabe von ngn/k liefert immer gültige K-Daten zurück und kann zur Beschleunigung von Programmen im Voraus berechnet werden.
- K-Skripte werden so ausgeführt, als hätte man sie ins REPL eingegeben; der Rückgabewert jeder Zeile wird ausgegeben, sofern sie nicht mit einem Semikolon endet.
- Skripte erlauben mehrzeilige Definitionen, was die Lesbarkeit verbessert.
- Um Arbeit in einem Skript zu speichern und im REPL zu verwenden, kann man mit
\lfile.kdie Datei ausführen und Daten laden. - Eine Datei kann im REPL mehrfach geladen werden, wobei frühere Daten überschrieben werden.
- Die REPL-Hilfe, auf die man mit
\zugreift, enthält verschiedene nützliche Befehle.
Vereinfachung der Array-Programmierung
- Array-Programmierung ist ein fortlaufender Prozess, komplexe Muster in kleinere, deklarativere und leichter lesbare Muster zu vereinfachen.
- Wie sich komplexe Muster vereinfachen lassen, wird in "Patterns and Anti-Patterns in APL: Escape from the beginner's plateau - Aaron Hsu - Dyalog '17" ausführlich behandelt.
K-Transformation der Matrixmultiplikation
- Der iterative Algorithmus zur Matrixmultiplikation aus dem Wikipedia-Artikel lässt sich direkt nach K übertragen.
- Das schlechtestmögliche Beispiel für in K übertragenen Code erfordert viele Zuweisungen an globale Variablen, verschachtelte Schleifen und zahlreiche Modifikationen.
- Durch Vereinfachung des Codes lassen sich diese Probleme nacheinander lösen.
Vereinfachung der inneren Schleife
- In der inneren Schleife lässt sich
summit fold (/) vereinfachen. '(each) gibt ein Array zurück und macht dadurch die globale VariableCüberflüssig.- Durch das Entfernen der Variablen
i,jundklässt sich die Schleife vereinfachen.
Schleifen entfernen und globale Variablen minimieren
- Ohne
klässt sich die mittlere Schleife entfernen, indem Zeilen und Spalten direkt einander zugeordnet werden. - Um
jzu entfernen, können die einzelnen Spalten vonBmitA[i]gepaart werden. - Um
izu entfernen, kann eachleft verwendet werden, um jede Zeile vonAmit jeder Spalte vonBzu paaren. - Globale Variablen werden nicht mehr benötigt.
Endgültige Form der Matrixmultiplikationsfunktion
+(Transponieren) ist teuer und kann entfernt werden.- Statt jede Zeile von
xmit jeder Spalte vonyzu multiplizieren, lässt sich implizit dieselbe Arbeit erledigen, indem jede Zeile vonBmit dem gesamtenAabgeglichen wird. - Am Ende erhält man eine kompakte und explizite Funktion zur Matrixmultiplikation.
- Der Prozess der Code-Vereinfachung umfasst anfangs mehrere Schritte, wird aber mit wachsender Erfahrung in K leichter und intuitiver.
- Matrixmultiplikation ist ein einfacher Ablauf, der gut zur Array-Unterstützung von K passt.
- Weitere Algorithmen, die weniger gut zu K passen, und der Umgang mit ihnen sollen in künftigen Kapiteln behandelt werden.
Meinung von GN⁺
- Dieser Beitrag zeigt, wie sich Algorithmen wie die Matrixmultiplikation mit der K-Sprache vereinfachen und optimieren lassen.
- Unmittelbares Feedback über das REPL und die iterative Verbesserung von Code sind zentrale Merkmale der K-Programmierung und auch für Junior-Softwareentwickler eine nützliche Lernmethode.
- Der Prozess der Code-Vereinfachung ist wichtig, um die eigenen Programmierfähigkeiten zu verbessern, und dieser Beitrag erklärt ihn anhand konkreter Beispiele leicht verständlich.
1 Kommentare
Hacker-News-Kommentare
Viele stellen den Nutzen und die Verständlichkeit von Array-Sprachen infrage.
underfunktioniert.Es gibt viele erstaunliche Aspekte von Array-Sprachen, und die obige Liste ist nur ein Teil davon.
Wer noch nie von Array-Programmierung gehört hat und eine Einführung möchte, dem sei „The Array Cast“ empfohlen.
In den 70er-Jahren APL/APL2 entdeckt und sich sofort dafür begeistert, sich aber noch stärker von der Fähigkeit angezogen gefühlt, Funktionen zu komponieren.
Die wichtigste Erkenntnis beim Arbeiten mit Array-Sprachen:
Frage zu Array-Sprachen: Wie erledigt man Aufgaben wie „alle Zahlen kleiner als N finden, für die Bedingung P gilt“?
Erfahrung mit der Sprache J: Das Paradigma von Array-Sprachen ist voreingenommen, und es ist unklar, ob es hilfreich ist, jedes Problem als Verschachtelung von Arrays zu betrachten.
Eindruck beim Lösen von Problemen in K: Die Sprache K ist absichtlich schwer zugänglich.
Beispiel aus der Array-Sprache J: Mit
dot =: +/ . *wird das Skalarprodukt von P und Q berechnet.Die Syntax von K ist kürzer, aber man muss viel eingebauten Kontext darüber im Kopf behalten, wie die Sprache K funktioniert.