Dopo cinque anni di sviluppo, è disponibile la versione Lua 5.5, un linguaggio di programmazione rapido e compatto, molto utilizzato come linguaggio incorporato per definire configurazioni e scrivere estensioni. Il codice dell'interprete Lua è scritto in C e distribuito con licenza MIT.
Lua combina una sintassi procedurale semplice con capacità di descrizione dei dati attraverso l'uso di array associativi e semantica estensibile. Lua utilizza una tipizzazione dinamica e le strutture linguistiche vengono trasformate in bytecode che vengono eseguiti sopra una macchina virtuale a registri con un gestore di memoria automatico. L'interprete è strutturato come una libreria integrabile in progetti in C e C++.
Novità principali:
- Per gran parte delle operazioni di gestione della memoria viene utilizzata una modalità incrementale, in cui il ciclo di raccolta della memoria viene suddiviso in singoli passaggi, alternandosi all'esecuzione del programma, consentendo di evitare lunghe interruzioni nell'esecuzione delle applicazioni con un gran numero di oggetti in memoria.
- È stata proposta un'implementazione compatta di array, che richiede il 60% in meno di memoria per array con dati omogenei (il risparmio è ottenuto poiché le informazioni sul tipo vengono salvate non per ogni elemento, ma per un gruppo di elementi).
- È stata aggiunta la possibilità di dichiarare esplicitamente variabili globali in qualsiasi blocco di codice utilizzando la parola chiave "global". Quando si indicano espressioni con la parola chiave "global" in un blocco di codice, tutte le variabili devono essere dichiarate esplicitamente. Se l'annuncio di "global" è assente, viene implicitamente assegnata l'espressione "global *" che mantiene il comportamento precedente e tutte le variabili sono trattate come globali. È stata anche aggiunta l'espressione "global<const> *" in cui tutte le variabili globali non dichiarate esplicitamente diventano accessibili in modalità sola lettura. X = 1 — Ok, X è una variabile globale, il comportamento precedente per impostazione predefinita. do global Y — dichiarazione della variabile Y come globale, tutte le altre variabili nel blocco devono essere dichiarate esplicitamente Y = 1 — Ok, la variabile Y è stata precedentemente definita X = 1 — Errore, la variabile X non è stata definita end X = 2 — Ok, al di fuori del blocco global si applica il comportamento precedente
- Le variabili di controllo specificate nei cicli «for» sono ora accessibili solo in lettura e non possono essere modificate all'interno del corpo del ciclo. Ad esempio, la variabile i, dichiarata nel ciclo «for i = 1, 5 do», non può essere cambiata nel corpo del ciclo.
- Quando si stampano numeri in virgola mobile tramite la funzione print, ora viene mostrato un numero sufficiente di cifre per una corretta conversione inversa da stringa a rappresentazione originale.
- Aumentato il numero massimo di livelli di nidificazione dei costruttori di tabelle.
- Aggiunta la funzione table.create(nseq, nrec) per aggiungere una tabella vuota e allocare in anticipo memoria per il numero specificato di elementi.
- Nella funzione utf8.offset è garantito il ritorno non solo dello spostamento in byte all'inizio del carattere, ma anche della posizione di fine del carattere.
- Aggiunta la supporto per la creazione di stringhe esterne, collocate in memoria non gestita dal garbage collector di Lua.
- Aggiunta la funzione luaL_openselectedlibs per caricare una libreria selezionata, così come la funzione luaL_makeseed, che genera un seed per la funzione lua_newstate.
- In lua.c è garantito il caricamento dinamico della libreria ‘readline’ se è disponibile (se la libreria è presente nel sistema, viene caricata e diventano disponibili le funzioni di modifica delle stringhe).
- Incorporata un'ottimizzazione per il risparmio di memoria durante il caricamento di bytecode precompilato — Lua può ora riutilizzare la memoria in alcune strutture interne senza creare duplicati durante il caricamento di bytecode duplicato.
- Garantito il riutilizzo di tutte le stringhe nelle operazioni di «dump» e «undump».
- Nei buffer ausiliari è garantito il riutilizzo dei buffer (senza copiare in un nuovo buffer) durante la creazione della stringa finale.
Fonte: opennet.ru
