Approfondiamo Lua 5.2 Beta

Lo sviluppo di Lua procede lento ma costante. Ieri è stata infatti rilasciata la Beta di Lua 5.2. La nuova versione del linguaggio introduce, come è solito, grandi cambiamenti e una manciata di incompatibilità con le precedenti versioni. Vediamone alcune (la lista completa la trovate qui)

No more fenv for threads or functions

In Lua5.1 e nelle versioni precedenti ogni funzione ha una tabella ambiente. Tale tabella immagazzina alcune informazioni sulla funzione e in particolare risolve le variabili globali contenute in essa (potete modificare tale tabella con i comandi getfenv/setfenv).

In L5.2 invece questa tabella non esiste più. Tutto il sistema di gestione delle variabili globali è stato spostato in un oggetto _ENV. Tale oggetto è condiviso da tutto il codice (a meno che non viene esplicitamente ridefinito come local da qualche parte.

In pratica immaginate che ogni funzione “base” sia in realtà un metodo di _ENV e che quindi venga invocato come _ENV.mia_funzione(). È un po’ grezza come spiegazione ma credo renda l’idea.

tables honor the __len metamethod

Una meta-tabella è una tabella che contiene informazioni sulla tabella stessa e può essere collegata ad una tabella con il comando setmetatable. Fra le informazioni presenti in questa tabella c’è ad esempio il meta-metodo __len che fornisce informazioni sulla dimensione della tabella. Tuttavia in L5.1 tale metodo soffriva di alcuni problemi logici (specialmente se veniva ridefinito). Facciamo un esempio:

t = setmetatable({}, { __len = function(t) return 3 end })
t[1], t[2], t[3], t[4], t[5] = "e", "d", "c", "b", "a"
= #t -- Restituisce correttamente 3

Creiamo una tabella vuota e ridefiniamo __len in modo tale che restituisca sempre 3. L’operatore #t restituirà quindi il valore restituito dal meta-metodo anche se in realtà t ha 5 elementi. Corretto: la ridefinizione di un meta-metodo ha priorità anche sulla realtà stessa. Tuttavia in L5.1 le tabelle non rispettano tale meta-metodo per operazioni come la concatenazione e l’ordinamento dei valori. Il L5.2 questo comportamento è stato risolto (non ho conferme dirette, se potete confermatemelo).

hex and \* escapes in strings

Aggiunti alcuni codici di escape nelle stringhe. Il primo (\x) permette di inserire direttamente il codice esadecimale del carattere che segue. Il secondo (\x) è utile solo per questioni di leggibilità del codice.

print("Hello \*    
               World"
) --> Hello World

Questo codice infatti ignora tutti gli spazi successivi. Nell’esempio precedente quindi la scritta stampata sarà corretta. Se provate a togliere il carattere vedrete che “World” sarà molto lontano da “Hello”.

new library for bitwise operations

Nuova libreria per le operazioni binarie. La libreria è denominata bit e contiene bit.band, bit.bnot, bit.bor, bit.rol, bit.ror, bit.lshift, bit.rshift, bit.btest, and bit.bxor.

goto statement

Abominio. In L5.2 è stato introdotto il comando goto, croce e delizia di molti programmatori hardcore. Ripeto, come mio solito, che non esiste NULLA che possa essere fatto con goto che non possa essere fatto con if, while e break. Tuttavia, se usato raramente e saggiamente, il goto può semplificare il codice a scapito della chiarezza. Ogni volta che usate un goto un gatto muore. Pensateci bene.

emergency (and generational) garbage collector

Ci sono due grossi cambiamenti nel garbage collector. Il primo riguarda il garbage collector di emergenza: in pratica questo comportamento lancia il garbage collector massivamente non appena un allocazione fallisce (nella speranza di liberare spazio), dopo di che l’allocazione viene rilanciata e, se fallisce nuovamente, viene dato definitivamente errore.
Il secondo comportamento (garbage collector generazionale) è invece ancora marcato come sperimentale ma è decisamente interessante: questa modalità sfrutta il principio per cui è più probabile che abbia bisogno di essere deallocato un oggetto creato di recente rispetto ad un oggetto che è presente in memoria da tempo. Questo si traduce in un ottimizzazione del processo di garbaging. Questi due cambiamenti sono decisamente importanti dal punto di vista prestazionale.

Altri cambiamenti

C’è un altro listone di cambiamenti che non ho tempo di analizzare nel dettaglio. Molte modifiche alle librerie standard e ben 11 aggiunte alle API C (che dovrò studiarmi prima o poi per migliorare e adattare LuaGrip). Tutte le novità sembrano essere interessanti sia per gli hardcore lua developer sia per gli utenti finali. Non ci resta che aspettare con trepidazione la versione finale di questa nuova generazione del linguaggio.

Comments are closed.