Von der Liebe zu Emojis

Emojicode: Die Programmiersprache, von der du hättest träumen sollen

Theo Weidmann

© Shutterstock / photototo

Vor geraumer Zeit hatte Theo Weidmann die Idee, eine Programmiersprache zu entwickeln, die einzig aus Emojis besteht. Fragt man ihn, wie er auf diese Idee kam, antwortet er: „Um ehrlich zu sein, da bin ich mir selbst nicht mehr ganz sicher. Aber ich kann mich daran erinnern, dass mir jemand eine Nachricht mit einer Vielzahl von Emojis geschickt hat. Ich nehme an, dass ist der Punkt, an dem mein Gehirn angefangen hat, Emojis in Code zu übersetzen.“ In diesem Artikel erklärt er die Funktionsweise von Emojicode.

Während ich das Projekt zu Beginn nicht sonderlich ernst genommen habe, bemerkte ich doch recht schnell, dass ich im Begriff war, eine wirkliche Programmiersprache zu schreiben. Eine Sprache, in der ich alle falschen Entscheidungen vermeiden konnte, die andere vor mir begangen hatten. Natürlich setzte ich von Anfang an auf Klassen. Aber bald war mir bewusst, dass ich ebenfalls Protokolle (Interfaces) benötigte. Da bemerkte ich, wie sehr ich Sprachen hasste, in denen an beliebigen Stellen plötzlich ein NULL-Wert auftauchen konnte, weil man die Dokumentation nicht sorgfältig genug gelesen hatte (Schäm dich!). So begann ich damit, Optionals einzubauen. Und wer mag schon keine Closures?

Eine kurze Tour soll verdeutlichen, wie diese Features den Emojicode stärken!

Eine schnelle Klasse

Wer setzt heutzutage noch auf eine nicht-objektorientierte Programmierung? Ich denke niemand. Daher ist es sinnvoll, dass der Emojicode einen erstklassigen Class-Support bekommt. Lasst uns eine Klasse deklarieren, die eine Person „👤“ repräsentiert:

🐇👤🍇

🍉

Nicht sehr interessant, oder? Nun fügen wir noch einige Instanzvariablen (Name, Alter) und einen Initialiser hinzu:

🐇 👤 🍇
   🍰 name 🔡
   🍰 age 🚂
  🐈 👶 @name 🔡 🍇
     🍮 name @name
     🍮 age 0
   🍉
🍉

Ich denke, es ist relativ klar, worum es hier geht. Nicht ganz eindeutig ist, dass es sich bei „🚂“ um einen Integer-Typen handelt. 🍮 wird benutzt, um Variablen einen Wert zuzuweisen.

Es gibt noch weitere erwähnenswerte Punkte in unserem Beispiel. Alle Initialisers haben einen Namen. So kann sichergestellt werden, dass man immer denjenigen benutzt, den man auch verwenden will – ein überaus praktisches Feature. Der Initialiser in unserem Beispiel heißt „👶“. Der Emojicode erlaubt es, jegliche Zeichen als Variablen (außer Emojis) zu benutzen. Das ist der Grund, warum ich den Initialiser @name nenne. Aber das Wichtigste im Umgang mit Initialisers in Emojicide ist, dass sie die Initialisierung sämtlicher Instanzvariablen durchsetzen. Wenn man versucht, das obige Beispiel mit folgendem Initialiser zu kompilieren:

🐈 👶 @name 🔡 🍇
   🍮 name @name
🍉

Würde man folgende Nachricht bekommen: „🚨 Line 5 columm 6 person.emojic: Instance variable „age“ must be initialized“.
Verabschiedet euch von NullPointerExceptions!

Darüber hinaus sind Instanzvariablen ausschließlich bei Class-Methoden anwendbar. Das ist ein großartiger Weg, um die Kapselung durchzuführen – Sprachen wie Ruby machen das vor. Wenn wir den Namen einer Person zugänglich machen wollen, müssen wir eine bessere Methode schreiben.

🐖 🙋 ➡ 🔡 🍇
   🍎 name
🍉

Das ist ein Haufen Code: Er bestimmt jedoch hauptsächlich eine Methode (🐖) namens „🙋“, die einen String (🔡) zurückgibt. Der 🍎 ist bloß eine Return-Erklärung, die in unserem Beispiel den Namen der Person auswirft.

Lets’s call a callable

Wie zu Beginn des Artikels erwähnt, unterstützt Emojicode Closures und Funktionen. In Emojicode nennen wir Funktionen Callables, da sie die einzigen Typen sind, die aufgerufen werden können. Fügen wir nun also eine Methode hinzu, die ein Callable zu unserer Personenklasse zurückgibt.

