MatteoVignoli.it

Linguaggi di programmazione basati su Emoji ed Emoticon

(5 min read) fun emoji linguaggi

Le emoji hanno mille usi: nei messaggi, sui social, si possono trovare negli url ed è perfino possibile registrare un dominio fatto da emoji; da lì ad usarle per creare un linguaggio di programmazione il passo è breve e quasi ovvio.

Si chiamano linguaggi esoterici ma non servono per evocare divinità arcaiche, bensì per divertire e far impazzire i programmatori spingendo sempre più in là i confini di questa professione:

An esoteric programming language (ess-oh-terr-ick), or esolang, is a computer programming language designed to experiment with weird ideas, to be hard to program in, or as a joke, rather than for practical use.

Sono stati inventati centinaia di questi linguaggi, da quelli senza alcuna finalità pratica o impossibili da utilizzare (come il whitespace, che usa solo spazi, o *, fatto da soli asterischi) a quelli più assurdi come il LOLCODE o il famoso Brainfuck (mi piacerebbe parlarne in un futuro post). Non potevano pertanto mancare quelli basati sulle Emoji: ve ne presento 3 ma non sono gli unici, e sicuramente ne verranno creati altri in futuro.

Potete divertirvi a provarli usando questo spettacolare editor: https://tio.run/

Emoji

