Dopo cinque anni di sviluppo, è disponibile il rilascio di Lua 5.5, un linguaggio di programmazione veloce e compatto, ampiamente adottato come linguaggio incorporato per la definizione della configurazione e per la scrittura di estensioni. Il codice dell'interprete Lua è scritto in C e viene distribuito con licenza MIT.
Lua combina una sintassi procedurale semplice con la possibilità di descrivere dati attraverso l'uso di array associativi e una semantica linguistica estensibile. Lua utilizza la tipizzazione dinamica, e le strutture linguistiche vengono convertite in bytecode, eseguito sopra una macchina virtuale a registri con un garbage collector automatico. L'interprete è fornito come libreria, integrabile nei progetti in C e C++.
Novità principali:
- Per la maggior parte delle operazioni di garbage collection viene utilizzata la modalità incrementale, in cui il ciclo di garbage collection viene suddiviso in passaggi singoli, alternandosi all'esecuzione del programma, il che consente di eliminare lunghe pause nell'esecuzione di applicazioni con un gran numero di oggetti in memoria.
- È stata proposta un'implementazione compatta degli array che richiede il 60% in meno di memoria per gli array con dati omogenei (il risparmio è ottenuto grazie al fatto che le informazioni sul tipo non vengono memorizzate per ogni singolo 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 specificano espressioni nel blocco di codice con la parola chiave «global», tutte le variabili devono essere necessariamente dichiarate esplicitamente. Se la dichiarazione «global» è assente, l'espressione «global *» viene impostata implicitamente, mantenendo il comportamento precedente in cui tutte le variabili sono considerate globali. È stata inoltre aggiunta l'espressione «global<const> *», in cui tutte le variabili globali non dichiarate diventano disponibili in modalità di sola lettura. X = 1 — Ok, X — variabile globale, comportamento predefinito precedente. 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 è definita end X = 2 — Ok, al di fuori del blocco global, il comportamento precedente continua ad applicarsi.
- Le variabili di controllo specificate nei cicli «for» sono ora disponibili solo in sola lettura e non possono essere modificate all'interno del ciclo. Ad esempio, la variabile i dichiarata nel ciclo «for i = 1, 5 do» non può essere modificata all'interno del corpo del ciclo.
- Durante l'output di numeri a virgola mobile tramite la funzione print, ora viene mostrato un numero sufficiente di cifre per garantire una corretta conversione inversa da stringa alla rappresentazione originale.
- È stato aumentato il numero massimo di livelli di nidificazione dei costruttori di tabelle.
- È stata 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 che venga restituito non solo lo spostamento in byte all'inizio del carattere, ma anche la posizione della fine del carattere.
- È stato aggiunto il supporto per la creazione di stringhe esterne allocate in memoria non gestita dal garbage collector di Lua.
- È stata aggiunta la funzione luaL_openselectedlibs per caricare la libreria selezionata, oltre alla funzione luaL_makeseed, che genera una seed di semina per la funzione lua_newstate.
- In lua.c è stata implementata il caricamento dinamico della libreria 'readline' se presente (se la libreria è nel sistema, viene caricata e le funzioni di modifica delle righe diventano disponibili).
- È attivata 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 copia in un nuovo buffer) durante la creazione della stringa finale.
Fonte: opennet.ru
