Converti LUA in C
Come portare gli script Lua in C, incorporare il runtime Lua ed evitare strumenti di conversione incompatibili.
Come convertire lua in c file
- Programmazione
- Ancora nessuna valutazione.
Un progetto può richiedere codice sorgente C per una compilazione nativa, un target embedded o l'integrazione con una libreria C, mentre il codice disponibile è uno script .lua. Lua e C utilizzano modelli di esecuzione diversi, quindi normalmente si tratta di un porting del codice sorgente anziché di una conversione del formato del file.
Cos'è il formato Lua
Un file .lua è codice sorgente in testo semplice scritto nel linguaggio di scripting Lua. Lua non richiede UTF-8; il codice sorgente può utilizzare qualsiasi codifica accettata dall'interprete, anche se UTF-8 è comune. Giochi, sistemi embedded, strumenti di configurazione, Neovim e applicazioni con un runtime Lua incorporato utilizzano comunemente script Lua. L'interprete standard esegue uno script con lua script.lua, mentre luac può compilarlo in bytecode Lua.
Cos'è il formato C
Un file .c contiene codice sorgente C. Un compilatore come GCC, Clang o una toolchain del produttore lo trasforma in un file oggetto o in un eseguibile. C offre una compilazione nativa prevedibile, accesso diretto alla memoria e all'hardware e un'ampia compatibilità con sistemi operativi e microcontrollori. Richiede inoltre tipi di dati espliciti, gestione della memoria, gestione degli errori e soluzioni alternative per funzionalità di Lua come tabelle, closure, coroutine, metatabelle e caricamento dinamico.
Come eseguire la conversione
Per ottenere un programma C manutenibile, eseguire manualmente il porting del comportamento:
- Annotare la versione di Lua e le dipendenze. Eseguire
lua -ve analizzare ognirequire, variabile globale, chiamata API dell'applicazione host, modulo nativo e utilizzo diloadoloadfile. - Eseguire il programma originale con input rappresentativi e salvare output, errori, comportamento ai limiti e casi sensibili alle prestazioni.
luac -l script.luapuò aiutare a esaminare il bytecode, ma non produce codice sorgente C equivalente. - Progettare le strutture dati C prima di tradurre le istruzioni. Mappare i record semplici su valori
struct, le sequenze indicizzate su array o vettori e le tabelle chiave-valore su un'implementazione di hash table adeguata. Sostituire i valori dinamici di Lua con tipi C espliciti e definire la proprietà e il ciclo di vita della memoria allocata. - Reimplementare deliberatamente il comportamento specifico di Lua. Tenere conto dell'indicizzazione a partire da 1, delle regole di verità di
nilefalse, dei valori restituiti multipli, del garbage collection, dei metametodi, delle coroutine, del pattern matching e del tipo numerico di Lua. Conservare le API host necessarie o sostituirle con interfacce C. - Durante lo sviluppo, compilare il porting come oggetto, ad esempio con
cc -std=c17 -Wall -Wextra -O2 -c script.c -o script.o. Collegarlo a una funzionemaine alle sole librerie necessarie dopo aver definito le interfacce, quindi confrontare i risultati con l'implementazione Lua usando input fissi e casi limite.
Gli script piccoli e autonomi possono talvolta essere tradotti da un generatore Lua-to-C specifico del progetto, ma gli strumenti pubblicizzati con nomi come lua2c o lua2cc non sono convertitori standard e universalmente compatibili. Prima di utilizzarli in produzione, verificare la versione di Lua supportata dal generatore, la copertura della libreria standard, la licenza, i requisiti del runtime generato e la gestione del codice dinamico.
Quando è preferibile incorporare Lua
Se il requisito è l'integrazione nativa anziché il codice sorgente C vero e proprio, mantenere lo script e incorporare Lua nell'applicazione C. Includere lua.h, lauxlib.h e lualib.h, creare uno stato Lua, caricare le librerie standard secondo necessità e chiamare lo script tramite la Lua C API. Una compilazione tipica su sistemi Unix-like è cc host.c $(pkg-config --cflags --libs lua5.4) -o host; il nome del pacchetto e la versione della libreria variano a seconda del sistema. Questo approccio conserva la semantica di Lua, ma distribuisce comunque un runtime Lua, quindi non costituisce una conversione in logica C standalone.
Altre opzioni di output
luac produce bytecode Lua specifico per la versione, non codice sorgente C né codice macchina nativo. La distribuzione di tale bytecode insieme a un interprete può creare un eseguibile distribuibile, ma il risultato rimane dipendente dal runtime Lua e normalmente non è codice C manutenibile da esseri umani. LuaJIT può compilare parte del codice durante l'esecuzione, ma non esporta normale codice sorgente C. I servizi online non forniscono una conversione Lua-to-C completa e ampiamente affidabile; per il codice proprietario utilizzare strumenti locali. Compiler Explorer può compilare ed esaminare piccoli esempi C già scritti, ma non traduce Lua.
Limiti di compatibilità e qualità
L'output automatico può non funzionare quando il codice utilizza metatabelle, contenuti arbitrari delle tabelle, closure, coroutine, reflection tramite debug, caricamento dinamico dei moduli, estensioni native o API definite dall'applicazione. Anche le versioni di Lua differiscono per librerie, supporto agli interi, formato del bytecode e comportamento dell'interprete. Testare il programma C rispetto all'originale con input normali, input malformati, casi limite numerici, limiti delle risorse e comportamento specifico della piattaforma; la sola corrispondenza dell'output non dimostra la corrispondenza della proprietà della memoria, degli errori, dei tempi o delle proprietà di sicurezza.
Confronto formato: LUA vs C
Come i formati LUA e C si confrontano sulle proprietà più importanti per questa conversione.
| Proprietà | .LUA Lua | .C C source code |
|---|---|---|
| Leggibile come testo semplice | Sì | Sì |
| Formattazione del testo | Base | Base |
| Immagini | No | No |
| Modifica successiva | Facile | Facile |
| Si apre in un browser web | No | Parziale |
| Dimensione tipica del file | Piccolo | Piccolo |
| Standard aperto | Sì | Parzialmente aperto |
| Ideale per | Produzione professionale | Produzione professionale |
| Introdotto | 1993 | 1972 |
| Sviluppatore | Lua.org / Pontifical Catholic University of Rio de Janeiro | Dennis Ritchie / Bell Labs |
| Tipo MIME | text/x-lua | text/x-c |
Il database attualmente non contiene alcun convertitore di file lua.