Převod souboru LUA do C
Jak portovat Lua scripts do C, embedovat Lua runtime a vyhnout se nekompatibilním converter tools.
Jak převést soubor lua do formátu c
- Programování
- Dosud nehodnoceno.
Projekt může vyžadovat zdrojový kód v C pro nativní sestavení, embedded target nebo integraci s knihovnou C, zatímco dostupný kód je skript .lua. Lua a C používají odlišné modely provádění, takže se obvykle jedná o portování zdrojového kódu, nikoli o převod formátu souboru.
Co je formát Lua
Soubor .lua je prostý textový zdrojový kód napsaný ve skriptovacím jazyce Lua. Lua nevyžaduje UTF-8; zdrojový kód může používat jakékoli kódování podporované interpretem, ačkoli UTF-8 je běžné. Skripty Lua se běžně používají ve hrách, embedded systémech, konfiguračních nástrojích, Neovimu a aplikacích s integrovaným Lua runtime. Standardní interpreter spouští skript pomocí lua script.lua, zatímco luac jej může zkompilovat do Lua bytecode.
Co je formát C
Soubor .c obsahuje zdrojový kód v C. Kompilátor, například GCC, Clang nebo dodavatelský toolchain, jej převádí na objektový soubor nebo spustitelný soubor. C nabízí předvídatelnou nativní kompilaci, přímý přístup k paměti a hardwaru a širokou podporu operačních systémů a mikrokontrolérů. Vyžaduje však také explicitní datové typy, správu paměti, zpracování chyb a náhradní návrhy pro funkce Lua, jako jsou tabulky, closures, coroutines, metatables a dynamické načítání.
Jak převod provést
Chcete-li vytvořit program v C, který se bude snadno udržovat, přeneste jeho chování ručně:
- Zaznamenejte verzi Lua a závislosti. Spusťte
lua -va zkontrolujte každý výskytrequire, globální proměnné, volání API hostitelské aplikace, nativní modul a použitíloadneboloadfile. - Spusťte původní program s reprezentativními vstupy a uložte jeho výstupy, chyby, chování na hranicích a případy citlivé na výkon.
luac -l script.luamůže pomoci s kontrolou bytecode, nevytvoří však ekvivalentní zdrojový kód v C. - Před překladem jednotlivých příkazů navrhněte datové struktury v C. Jednoduché záznamy mapujte na hodnoty typu
struct, indexované sekvence na pole nebo vektory a tabulky klíč-hodnota na vhodnou implementaci hashovací tabulky. Dynamické hodnoty Lua nahraďte explicitními typy C a definujte vlastnictví a životní cyklus alokované paměti. - Chování specifické pro Lua implementujte záměrně. Zohledněte indexování od 1, pravidla pravdivosti hodnot
nilafalse, více návratových hodnot, garbage collection, metametody, coroutines, vyhledávání podle vzorů a číselný typ Lua. Zachovejte požadovaná hostitelská API nebo je nahraďte rozhraními v C. - Během vývoje port kompilujte jako objektový soubor, například pomocí
cc -std=c17 -Wall -Wextra -O2 -c script.c -o script.o. S funkcímaina požadovanými knihovnami jej propojte až po definování rozhraní a poté porovnejte jeho výsledky s implementací v Lua pomocí pevných vstupů a vstupů pokrývajících hraniční případy.
Malé, samostatné skripty lze někdy přeložit pomocí generátoru Lua-to-C určeného pro konkrétní projekt, nástroje nabízené pod názvy jako lua2c nebo lua2cc však nejsou standardním, univerzálně kompatibilním převodníkem. Před použitím v produkci ověřte podporovanou verzi Lua, pokrytí standardní knihovny, licencování, požadavky generovaného runtime a způsob zpracování dynamického kódu.
Kdy je lepší integrovat Lua
Pokud je požadavkem nativní integrace, nikoli doslovný zdrojový kód v C, ponechte skript a integrujte Lua do aplikace v C. Zahrňte lua.h, lauxlib.h a lualib.h, vytvořte stav Lua, podle potřeby načtěte standardní knihovny a skript volejte prostřednictvím Lua C API. Typické sestavení v systému podobném Unixu je cc host.c $(pkg-config --cflags --libs lua5.4) -o host; název balíčku a verze knihovny se liší podle systému. Tento přístup zachovává sémantiku Lua, stále však distribuuje Lua runtime, takže nejde o převod na samostatnou logiku v C.
Další možnosti výstupu
luac vytváří Lua bytecode závislý na konkrétní verzi, nikoli zdrojový kód v C nebo nativní strojový kód. Zabalením tohoto bytecode s interpreterem lze vytvořit nasaditelný spustitelný soubor, výsledek však zůstává závislý na Lua runtime a obvykle nejde o zdrojový kód v C, který by bylo možné snadno udržovat. LuaJIT může část kódu kompilovat za běhu, neexportuje však běžný zdrojový kód v C. Online služby neposkytují široce důvěryhodný a úplný převod Lua-to-C; pro proprietární kód používejte lokální nástroje. Compiler Explorer může kompilovat a kontrolovat malé, již napsané příklady v C, nepřevádí však Lua.
Limity kompatibility a kvality
Automatický výstup může selhat, pokud kód používá metatables, libovolný obsah tabulek, closures, coroutines, introspekci prostřednictvím debug, dynamické načítání modulů, nativní rozšíření nebo API definovaná aplikací. Jednotlivé verze Lua se také liší knihovnami, podporou integerů, formátem bytecode a chováním interpreteru. Testujte program v C proti původnímu programu s běžnými vstupy, chybnými vstupy, numerickými hraničními případy, omezeními prostředků a chováním specifickým pro platformu; shodný výstup sám o sobě nedokazuje shodu ve vlastnictví paměti, chybách, časování nebo bezpečnostních vlastnostech.
LUA vs C: srovnání formátů
Jak si formáty LUA a C stojí v nejdůležitějších vlastnostech pro tento převod.
| Vlastnost | .LUA Lua | .C C source code |
|---|---|---|
| Čitelný jako prostý text | Ano | Ano |
| Formátování textu | Základní | Základní |
| Obrázky | Ne | Ne |
| Další úpravy | Snadné | Snadné |
| Otevírá se ve webovém prohlížeči | Ne | Částečně |
| Typická velikost souboru | Malé | Malé |
| Otevřený standard | Ano | Částečně otevřený |
| Nejvhodnější pro | Profesionální produkce | Profesionální produkce |
| Zavedeno | 1993 | 1972 |
| Vývojář | Lua.org / Pontifical Catholic University of Rio de Janeiro | Dennis Ritchie / Bell Labs |
| MIME typ | text/x-lua | text/x-c |
Databáze v současné době neobsahuje žádný program na konverzi souborů lua.