Konwertuj LUA na C
Jak przenosić skrypty Lua do C, osadzać runtime Lua i unikać niekompatybilnych narzędzi konwertujących.
Jak konwertować lua do c
- Programowanie
- Brak ocen.
Projekt może wymagać kodu źródłowego C na potrzeby kompilacji natywnej, systemu wbudowanego lub integracji z biblioteką C, podczas gdy dostępny kod jest skryptem .lua. Lua i C korzystają z różnych modeli wykonywania, dlatego zazwyczaj jest to przeniesienie kodu źródłowego, a nie konwersja formatu pliku.
Czym jest format Lua
Plik .lua zawiera zwykły tekst będący kodem źródłowym napisanym w języku skryptowym Lua. Lua nie wymaga UTF-8; kod źródłowy może używać dowolnego kodowania akceptowanego przez interpreter, chociaż często stosuje się UTF-8. Skrypty Lua są powszechnie używane w grach, systemach wbudowanych, narzędziach konfiguracyjnych, Neovim oraz aplikacjach z wbudowanym środowiskiem wykonawczym Lua. Standardowy interpreter uruchamia skrypt za pomocą polecenia lua script.lua, natomiast luac może skompilować go do kodu bajtowego Lua.
Czym jest format C
Plik .c zawiera kod źródłowy C. Kompilator, taki jak GCC, Clang lub zestaw narzędzi dostawcy, przekształca go w plik obiektowy lub plik wykonywalny. C zapewnia przewidywalną kompilację natywną, bezpośredni dostęp do pamięci i sprzętu oraz szeroką obsługę systemów operacyjnych i mikrokontrolerów. Wymaga jednak jawnego określania typów danych, zarządzania pamięcią, obsługi błędów oraz zastąpienia mechanizmów Lua, takich jak tabele, domknięcia, współprogramy, metatabele i ładowanie dynamiczne, odpowiednimi rozwiązaniami.
Jak przeprowadzić konwersję
Aby uzyskać łatwy w utrzymaniu program C, przenieś działanie ręcznie:
- Zapisz wersję Lua i zależności. Uruchom
lua -v, przeanalizuj każde użycierequire, zmiennych globalnych, wywołań API aplikacji hostującej, modułów natywnych orazloadlubloadfile. - Uruchom oryginalny program z reprezentatywnymi danymi wejściowymi i zapisz jego wyniki, błędy, zachowanie na granicach oraz przypadki wrażliwe na wydajność.
luac -l script.luamoże pomóc w analizie kodu bajtowego, ale nie generuje równoważnego kodu źródłowego C. - Zaprojektuj struktury danych C przed przetłumaczeniem instrukcji. Odwzoruj proste rekordy na wartości typu
struct, sekwencje indeksowane na tablice lub wektory, a tabele klucz-wartość na odpowiednią implementację tablicy mieszającej. Zastąp dynamiczne wartości Lua jawnymi typami C oraz określ zasady własności i czas życia przydzielonej pamięci. - Celowo odtwórz zachowanie charakterystyczne dla Lua. Uwzględnij indeksowanie od 1, zasady prawdziwości
nilifalse, wielokrotne wartości zwracane, odśmiecanie pamięci, metody metametod, współprogramy, dopasowywanie wzorców oraz typ liczbowy Lua. Zachowaj wymagane API hosta lub zastąp je interfejsami C. - Podczas pracy kompiluj przeniesiony kod jako plik obiektowy, na przykład za pomocą
cc -std=c17 -Wall -Wextra -O2 -c script.c -o script.o. Po zdefiniowaniu interfejsów połącz go z funkcjąmaini wymaganymi bibliotekami, a następnie porównaj jego wyniki z implementacją Lua, używając ustalonych danych wejściowych oraz przypadków brzegowych.
Małe, samodzielne skrypty można czasami przetłumaczyć za pomocą generatora Lua-to-C dostosowanego do konkretnego projektu, jednak narzędzia reklamowane pod nazwami takimi jak lua2c lub lua2cc nie są standardowymi, uniwersalnie zgodnymi konwerterami. Przed użyciem w środowisku produkcyjnym sprawdź obsługiwaną wersję Lua, zakres obsługi biblioteki standardowej, licencję, wymagania dotyczące generowanego środowiska wykonawczego oraz sposób obsługi dynamicznego kodu.
Kiedy lepiej osadzić Lua
Jeśli wymaganiem jest natywna integracja, a nie dosłowny kod źródłowy C, pozostaw skrypt i osadź Lua w aplikacji C. Dołącz lua.h, lauxlib.h oraz lualib.h, utwórz stan Lua, wczytaj wymagane biblioteki standardowe i wywołaj skrypt za pośrednictwem Lua C API. Typowa kompilacja w systemie uniksopodobnym wygląda tak: cc host.c $(pkg-config --cflags --libs lua5.4) -o host; nazwa pakietu i wersja biblioteki zależą od systemu. To podejście zachowuje semantykę Lua, ale nadal wymaga dystrybucji środowiska wykonawczego Lua, więc nie jest konwersją do samodzielnej logiki C.
Inne opcje wynikowe
luac tworzy zależny od wersji kod bajtowy Lua, a nie kod źródłowy C ani natywny kod maszynowy. Spakowanie tego kodu bajtowego z interpreterem może utworzyć wdrażalny plik wykonywalny, ale wynik nadal zależy od środowiska wykonawczego Lua i zazwyczaj nie stanowi kodu C łatwego w utrzymaniu przez człowieka. LuaJIT może kompilować część kodu w czasie wykonywania, ale nie eksportuje zwykłego kodu źródłowego C. Usługi internetowe nie oferują powszechnie zaufanej i kompletnej konwersji Lua-to-C; w przypadku kodu zastrzeżonego używaj narzędzi lokalnych. Compiler Explorer może kompilować i analizować małe, wcześniej napisane przykłady C, ale nie tłumaczy Lua.
Ograniczenia zgodności i jakości
Automatycznie wygenerowany wynik może nie działać, gdy kod używa metatabel, tabel o dowolnej zawartości, domknięć, współprogramów, refleksji za pośrednictwem debug, dynamicznego ładowania modułów, rozszerzeń natywnych lub interfejsów API zdefiniowanych przez aplikację. Różne wersje Lua różnią się również bibliotekami, obsługą liczb całkowitych, formatem kodu bajtowego oraz zachowaniem interpretera. Testuj program C w porównaniu z oryginałem, używając zwykłych i niepoprawnych danych wejściowych, przypadków brzegowych związanych z liczbami, limitów zasobów oraz zachowania zależnego od platformy; zgodność samych wyników nie dowodzi zgodności własności pamięci, błędów, czasu działania ani właściwości bezpieczeństwa.
Porównanie formatu LUA z C
Jak formaty LUA i C wypadają w porównaniu pod względem najważniejszych cech dla tej konwersji.
| Cecha | .LUA Lua | .C C source code |
|---|---|---|
| Czytelny tekstowo | Tak | Tak |
| Formatowanie tekstu | Podstawowy | Podstawowy |
| Obrazy | Nie | Nie |
| Dalsza edycja | Łatwy | Łatwy |
| Otwiera się w przeglądarce internetowej | Nie | Częściowo |
| Typowy rozmiar pliku | Mały | Mały |
| Otwarty standard | Tak | Częściowo otwarty |
| Najlepszy do | Profesjonalna produkcja | Profesjonalna produkcja |
| Wprowadzono | 1993 | 1972 |
| Twórca | Lua.org / Pontifical Catholic University of Rio de Janeiro | Dennis Ritchie / Bell Labs |
| Typ MIME | text/x-lua | text/x-c |
Baza danych obecnie nie zawiera żadnych bezpośrednich linków do konwerterów plików lua.