Inform 7: programmazione in linguaggio (quasi) naturale per avventure testuali

Zork

Girovagando per la rete in cerca di materiale per un progetto personale, sono recentemente incappato in Inform 7.

 

ZorkInform 7 è un linguaggio di programmazione creato appositamente per la stesura di Interactive Fictions (da ora in poi IF), volgarmente note come “avventure testuali” (anche su wikipedia, il link sulle “text adventures” porta qui).

Le avventure testuali sono giochi in cui la descrizione dell’ambiente è fornita da un testo esplicativo.

Le avventure testuali sono giochi in cui la descrizione dell’ambiente è fornita da un testo esplicativo (in alcuni casi con immagini e suoni di sfondo) e i comandi si danno scrivendo delle frasi in inglese, per i più anziani navigati un nome dirà tutto: Zork.

Dopo un periodo di fulgore, anche dovuto alla poca potenza e capacità di memoria dei computer dell’epoca, questi giochi sono diventati una nicchia per appassionati e si sono spostati sul lato della “letteratura” (da qui il nome IF) perché la loro forza è nella descrizione dell’ambiente e nelle interazioni tra i personaggi e l’ambiente stesso.

In Giappone e in Asia le IF vendono ancora,

anche grazie ad una loro evoluzione, le Visual Novels – che sono essenzialmente la loro controparte “grafica”, di solito con immagini statiche manga-like, a volte anche più sofisticate.

Inform

Il linguaggio in sèè stato scritto come “sovrainsieme” della versione precedente (la 6, che guardacaso fa rima con “you don’t say?”), e permette di compilare il gioco risultante in ambienti ormai consolidati per visualizzare opere del genere: la Z-machine, nata appunto per far girare i giochi tipo Zork (e di cui esistono varie implementazioni e diverse versioni), o Glulx, che ne è una derivazione più moderna (es. con interi a 32 bit, mentre le Z-machines li hanno a 16).

Si tratta di software in genere gratuiti e liberamente scaricabili, anche se non sempre dotati di sorgente, come appunto Inform, che non lo fornisce.
La cosa più interessante di questo linguaggio è che è dedicato a persone che non sanno programmare.

La cosa più interessante di questo linguaggio è che è dedicato a persone che non sanno programmare ma intendono scrivere, quindi permette di descrivere l’ambiente in un inglese “naturale”.

Ovviamente ci sono alcune regole da seguire, ma il sorgente non si discosta molto da una descrizione testuale molto concisa.

Faccio un esempio di sorgente minimale, tratto da uno dei manuali:

The apartment is a room. "Behold Bob's apartment. That smell is coming from the pile of dishes in the sink."
The apartment complex's lobby is south of the apartment. "Rows of mailboxes are set into the wall. Box 114 is Bob's."
Mr Bob Dobalena is a man in the apartment. "Bob is wearing an old Transformers t-shirt with some well-loved jeans."
T-shirt, jeans, and a pair of shoes are wearable things. Bob is wearing the shoes, the T-shirt, and the jeans.

Compilando questo sorgente, otteniamo un mondo composto di due stanze (rooms) ovvero “posti” in cui avverranno le azioni proprie del gioco, una persona (person, o meglio in questo caso man) e tre oggetti (things) con la proprietà “indossabile” (wearable) direttamente messi addosso a Bob.

Il mondo sopra descritto è già esplorabile

Il mondo sopra descritto è già esplorabile, ad esempio andando a sud (dalla stanza di Bob alla lobby) o chiedendo una descrizione degli oggetti.

Parrà poco, ma pensate che è stato prodotto da quattro frasi in semplice inglese e fornendo alcune descrizioni (le parti tra virgolette) che verranno mostrate all’utente / giocatore ma non sono interattive.

zork-1

Nonostante la semplicità, il linguaggio è molto avanzato. Implementa il paradigma ad oggetti:

An archway is a kind of door.

la creazione di attributi anonimi, o meglio nominati automaticamente:

An archway can be magic or mundane. An archway is usually not magic.

la creazione di valori enumerati:

Colour is a kind of value. The colours are red, orange, yellow, green, blue, indigo and violet.

la possibilità di gestire attributi costanti:

An archway is always open.

oppure di creare attributi nuovi, con valori di default, anche per le classi “di sistema”:

An archway has a number called the horizontal clearance. It is usually 6.

o anche di inserire classi “in mezzo” alla gerarchia a seconda delle necessità:


A Bengal tiger is a kind of animal.

(quanto sopra risulterà diventare la gerarchia animal > bengal tiger)


A mammal is a kind of animal. A Bengal tiger is a kind of mammal.

(adesso la gerarchia è animal > mammal > bengal tiger)

Ovviamente, essendo dedicato alla scrittura di IF, ha i suoi difetti: ad esempio il data hiding (o la sua mancanza, come ad esempio accadeva nello SmallTalk V) e se vogliamo una certa farraginosità nell’uso di strutture dati avanzate, come le tabelle (array singoli o multipli):


Table of Energy Proponents
Proponent Fuel      Danger
Bob       Hydrogen  a number
Phoebe    Wind      --
--        Geothermal--
Jean      Nuclear   10
with 4 blank rows.

Notare come il linguaggio determini i tipi fondamentali (string, number, value od object) dal contesto, rendendo necessaria la specifica solo in caso di mancanza del primo elemento della tabella. Inoltre va indicato che la tabella ha anche quattro righe vuote, perchè in Inform l’allocazione è sempre statica (anche se il linguaggio gestisce le liste, ma con limitazioni).

L’inferenza dei tipi di dato avviene anche in altri casi, più o meno come ci aspetteremmo ad esempio in OCaML, con limitazioni dovute sempre al fatto che parliamo di un linguaggio per un dominio specifico.

Il linguaggio è fornito inoltre di costrutti imperativi per l’assegnazione (let, now oppure change), la selezione (if e switch, quest’utlimo a la Python), i cicli (repeat). è possibile definire funzioni (actions) ed eventi (rules). è inoltre un linguaggio “completo”, nel senso che è possibile modificare anche le strutture fondamentali del linguaggio (activities) dal linguaggio stesso.

Ci sono poi numerose estensioni, disponibili sul sito principale insieme a vari manuali: innanzitutto quello di riferimento e quello per programmatori, ma c’è anche altra documentazione.

Le versioni per Mac e per Windows hanno anche interessanti IDE.

Le versioni per Mac e per Windows hanno anche interessanti IDE con aiuti “grafici” che vengono aggiornati durante la costruzione della IF.

È possibile allegare ad ogni progetto dei materiali, come immagini e suoni, e farli vedere durante il gioco.

È sicuramente un sistema interessante di per se, avvicinandosi a quello che Knuth chiamava “literate programming”:

Programming is best regarded as the process of creating works of literature, which are meant to be read… so we ought to address them to people, not to machines.

(Donald Knuth, “Literate Programming”, 1981)

 

La storia dei linguaggi di programmazione in un infografica
La storia dei linguaggi di programmazione in un infografica
L'Evoluzione Dei Videogiochi Per PC
L'Evoluzione Dei Videogiochi Per PC
RSA Animate - Choice
Scrivere un tema con un linguaggio di programmazione
XKCD: Python
RSA Animate - Language as a Window into Human Nature
Programming languages taste test