{"id":187,"date":"2012-06-20T17:20:59","date_gmt":"2012-06-20T15:20:59","guid":{"rendered":"http:\/\/localhost\/blog\/?p=187"},"modified":"2013-03-07T11:59:51","modified_gmt":"2013-03-07T10:59:51","slug":"un-interprete-per-ook","status":"publish","type":"post","link":"https:\/\/www.ilbytecidio.it\/?p=187","title":{"rendered":"Un interprete per Ook!"},"content":{"rendered":"<p>Questa volta l&#8217;ho fatta grossa! \ud83d\ude00<br \/>\nSe vi state chiedendo come mi \u00e8 saltato in mente di scrivere un interprete per Ook!, il linguaggio di programmazione esoterico pensato per essere compreso dagli orango-tanghi (sic), beh, pu\u00f2 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\u00f9 utile!<!--more--> L&#8217;idea mi \u00e8 venuta ieri scrivendo l&#8217;articolo su <a title=\"Petrovich: il sistema operativo esoterico!\" href=\"http:\/\/www.ilbytecidio.it\/?p=185\">Petrovich<\/a>, dato che l&#8217;autore \u00e8 il medesimo.<\/p>\n<p>Potete scaricare l&#8217;intero sorgente, due file ook di esempio e anche un binario precompilato per Linux a 32 bit <a href=\"http:\/\/www.ilbytecidio.it\/altri_file\/ook.zip\">cliccando qui<\/a>. Uno dei due programmini \u00e8 un &#8220;hello world&#8221; 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!<\/p>\n<p>L&#8217;interprete \u00e8 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&#8217;interpretazione, evitando soprattutto di scorrere di continuo il file o di memorizzare interamente le istruzioni in memoria. Il secondo passaggio \u00e8 l&#8217;interpretazione vera e propria del programma, ora in memoria nella sua forma numerica.<\/p>\n<p>Probabilmente si poteva progettare meglio ed anche il codice dell&#8217;interprete potrebbe essere scritto in modo pi\u00f9 ordinato.. ma in fondo perch\u00e9, dato che forse solo pochi folli come me lo proveranno? \ud83d\ude00<br \/>\nLa dimensione dell&#8217;array a nostra disposizione per i dati \u00e8 fissata nel file memory.cpp. Non credo che qualcuno scriver\u00e0 mai un sorgente in Ook! che usi pi\u00f9 di 64K di dati, ma si pu\u00f2 sempre modificare. Vi \u00e8 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\u00e0!<br \/>\nNon avendo indicazioni precise su come dovrebbe essere strutturato un file sorgente, ho fatto s\u00ec che l&#8217;unica cosa importante \u00e8 che vi sia un numero pari di elementi Ook*, separati da spazi, tabulazioni o &#8220;a capo&#8221;. Ogni istruzione \u00e8 composta da due di questi elementi (l&#8217;unica istruzione non valida \u00e8 &#8220;Ook? Ook?&#8221;).<\/p>\n<p>La primissima versione del programma non usava librerie all&#8217;infuori di quella standard, ma occorreva premere INVIO a ogni carattere in input, il che non andava bene, perch\u00e9 il programmatore dovrebbe avere la possibilit\u00e0 di scegliere se trattare l&#8217;invio in modo diverso dagli altri caratteri. Cos\u00ec ho deciso di usare le curses per avere la funzione getch(). Su Windows potete utilizzare la libreria <a href=\"http:\/\/pdcurses.sourceforge.net\/\">PDCurses<\/a> che ho incluso anche nell&#8217;archivio, mentre su sistemi Unix basta installare le ncurses (ricordate il corrispondente pacchetto dev su Linux).<br \/>\nPer 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<code><\/code><\/p>\n<blockquote><p><code>make<\/code><\/p><\/blockquote>\n<p>e successivamente provare magari uno dei programmini inclusi con<code><\/code><\/p>\n<blockquote><p><code>.\/ook hello.ook<\/code><\/p><\/blockquote>\n<p>Se siete su Linux potete provare il file gi\u00e0 compilato presente nell&#8217;archivio, saltando il primo passaggio.<\/p>\n<p>Non resta molto altro da dire.. divertitevi, se potete!<br \/>\nSperiamo anche che funzioni tutto correttamente, non \u00e8 che mi sia ammazzato di prove!<br \/>\nPer maggiori informazioni si veda la <a href=\"http:\/\/www.dangermouse.net\/esoteric\/ook.html\">pagina ufficiale di Ook!<\/a><\/p>\n<p><strong>AGGIORNAMENTO 02\/08\/2012:<\/strong> Eh s\u00ec, 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&#8217;intera linea. C&#8217;\u00e8 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).<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Questa volta l&#8217;ho fatta grossa! \ud83d\ude00 Se vi state chiedendo come mi \u00e8 saltato in mente di scrivere un interprete per Ook!, il linguaggio di programmazione esoterico pensato per essere compreso dagli orango-tanghi (sic), beh, pu\u00f2 essere per il fatto &hellip; <a href=\"https:\/\/www.ilbytecidio.it\/?p=187\">Continua a leggere<span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[17,26],"tags":[],"class_list":["post-187","post","type-post","status-publish","format-standard","hentry","category-programmazione-cpp","category-miei-software"],"views":160,"_links":{"self":[{"href":"https:\/\/www.ilbytecidio.it\/index.php?rest_route=\/wp\/v2\/posts\/187","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.ilbytecidio.it\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.ilbytecidio.it\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.ilbytecidio.it\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.ilbytecidio.it\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=187"}],"version-history":[{"count":5,"href":"https:\/\/www.ilbytecidio.it\/index.php?rest_route=\/wp\/v2\/posts\/187\/revisions"}],"predecessor-version":[{"id":463,"href":"https:\/\/www.ilbytecidio.it\/index.php?rest_route=\/wp\/v2\/posts\/187\/revisions\/463"}],"wp:attachment":[{"href":"https:\/\/www.ilbytecidio.it\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=187"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.ilbytecidio.it\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=187"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.ilbytecidio.it\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=187"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}