It's not a bug, it's a feature

Linguaggi di programmazione esoterici: i più difficili da imparare

Ci sono linguaggi di programmazione che fanno impazzire chiunque voglia impararli ed utilizzarli.

Abbiamo iniziato tutti a scrivere programmi in Java, C, C++ ecc. ed i programmatori più vecchi di noi usavano linguaggi leggermente più difficili come Pascal, Fortran, COBOL che comunque in confronto a questi sembrano semplici.

Questi linguaggi di programmazione sono noti come “linguaggi di programmazione esoterici” e sono stati creati sia per testare i limiti dei linguaggi di programmazione sia per scherzo.
Linguaggi particolarmente complessi e volutamente meno chiari possibile, popolari fra hacker ed utenti più abili ma comunque non aventi alcuna utilità nel mondo reale.

Alcuni non sono mai andati al di là dei sistemi degli inventori e probabilmente non li avrete mai sentiti nominare, ma ecco alcuni linguaggi di programmazione che porteranno velocemente il vostro cervello al capolinea.

Brainfuck

Questo linguaggio è difficile così come suggerito dal nome stesso.
Inventato da Urban Muller nel 1993, con l’obbiettivo di creare un linguaggio per una macchina di Turing che potesse essere implementato con il compilatore più piccolo possibile.

Brainfuck lavora su un array di byte inizializzato a 0 con un puntatore che inizialmente punta al primo byte, e due stream di byte per I/O.

Esistono soltanto 8 comandi in questo linguaggio e sono:

  • > incrementa il puntatore
  • < decrementa il puntatore
  • + incrementa il byte indirizzato dal puntatore
  • – decrementa il byte indirizzato dal puntatore
  • . output del byte indirizzato dal puntatore
  • , input del byte indirizzato dal puntatore
  • [ salta in avanti all’istruzione dopo il corrispondente ] se il byte indirizzato dal puntatore è 0
  • ] salta indietro all’istruzione dopo il corrispondente [ se il byte indirizzato dal puntatore non è 0
Un esempio di programma in Brainfuck. Stampa semplicemente “Hello Word”

 

COW

Esattamente come mucca in inglese è stato creato pensando ai bovini.
Visto che le mucche hanno un vocabolario decisamente limitato, sembrava doveroso incorporare le uniche parole a loro note in un linguaggio di programmazione.
Ne consegue che tutte le istruzioni sono delle varianti di “moo” cosa che è appunto ciò che accade all’unica parola che loro conoscono.

Basato anch’esso sulla macchina di Turing, possiede un set di 11 istruzioni, ovviamente case-sensitive, e mette a disposizione un registro temporaneo che può contenere un intero.
Come condizione iniziale vi è un puntatore che punta alla prima cella ed in ogni cella vi è 0.

Qualsiasi altro simbolo che non è un’istruzione viene ignorato. Quindi possono essere utilizzati o meno spazi, a capo o tabulazioni, il che rende il codice facilmente commentabile a patto che il commento non contenga un’istruzione.

Le 11 istruzioni sono:

  • moo: comando connesso al comando MOO. Quando viene incontrata questa istruzione durante la normale esecuzione, l’interprete ricerca il comando MOO senza eseguire le istruzioni che incontra, ed esegue l’istruzione successiva al MOO trovato
  • moO: incrementa il puntatore
  • mOo: decrementa il puntatore
  • mOO: Esegue l’istruzione con codice dell’istruzione uguale al contenuto della cella corrente. Se la cella contiene il valore 3 è non valido, perché si incorrerebbe in un ciclo infinito
  • Moo: Se il valore della cella corrente è 0, allora legge un singolo carattere ASCII dalla tastiera (più precisamente standard input) e lo salva nella cella corrente. Se invece la cella non contiene 0, allora stampa a video (standard output) il carattere ASCII corrispondente
  • MoO: incrementa il valore della cella di 1
  • MOo: decrementa il valore della cella di 1
  • MOO: Se il contenuto della cella è 0, allora torna alla chiamata effettuata con il comando moo. Se invece il valore della cella non è 0, allora continua con l’istruzione successiva
  • OOO: imposta il valore della cella a 0
  • MMM: Se non c’è nessun valore nel registro, allora copia al suo interno il valore corrente della cella. Se invece c’è un valore, incolla tale valore nella cella corrente e svuota il registro
  • OOM: Stampa a video (più precisamente nello standard output) il valore della cella come numero intero
  • oom: Legge un numero intero da tastiera (più precisamente dallo standard input) e lo salva nella cella corrente
Esempio di programma scritto in COW

 

INTERCAL

The Compiler Language With No Pronounceable Acronym, abbreviato non si sa secondo quale criterio in “INTERCAL”.
Prevede costrutti di controllo che fanno sganasciare dalle risate.

INTERCAL ha caratteristiche che lo rendono davvero fastidioso da usare: usa statement come “READ OUT”, “IGNORE”, “FORGET” e modificatori come “PLEASE”.

PLEASE è integrato in due modi: se il programmatore non lo utilizza frequentemente, il programma è considerato non sufficientemente educato ed un alert viene mostrato, in alternativa viene mostrato un alert anche quando questo viene usato troppo frequentemente perché il programmatore risulta troppo educato.

Esempio di programma in INTERCAL

 

Whitespace

Rilasciato l’1 Aprile 2003 e questo fece pensare che fosse un “pesce d’aprile”, ma non lo era.
Come si può immaginare, in questo linguaggio hanno senso solo tabulazioni, spazi ed a capo.
L’interprete ignora totalmente gli altri caratteri. Una conseguenza interessante è che un programma Whitespace può essere facilmente contenuto in un qualsiasi altro programma scritto in un altro linguaggio.

 

Chef

Un linguaggio di programmazione basato sullo stack in cui sembra che si stia seguendo una ricetta.

In accordo con la Home Page di Chef, i principi basi per Chef sono:

  • I programmi ricetta non devono generare solamente output validi, ma devono essere semplici da preparare e deliziosi
  • Le ricette devono essere preparabili con diversi budgets
  • Le ricette sfruttano il sistema metrico, ma è possibile utilizzare le tradizionali misure da cucina come tazze e cucchiai
Esempio di programma scritto in Chef

 

Vi sono tantissimi altri linguaggi esoterici davvero assurdi tra cui:

  • LOLCODE: creato per imitare il linguaggio dei “lolcat”
  • Befunge: programmi distesi in un array bidimensionale nel quale il puntatore viene fatto scorrere
  • FALSE: basato sugli stack, dotato di comandi a singolo carattere
  • Malbolge: talmente complesso che il primo programma “Hello Word” funzionante è arrivato due anni dopo il suo rilascio
  • Monicelli: linguaggio nel quale ogni istruzione è data attraverso una supercazzola

 

Qualcuno di voi, ora che ne conosce l’esistenza, sarebbe così folle da studiarne uno per puro divertimento?

Published by
Francesco Clemente