Inform e Glulx/appendici/Appendice C - Gli errori della compilazione
Appendice C - Gli errori della compilazione
modificaLa compilazione è quel processo che trasforma un file sorgente (nel caso di Inform il file contraddistinto dall’estensione .inf
) in un file eseguibile (il file nel formato Z-code
, ovvero l’avventura testuale stessa[1]). Nonostante JIF e WIDE mettano a disposizione degli appositi tasti per effettuare quest’importantissima operazione, non sempre tutto va per il verso giusto (possono cioè verificarsi degli errori che impediscono la creazione del file eseguibile). Vediamo allora di elencare alcune regole per impedire che accada quest’evento (o perlomeno per evitare che accada spesso):
- ad ogni parentesi graffa aperta ({), ne deve sempre corrispondere una chiusa (}); la stessa cosa vale per le parentesi tonde e quadre ([ ]). Questo è l’errore più tipico che si possa fare, e purtroppo è anche uno dei più difficili da trovare, perché il compilatore produce in genere una sfilza di errori che non hanno nulla a che vedere con quello che a noi interessa. Spesso poi, non bisogna fidarsi troppo dei numeri di riga, perché non è detto che l’errore sia sempre nelle righe corrispondenti, ma magari è nelle "vicinanze" (qualche riga più sopra o più sotto) o addirittura in qualche altra parte del programma. JIF, comunque, ci viene in aiuto con un’apposita funzione di controllo delle parentesi;
- ogni istruzione deve terminare (salvo alcune eccezioni) con un punto e virgola (;). Se questo simbolo viene omesso il compilatore genera, come nel punto 1, una sfilza di errori che non hanno nulla a che vedere con quello che a noi interessa;
- tutto quello che viene dichiarato deve sempre essere usato. Non si può cioè definire, ad esempio, una costante
MAX
e non usarla all’interno del programma. Il compilatore in questo caso genera sempre un messaggio di errore[2] e lo stesso discorso vale anche per le variabili, le funzioni, gli oggetti, ecc.; - tutto quello che non viene dichiarato non può essere usato. Non è possibile, cioè, cercare di utilizzare una variabile, una funzione, un oggetto o altro se non è stato prima dichiarato (o, per dirla in parole più semplici, creato);
- a parte rare eccezioni (riguardanti soprattutto alcune estensioni), il file eseguibile deve essere sempre creato senza le segnalazioni di warning. Esistono infatti due tipi di errori: quello più grave (indicato dal compilatore come
Error
➨ impedisce la creazione del file eseguibile) e quello più "lieve" (indicato dal compilatore comeWarning
➨ non impedisce la creazione del file eseguibile, ma può dare dei problemi durante lo svolgimento del gioco); - se viene generata una lista di errori, occorre risolvere il primo e, dopo, tutti quelli che lo seguono. Nella maggior parte dei casi, infatti, alcuni errori nascono come conseguenza di quelli fatti prima. Risolti questi ultimi, anche gli altri scompaiono;
- non si può definire un nuovo verbo che è già esistente. Potete però ampliarne il significato tramite le istruzioni
Extend
eExtend only
, come spiegato nel paragrafo 4.9[3]; - in Inform si possono usare, di default, solo i valori numerici compresi tra –32768 e 32767. Una variabile, cioè, può contenere solo un valore numerico compreso nel range sopra indicato. In caso contrario, il compilatore non genera un errore, ma i valori memorizzati in essa sono completamente diversi e casuali, con dei risultati totalmente imprevedibili;
- le librerie di sistema non si devono mai modificare. Vanno invece usate le apposite istruzioni per la modifica dei messaggi di default, delle azioni e della status line[4]; in questo modo si evitano dei possibili errori e (soprattutto) non si violano i diritti di copyright (le librerie di sistema – quelle di Inform e quelle italiane – sono di proprietà dei rispettivi autori, e nessuno – salvo una loro precisa autorizzazione – può modificarle né tantomeno distribuirle);
- sebbene esistano diverse versioni della Z-machine, è vivamente consigliato usare la versione 5 (
.z5
) per le avventure testuali a lunghezza standard, e la versione 8 (.z8
) per quelle più grosse. A volte (anche se raramente) è possibile trovare qualche gioco nella versione 6 (.z6
) usata per supportare la grafica e il suono. Ma in questo caso è molto meglio usare Glulx, una virtual machine a 32 bit il cui compilatore supporta appieno le caratteristiche della (vecchia) Z-machine. In questo modo è possibile, per un programmatore Inform, compilare il suo programma anche per Glulx e accedere così alle istruzioni extra di quest’ultimo per ottenere una maggiore interattività dal punto di vista grafico e sonoro[5]; - Non potete usare l’istruzione
include
su un file che non esiste o che non si trova nella path library specificata di default nell’editor di testo. Nel caso ad esempio di WIDE, supponendo che il mio listato Inform contenga l’istruzioneInclude "Parser";
e che la path library di default sia "C:\Inform\Libraries", se al momento della compilazione il fileParser.h
non si trova nella directory sopra specificata, il compilatore Inform genererà un errore che bloccherà l’operazione in corso; - Tutto quello che viene dichiarato nel file di include, deve sempre essere utilizzato. Non posso, cioè, definire un’ipotetica variabile
count
dichiarata ad esempio nel fileVariabili.h
e non utilizzarla all’interno del listato. Questo perché quando inizia la fase di compilazione, il compilatore Inform riunisce tutti questi file "esterni" in un unico file che poi utilizza per creare (se non ci sono ovviamente degli errori) l’eseguibile; - la status line, se usata, va sempre inizializzata. Per sapere come fare, consultate il paragrafo 5.1.
Occorre ora spendere qualche parola su un altro tipico errore "informiano":
#C:\Jif\games\Ruins.inf(154): Warning: This statement can never be reached
generato, per esempio, dal seguente codice:
description [; "Potresti farci dell'ottimo olio d’oliva."; print "Extra-vergine naturalmente."; ],
dove l’istruzione print
non può essere presa in considerazione dal compilatore. Per far sì che questo non avvenga occorre aggiungere quest’istruzione anche alla riga sopra:
description [; print "Potresti farci dell'ottimo olio d’oliva."; print "Extra-vergine naturalmente."; ],
e il problema è risolto. Un altro caso in cui si può verificare quest’errore, è quando "sposto" di posizione una specifica istruzione:
[ Initialise; TitlePage(); move map to player; move sodium_lamp to player; move dictionary to player; StartDaemon(sodium_lamp); location = Forest; thedark.description = "L'oscurit@`a intorno a te @`e opprimente e ti senti quasi soffocare."; "^^^Dopo giorni di inutili ricerche, passati senz'acqua attraversando i rovi della foresta, alla fine la tua pazienza @`e stata ricompensata: hai fatto una scoperta!^"; ];
Se l’istruzione location
non si trova all’inizio della funzione Initialise
(o, in questo caso, subito sotto la chiamata alla funzione TitlePage
), il compilatore non riuscirà a "trovarla". Attenzione quindi all’ordine che date alle istruzioni delle vostre avventure!!!
Vi ricordo poi, che in fase di esecuzione potrebbero verificarsi degli errori che per il compilatore non esistono. Questi sono i tipici casi in cui il programmatore scambia, ad esempio, il nome di una stanza per un altro, oppure assegna un valore sbagliato (ad esempio 3 al posto di 2) ad una variabile locale. Per il compilatore va tutto bene (non sono cioè presenti errori di sintassi), ma i risultati non sono ovviamente quelli voluti; in questi casi si può ricorrere alla forzatura dell’esecuzione del gioco, come accade nel seguente esempio:
[ Initialise; TitlePage(); !############################################################### location = Square_Chamber; move camera to player; move newspaper to player; steps.rubble_filled = false; remove mushroom; ! ############################################################## move map to player; move sodium_lamp to player; move dictionary to player; StartDaemon(sodium_lamp); thedark.description = "L'oscurit@`a intorno a te @`e opprimente e ti senti quasi soffocare."; "^^^Dopo giorni di inutili ricerche, passati senz'acqua attraversando i rovi della foresta, alla fine la tua pazienza @`e stata ricompensata: hai fatto una scoperta!^"; ];
Se voglio testare direttamente la Sala Quadrata con tutti gli oggetti della cassa da imballaggio nell’inventario del giocatore, stabilisco Square_Chamber
come nuova locazione di partenza, sposto la macchina fotografica e il giornale nell’inventario dell’archeologo, libero il passaggio dalle macerie e rimuovo il fungo. Ecco il risultato:
RUINS Un esempio di lavoro interattivo. Copyright (c) 1999 di Graham Nelson. Traduzione e adattamenti di Vincenzo Scarpa e Raffaello Valesio (c) 2002-2003 su permesso dell'autore. Versione 1 -- Numero di serie 041109 Inform v6.30 -- Libreria 6/11 -- Infit v2.5 S <code>La Sala Quadrata Sei in una sala di pietra oscura e profonda, larga circa dieci metri. Un raggio di sole, proveniente dalla cima della scalinata, la illumina diffusamente, ma le ombre del livello più basso rivelano dei passaggi verso est e sud, che conducono verso la più profonda oscurità del Tempio. Delle iscrizioni scolpite riempiono le pareti, il pavimento e il soffitto. >i Stai portando: un dizionario maya di Waldeck una lampada al sodio la mappa di Quintana Roo un giornale di un mese fa una macchina fotografica a lastre >su Il Grande Altopiano I tuoi appunti menzionano qualcosa circa questa bassa scarpata di calcare, ma la foresta pluviale ne ha rivendicato il possesso. Cupi ulivi crescono ovunque, e una pioggia appena smessa riempie l'aria con una calda nebbia bagnata. La "Struttura 10" è un cumulo di materiali da costruzione, che una volta avrebbero potuto costituire una piramide sepolcrale, ma della quale ora nulla rimane, eccetto alcuni gradini scolpiti nella nuda roccia che portano giù, nell'oscurità. La tua cassa d'imballaggio giace qui, pronta per contenere eventuali scoperte di alto valore culturale da riportare alla civiltà. >esamina la cassa La cassa d'imballaggio è vuota. >giù La Sala Quadrata Delle iscrizioni scolpite riempiono le pareti, il pavimento e il soffitto. >
In questo modo, è possibile testare ogni singola parte del gioco, riuscendo così a capire dove si verificano gli errori più "profondi".
Per i programmatori più esperti, Inform mette a disposizione delle specifiche istruzioni che permettono di controllare il processo di compilazione (le direttive, inizianti tutte con il carattere #
e descritte nel paragrafo 3.17). Dei loro esempi di utilizzo potete trovarli nei listati avventura.inf e negozio.inf, oppure, si può sempre dare un’occhiata al listato di "La pietra della luna", la bellissima avventura testuale scritta da Paolo Lucchesi.
Non mi resta che augurare una buona compilazione a tutti...
Note
modifica- ↑ In realtà, i file codificati in questo formato non sono dei veri e propri file eseguibili (che sono invece contraddistinti dall’estensione
.exe
); questo perché i file nel formato Z-code hanno bisogno, per essere eseguiti, di un programma chiamato interprete (mentre un file eseguibile si avvia da solo, senza nessun programma aggiuntivo). Gli interpreti variano a seconda del sistema operativo usato e su Windows il più famoso è sicuramente Windows Frotz 2002 di David Kinder. Per ulteriori informazioni, consultate il capitolo 2. - ↑ Ad esempio
#C:\Jif\games\Ruins.inf(59): Warning: Defined constant "MAX" declared but not used
che qui è proprio alla riga 59 ma, lo ripeto per l’ennesima volta, non è sempre così. - ↑ Un esempio di messaggio per questo tipo di errore è
#C:\Jif\games\Ruins.inf(1059): Error: Two different verb definitions refer to "prendi"
dove si è cercato di definire, mediante l’istruzioneVerb
, il verboprendi
che esiste già in Infit. - ↑ Con questo termine s’intende la barra in alto che compare nella finestra di Windows Frotz 2002 (o in qualsiasi altro interprete Z-code) quando iniziate a giocare un’avventura testuale. Per ulteriori informazioni, consultate il capitolo 5.
- ↑ Occorre ricordare che Infit (così come Jif) supporta appieno anche Glulx, e che i giochi in questo formato devono essere eseguiti dal programma WinGlulxe. Ulteriori informazioni potete trovarle nel capitolo 6.