Emoji utilizza una lista finita di comandi (che potete trovare qui 👉 https://esolangs.org/wiki/Emoji) ognuno rappresentato da una specifica emoji (token), ed è un linguaggio esoterico basato sullo stack: è qui che gli oggetti vengono aggiunti, rimossi e manipolati per eseguire le diverse operazioni.

Partiamo vedendo l'immancabile "Hello, World" :

💬Hellow, World💬➡

I due 💬 racchiudono una stringa e la aggiungon allo stack, mentre ➡ ne stampa il contenuto.
Vediamo un paio di operazioni di poco più complesse:

💬5💬🔢💬2💬🔢🌊➡
3.0

Prendi la stringa "5", (dopo averla messa nello stack) convertila in numero 🔢, fai lo stesso con il 2 e poi somma i due numeri presenti nello stack 🌊. Stampando il risultato si ha 3.0 (la conversione è in float e non int)

Esempio di implementazione di un substring:

💬substring💬💬3💬🔢💬6💬🔢✂➡
str

Prendi la stringa "substring", prendi il 3 (indice di partenza, inclusivo), prendi il 6 (indice di arrivo, non inclusivo) e taglia la stringa ✂

Un piccolo sforzo in più ed ecco un esempio di manipolazione di array:

📚💬"my_array"💬📲💬"my_array"💬📱🚲📌💬"my_array"💬📱💬"ciao"💬📌💬"my_array"💬📱💬0💬🔑➡
True

Analizziamo gli elementi punto per punto:

  • Crea un array vuoto (e aggiungilo allo stack) 📚
  • salvalo in una variabile chiamata "my_array" 💬my_array💬📲
  • ora prendi il contenuto di "my_array" 💬my_array💬📱
  • aggiungi True allo stack 🚲
  • e mettilo nell'array 📌
  • prendi il contenuto di "my_array" 💬my_array💬📱
  • prendi la stringa "Ciao" 💬"Ciao"💬
  • e mettila nell'array 📌
  • prendi il contenuti di "my_array" 💬my_array💬📱
  • e prendi l'elemento all'indice 0💬"0"💬🔑
  • stampa il risultato

Se al posto di 0 ci fosse stato 1, l'output sarebbe stato, quindi, ciao

emoji_screen

💻, o Emoji-gramming

Anche qusto linguaggio si basa sullo stack; ci sono 24 variabili rappresentate da altrettante emoji che sono inizializzate a 0 e possono contenere interi senza segno:

♈ ♉ ♊ ♋ ♌ ♍ ♎ ♏ ♐ ♑ ♒ ♓
🕐 🕑 🕒 🕓 🕔 🕕 🕖 🕗 🕘 🕙 🕚 🕛

🚨, invece, è chiamato Instruction Counter e conserva il numero di riga corrente - funziona da JUMP se gli si assegna un valore, mentre normlamente viene inizializzato a 0 e aumenta di 1 ad ogni comando eseguito.

I comandi sono quattro, uno per linea (linee senza comando sono commenti).
😊 a b Assegna ad "a" il valore "b"
😇 a b Assegna ad "a" il valore "a" + "b"
😈 a b Assegna ad "a" il valore "a" - "b"
😵 a b Se "a" uguale a "b" salta il comando successivo

Per le costanti vengono utilizzati i cuori:
💔 è 0
💜 è 1
💕 è 2
💞 è 4
💖 è 8

Input e Output possono essere usati con il comando 😊, al posto di "a" e "b"
🎤 al posto di "a"; inserisce il carattere ASCII/Unicode nella variabile "b".
📢 al posto di "b"; stampa il carattere ASCII/Unicode corrispondente alla variabile "a".

L'Hello, World! non è dei più intuitivi, ma una volta compresa la logica è relativamente semplice (attenzione, # non è la sintassi valida per un commento, l'ho messo io per seguire meglio l'elaborazione riga per riga):

😊🕐💖   # 🕐 = 8
😇🕐🕐   # 🕐 diventa 16 (8+8)
😊🕑🕐   # 🕑 = 16
😇🕑🕑   # 🕑 diventa 32 (16+16)
😊🕒🕑   # 🕒 = 32
😇🕒🕒   # 🕒 diventa 64 (32+32)
😊♈💖    # ♈ = 8
😇♈🕒    # ♈ diventa 72 (8+64))
😊📢♈    # ouput 72 [H]
😊♈💜    # Assegna ♈ = 1
😇♈💞    # ♈ diventa 5 (1 + 4)
😇♈🕑    # ♈ diventa 37 (4+32)
😇♈🕒    # ♈ diventa 101 (37+64)
😊📢♈    # ouput 101 [e]
😊♉💞    # ♉ = 4
😇♉💖    # ♉ diventa 12 (4+8)
😇♉🕑    # ♉ diventa 44  (12+32)
😇♉🕒    # ♉ diventa 108 (44+64)
😊📢♉    # output ♉ [l]
😊📢♉    # output ♉ [l]
😊♊💜    # ♊ = 1
😇♊💕    # ♊ diventa 3 (1+2)
😇♊💞    # ♊ diventa 7 (3+4)
😇♊💖    # ♊ diventa 15 (7+8)
😇♊🕑    # ♊ diventa 47 (15+32)
😇♊🕒    # ♊ diventa 111 (47+64)
😊📢♊    # output ♊ [o]
😊♈💞    # ♈ = 4
😇♈💖    # ♈ diventa 12 (4+8)
😇♈🕑    # ♈ diventa 44 (12+32)
😊📢♈    # output ♈  [,]
😊📢🕑   # output 🕑 (32) [spazio]
😊♈💜    # ♈ = 1
😇♈💕    # ♈ diventa 3 (1+2)
😇♈💞    # ♈ diventa 7 (3+4)
😇♈🕐    # ♈ diventa 23 (7+16)
😇♈🕒    # ♈ diventa 87 (23+64)
😊📢♈    # output ♈ [W]
😊📢♊    # output ♊ [o]
😊♈💕    # ♈ = 2
😇♈🕐    # ♈ diventa 18 (2+16)
😇♈🕑    # ♈ diventa 50 (18+32)
😇♈🕒    # ♈ diventa 114 (50+64)
😊📢♈    # output ♈ [r]
😊📢♉    # output ♉ [l]
😊♈💞    # ♈ = 4
😇♈🕑    # ♈ diventa 36 (4+32)
😇♈🕒    # ♈ diventa 100 (36+64) 
😊📢♈    # output ♈ [d]
😊♈💜    # ♈ = 1
😇♈🕑    # ♈ diventa 33 (1+32)   
😊📢♈    # output ♈ [!]
😊♈💖    # ♈ = 8
😇♈💕    # ♈ diventa 10 (8+2)
😊📢♈    # output ♈ [\n]

👉 Provalo online!(H()

Emojicode

Emojicode è, a tutti gli effetti, un vero e proprio linguaggio di programmazione: open source, è fortemente tipizzato, ha classi, variabili, generics, closures e strutture di controllo. L'autore lo presenta come

a language that aims to provide the most modern and powerful features to make it easy, fast and fun to write programs.

e a guardare la documentazione si rimane stupiti dalla completezza e dalla potenza di questo linguaggio. Come verrebbe un Hello, World! ? Ecco qua:

🏁 🍇
   💭 Questo è un commento
   😀🔤 Hello, World!🔤❗️
🍉

Ma, come dicevo, emojicode non si ferma qui. Abbiamo if/else

🏁 🍇
💭 Le seguenti assegnazioni sono immutabili
a ➡️ 50  💭 Assegno 50 ad "a", il type è inferito
b ➡️ 30  💭 Assegno 30 ad "b"

↪️ a ▶️ b 🍇  💭 if a > b (start block)
  😀 🔤a is greater than b🔤❗️
🍉
🙅 🍇       💭 else
  😀 🔤a is not greater than b🔤❗️
🍉          💭 end block

🍉

e anche classi:

🏁 🍇
🐇 👩‍💼 🍇            💭 Instanzio la classe "persona"
  🖍🆕 nome 🔡         💭 proprietà
  🖍🆕 cognome 🔡
  
  💭 inizializzatore:
  🆕 🍼 firstname 🔡 🍼 lastname 🔡 🍼  🍇🍉
🍉
🍉

(vengono instanziate cosi:)

🏁 🍇
🆕👩‍💼 🔤Matteo🔤 🔤Vignoli🔤❗️
🍉

Se volete sbizzarrirvi a questo link trovate tutta la documentazione ufficiale, è davvero tanta roba.

Simili ma non proprio nella stessa categoria ci sono poi i linguaggi che utilizzano le emoticon come comandi:

Emoticon

Emoticon, progettato nel 2004 da David Donachie, usa gli smiles come istruzioni per i programmi. Si basa su tre concetti fondamentali: Emoticon, l'unità base del codice (bocca, naso e faccia hanno i loro significati); Liste, l'unica struttura dati presente; Data items, ossia tutto il resto. Il linguaggio ha loop, if/else, goto, ecc. e "Hello, World!" si stampa cosi:

hello world :-Q S:-P :-Q

hello -> DataItem "hello" viene messo a destra della lista ":"
world -> DataItem "world" viene messo a destra della lista ":"
:-Q -> DataItem a sx ("hello") stampato e rimosso (cmd Q)
S:-P -> DataItem a sx della lista "S:" viene stampato (cmd P)
:-Q -> DataItem a sx ("world") stampato e rimosso (cmd Q)

Emotinomicon

Questo linguaggio è stato inventato nel 2016 da Conor O'Brien ed è fondamentalmente basato sullo stack. Non c'è molta documentazione a corredo ma un interprete in javascript che si può scaricare o provare online, con tanto di spiegazione sulle operazioni eseguite dal codice!

Hello, World! in emotinomicon funziona cosi:

😭!dlroW ,olleH😲⏪⏬⏩

😭 - Inizia la stringa
😲 - Termina la stringa
⏪ - Inizia un loop su ogni carattere
⏬ - Stampa il carattere corrente
⏩ - Esce dal loop

Buon divertimento!

Condividi:


Matteo Vignoli

Matteo Vignoli