🐖 🕵 ➡ 🍇🔡🍉 🍇
   🍎 🍇 greeting 🔡
     😀 🍪 greeting name 🍪
   🍉
🍉

Hier bezeichnet „🍇 🔡 🍉“ einen Callable-Typen, der ein String-Argument benutzt und nichts erwidert. Die 🍇 im Body der Class-Methode kreiert 🍇 ein Closure, das die Umwelt erfasst.

Jetzt können wir eine Personeninstanz mit dem Namen „🕵–Methode“ erzeugen und das Returned Closure benutzen.

🐇🐖 🏁 ➡ 🚂 🍇
    🍦 charly 🔷👤👶 🔤 Charly🔤

    🍦 greeter 🕵 charly

    🍭 greeter 🔤 Hello🔤
    🍭 greeter 🔤 Howdy🔤

    🍎 0
🍉

Wie man sehen kann, definiert der obrige Code eine neue Methode, konkret eine Class-Methode: 🐇 🐖 🏁 ➡ 🚂 🍇. Diese Methode ist entscheidend, da sie den Startpunkt des Programms darstellt. Außerdem benutzen wir an dieser Stelle eine neues Emoji: 🍦. 🍦 erklärt und initialisiert eine Frozen-Varibale. Eine Frozen-Variable verhält sich wie eine konstante Variable, deren Wert nicht mehr verändert werden kann, nachdem er einmal gesetzt worden ist.

Die Ausgabe des obrigen Codes lautet wie folgt:

Hello, Charly
Howdy, Charly

Das mag nun alles etwas schnell gegangen sein; aber wie ich anfangs gesagt habe, handelt es sich hierbei um eine schnelle Tour, die die stärksten Features des Emojicodes thematisieren soll.

Generics for the win

Zu guter Letzt: Generics. Generics sind eines meiner Lieblingsfeatures in Emojicode, da sie eine hervorragende Möglichkeit darstellen, um doppelten Code zu vermeiden – eines meiner Leitprinzipien beim Programmieren.

Der generische Typ, mit dem man am meisten interagiert, ist die „🍨“-Klasse. Sie repräsentiert eine Liste (ähnlich wie eine Reihe). Nun werden wir eine 🍨–Instanz erstellen und da Listen häufig genutzt werden, gibt es einen Shortcut:

🍨 🔤 Enterprise🔤 🔤 Excelsior🔤 🔤 Relativity🔤 🍆

Dies gibt eine Instanz des Typs 🍨 🐚 🔡 zurück. Und jetzt kommt das Beste: Der Compiler erschließt den konkreten Listentyp (das ist das Argument für Generics). Er erkennt, dass die Liste bloß Strings (🔡) umfasst und benutzt deshalb 🐚 🔡. Wenn man nun auf die Liste zugreift, bekommt man ein 🔡–Objekt und kann auch nur 🔡–Objekte hinzufügen.

Stellen wir uns vor, dass wir einen neuen Array auf Basis dieser Werte erstellen wollen, indem wir allen Strings „USS“ voranstellen. Das ist recht einfach machbar:

🍦 starships 🍨🔤Enterprise🔤 🔤 Excelsior🔤 🔤 Relativity🔤🍆
🍦 g 🐰 starships 🐚🔡 🍇 starship 🔡 ➡ 🔡
   🍎 🍪🔤USS 🔤 starship 🍪
🍉

🐰 verhält sich wie eine Map-Methode, die man aus anderen Programmiersprachen kennt. Es erstellt ein neues Array und ruft die gegebene Callable für jeden Wert des alten Arrays auf und fügt sie dem neuen hinzu. So sollte „g“ nun einen Array mit „USS Enterprise“ umfassen usw. Um das zu prüfen, wiederholen wir den Array und lassen uns die Werte ausgeben:

🔂 ship g 🍇
   😀 ship
🍉

Wenn wir das Snippet zum Laufen bringen, bekommen wir folgendes Ergebnis:

USS ENTERPRISE
USS EXCELSIOR
USS RELATIVITY

Supercalifragilisticexpialigetisch!

Okay, nun habt ihr die High-Speed-Tour hinter euch gebracht. Und jetzt, wo ihr wisstt, wie mächtig der Emojicode ist, kannst du einen Blick auf die Emojicode-Dokumentation werfen und mit dem Programmieren beginnen! Ich bin gespannt, was du mit dem Emojicode auf die Beine stellen kannst!

Aufmacherbild: Emoji Head Woman via Shutterstock / Urheberrecht: photototo

Verwandte Themen:

Geschrieben von
Theo Weidmann

Theo Weidmann ist der Erfinder von Emojicode. Er liebt Ruby und Jazz.

Kommentare

Hinterlasse einen Kommentar

Hinterlasse den ersten Kommentar!

avatar
400
  Subscribe  
Benachrichtige mich zu: