
LuAOT - ahead-of-time kompajler za Luu
Lua je stvarno fleksibilan jezik, ali njena standardna implementacija se bazira na interpretaciju virtualne mašine, što dovodi do groznih performansi. Mislim da je AOT kompilacija, kojom se kod prevodi prije samog izvršavanja, najbolje rješenje za ovaj problem. Koristio sam TypeScript i Bun runtime za izradu samog kompajlera, dok je jezgra (runtime) napisana u C-u radi maksimalne učinkovitosti.
Arhitektura
Projekt se sastoji od nekoliko ključnih faza koje osiguravaju brzinu i stabilnost:
- Analiza i Parsiranje: Koristim
luaparseza generiranje abstract syntax tree-a jer je to doslovno jedini način da se Lua kod parsira u TypeScriptu. - LLVM Codegen: Jezgra sustava je
codegen.tskoji AST pretvara u LLVM IR kod. Posebno sam ponosan na implementaciju fast pathova za petlje gdje se koriste sirovidoubletipovi umjesto sporijeg pakiranja u Lua strukture. - C Runtime: Runtime definira
LuaValuestrukturu i upravlja tablicama te memorijom, osiguravajući da kompajlirani kod ima svu potrebnu podršku za rad.
Performanse i rezultati
Provedeni benchmarkovi pokazuju velike prednosti. Prema mojim mjerenjima, iterativni izračuni i rekurzivne funkcije, poput Fibonaccijevog niza, rade višestruko brže u usporedbi sa standardnim interpreterom.
- Sum benchmark: Postignuto je drastično ubrzanje zbog optimizacije petlji.
- Fibonacci: AOT kompilacija eliminira overhead interpretacije poziva funkcija.
Osobni zaključak
Rad na ovom projektu bio je izazovan, posebno zbog LLVM vezova i osiguravanja ispravnosti tipova u TypeScriptu. Moj je dojam da ovakav pristup pokazuje koliko se performansi može izvući iz dinamičkog jezika uz pravilnu optimizaciju strojnog koda. Smatram da je LuAOT dobar temelj za daljnje istraživanje u području dizajna programskih jezika.
Github: https://github.com/vigogrg/luaot