# Uiua - Eine Array-orientierte Punkt-freie Programmiersprache (28.03.2025)
In diesem Artikel wollen wir uns die Programmiersprache namens Uiua genauer anschauen. Uiua ist keine Programmiersprache wie die meisten Entwickler das Wort verstehen. Der Unterschied ist am einfachsten zu verstehen, wenn wir uns ein Code Beispiel anschauen:
```uiua
Life ← ↥↧⟜(∩=2⤙3/+≡↻⊂A₂C₂¤)
⁅×0.6 gen⊙⚂ ⊟.30
⇌◌⍥(⟜⊂Life)100⟜¤
≡(▽⟜≡▽) 4
```
Dieser Code ist ein Game of Life, das Resultat kann auf der [Uiua Seite](https://uiua.org/pad?src=0_15_0-rc_1__TGlmZSDihpAg4oal4oan4p-cKOKIqT0y4qSZMy8r4omh4oa74oqCQeKCgkPigoLCpCkK4oGFw5cwLjYgZ2Vu4oqZ4pqCIOKKny4zMCAjIEluaXQK4oeM4peM4o2lKOKfnOKKgkxpZmUpMTAw4p-cwqQgIyBSdW4K4omhKOKWveKfnOKJoeKWvSkgNCAgICAgICAgIyBVcHNjYWxlCg==) angesehen werden. Bevor wir uns aber auf diesen Code fokussieren können, müssen wir uns zuerst die grundlegenden Prinzipien, auf welchen Uiua basiert, verstehen.
## Array-Programmiersprachen
Uiua ist Teil des *Array Programming* Paradigmas. *Array Programming* wurde in den 1960er von Ken Iverson entwickelt und ist ein Weg zu programmieren, bei dem Arrays die grundlegende Datenstruktur bilden. Eine entsprechende Sprache kommt also mit sehr vielen Operationen um die Arrrays zu manipulieren. So können auch die meisten anderen Datenstruktur durch Operationen auf Arrays ersetzt werden.
Während dieses Paradigma nicht sehr intuitiv scheinen mag, gibt es einige Argumente die dafür sprechen. Der wahrscheinlich praktischste Grund ist, dass Arrays "Machine-Sympathetic" sind. Da Arrays in angrenzendem Speicher abgelegt werden, können moderne CPUs die Daten darin sehr schnell verarbeiten. Viele Operationen können vektorisiert werden, was es der CPU ermöglicht, die gleiche Operation auf mehrere Elemente parallel auszuführen. Obwohl die meisten Array Programmiersprachen dynamisch und interpretiert laufen, können sie in gewissen Aufgaben mit der Performance von statischen und kompilierten Programmen mithalten.
Dazu kommt auch, dass viele übliche Algorithmen in Array Sprachen bereits implementiert sind und über einzelne Zeichen ausführbar sind. So können Programme welche in einer Sprache wie C mehrere Zeilen lang sind in einer Array Sprache mit ein paar Zeichen umgesetzt werden. [^1]
## Punktfreie Programmiersprachen (*Tacit Programming*)
Punktfreie Programmierung ist ein Programmier-Paradigma, bei dem Funktionsdefinitionen die Argumente (Punkte) nicht identifiziert, mit denen sie arbeiten. Stattdessen definieren sie nur eine Komposition von anderen Funktionen unter welchen auch kombinatorische Logik ist, welche die Argumente manipulieren. Unix Scripts nutzen dieses Paradigma beispielsweise mit *Pipes*. [^2][^3]
## Wie setzt sich Uiua ab?
Uiua behält die meisten Operationen von anderen Array Programmiersprachen wie APL, J und BQN. Während diese Sprachen jedoch ihren Code mit Syntax und Semantik basierend auf einer mathematischen Notation haben (`1 + 2`, `4×ω-2`, usw.), schreibt Uiua die Werte auf den Stack wobei die Operationen links von den Argumenten stehen (`+ 1 2`, `×4-2`, usw.).
So kann Uiua noch gezielter sein als andere Array Sprachen. Nichts desto trotz wurde Uiua dafür ausgelegt, möglichst lesbar zu sein. Dazu kommt Uiua auch mit eingebauter Funktionalität für die Arbeit mit Bilder, Audio und GIFs.
## Grundlagen
Wie im obigen Beispiel wahrscheinlich schon aufgefallen ist, nutzt Uiua Zeichen, welche nicht zur normalen Palette von Charakter gehören. Ein solches Zeichen heisst *Glyph*. Es gibt grundsätzlich drei Arten, um Code in Uiua zu schreiben, so haben Funktionen immer einen ausgeschrieben Namen, die meisten ein ASCII Zeichen und eben ein Glyph.
Die Operationen werden von Rechts nach Links ausgeführt und operieren auf einem globalen Stack. Eine Zahl schreibt den entsprechenden Wert einfach auf den Stack. Operatoren *Pop*-pen die Werte und *Push*-en das Result auf den Stack.
Nehmen wir beispielsweise folgenden Code:
```uiua
+ 1 2
```
Zuerst werden die Werte von Rechts auf den Stack gepusht. Im Stack sind jetzt also die Werte `1 2`. Der `+`-Operator nimmt diese Werte vom Stack und addiert sie. Das Resultat wird anschliessend wieder auf den Stack geschrieben. Am Ende hat der Stack folgenden Inhalt: `3`. [^4]
Auf die einzelnen Glyphs einzugehen würde den Rahmen dieses Beitrags sprengen. Wenn ihr trotzdem den obigen Code verstehen wollt, oder einfach alle möglichen Operationen ansehen wollt, gibt es auf ihrer Website eine [Übersicht](https://www.uiua.org/docs#functions) von allen Funktionen.
## Fazit
In diesem Beitrag haben wir eine kurze Einführung in die Array-orientierte, punktfreie Programmiersprache Uiua erhalten. Uiua ist eine Innovation in der Array-basierten Programmierung und bietet eine neue Syntax und Semantik für die Manipulation von Daten. Während für die meisten Anwendungsfälle Uiua wahrscheinlich nicht die beste Wahl ist, hoffe ich, dass es nichts desto trotz interessant wahr, einmal einen anderen Ansatz für die Gestaltung einer Programmiersprache zu erkunden.
[^1]: vgl. Introduction, in: Uiua Documentation, 28.03.2025, https://www.uiua.org/tutorial/introduction
[^2]: vgl. Punktfreie Programmiersprache, in: Wikipedia, 28.03.2025, https://de.wikipedia.org/wiki/Punktfreie_Programmiersprache
[^3]: vgl. Tacit Programming, in: Wikipedia, 28.03.2025, https://en.wikipedia.org/wiki/Tacit_programming
[^4]: vgl. Basic Stack Operations and Formatting, in: Uiua Documentation, 28.03.2025, https://www.uiua.org/tutorial/basic