Un interprete per Ook!

Questa volta l’ho fatta grossa! 😀
Se vi state chiedendo come mi è saltato in mente di scrivere un interprete per Ook!, il linguaggio di programmazione esoterico pensato per essere compreso dagli orango-tanghi (sic), beh, può essere per il fatto che mi ricorda tanto il Monkey Kombat di Monkey Island 4 e ho approffitato del fatto di desiderare di imparare uno di questi linguaggi per riprendere dimestichezza con C++ (dopo anni di C e Java!), dato che ho in mente qualche tutorial più utile! L’idea mi è venuta ieri scrivendo l’articolo su Petrovich, dato che l’autore è il medesimo.

Potete scaricare l’intero sorgente, due file ook di esempio e anche un binario precompilato per Linux a 32 bit cliccando qui. Uno dei due programmini è un “hello world” e il secondo serve a provare i clicli annidati: vi chiede di inserire due caratteri e poi li stampa varie volte. I commenti e i messaggi di output sono in inglese. Spero sia un inglese passabile!

L’interprete è piuttosto semplice, meno di 300 linee di codice. Del resto, per un linguaggio con solo 8 istruzioni non poteva essere diversamente. Il file sorgente scritto in Ook! viene letto e registrato in memoria in un linguaggio intermedio (qualcosa di lontanamente simile al bytecode di Java). Mentre si fa questo si controlla che il sorgente sia scritto correttamente. La memorizzazione in forma numerica consente di facilitarne l’interpretazione, evitando soprattutto di scorrere di continuo il file o di memorizzare interamente le istruzioni in memoria. Il secondo passaggio è l’interpretazione vera e propria del programma, ora in memoria nella sua forma numerica.

Probabilmente si poteva progettare meglio ed anche il codice dell’interprete potrebbe essere scritto in modo più ordinato.. ma in fondo perché, dato che forse solo pochi folli come me lo proveranno? 😀
La dimensione dell’array a nostra disposizione per i dati è fissata nel file memory.cpp. Non credo che qualcuno scriverà mai un sorgente in Ook! che usi più di 64K di dati, ma si può sempre modificare. Vi è anche un limite alla grandezza del sorgente, data dalla massima dimensione della classe string di C++. Non so quanto sia di preciso, ma sono certo che basterà!
Non avendo indicazioni precise su come dovrebbe essere strutturato un file sorgente, ho fatto sì che l’unica cosa importante è che vi sia un numero pari di elementi Ook*, separati da spazi, tabulazioni o “a capo”. Ogni istruzione è composta da due di questi elementi (l’unica istruzione non valida è “Ook? Ook?”).

La primissima versione del programma non usava librerie all’infuori di quella standard, ma occorreva premere INVIO a ogni carattere in input, il che non andava bene, perché il programmatore dovrebbe avere la possibilità di scegliere se trattare l’invio in modo diverso dagli altri caratteri. Così ho deciso di usare le curses per avere la funzione getch(). Su Windows potete utilizzare la libreria PDCurses che ho incluso anche nell’archivio, mentre su sistemi Unix basta installare le ncurses (ricordate il corrispondente pacchetto dev su Linux).
Per provarlo su Windows ho usato WxDev-C++. Dovrebbe bastare aprire il progetto e compilarlo, ma con qualche ritocco al Makefile.win potete usare tranquillamente un altro IDE o comunque un compilatore diverso dal MinGW. Su Linux e affini basta entrare nella directory del programma e dare il comando

make

e successivamente provare magari uno dei programmini inclusi con

./ook hello.ook

Se siete su Linux potete provare il file già compilato presente nell’archivio, saltando il primo passaggio.

Non resta molto altro da dire.. divertitevi, se potete!
Speriamo anche che funzioni tutto correttamente, non è che mi sia ammazzato di prove!
Per maggiori informazioni si veda la pagina ufficiale di Ook!

AGGIORNAMENTO 02/08/2012: Eh sì, ci ho lavorato ancora. Mio malgrado ho dovuto complicare un pochino (ma non troppo) il codice per gestire esplicitamente la posizione corrente nella finestra. Infatti stampando il carattere Carriage Return veniva cancellata l’intera linea. C’è anche un ulteriore file, scroll.ook, che ho utilizzato per accertarmi che lo scroll avvenisse correttamente. Nella cartella Output trovate anche un file precompilato per Windows (32 bit).

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *