An ahead-of-time compiler for Lua 5.4
#c #lua #compiler #transpiler #scripting #gamedev #library

Hugo Musso Gualandi cade258a8c More stuff %!s(int64=3) %!d(string=hai) anos
doc 3919ad35d9 Lua 5.4 RC2 %!s(int64=5) %!d(string=hai) anos
experiments 7b581f486f Implement deltablue %!s(int64=3) %!d(string=hai) anos
scripts cade258a8c More stuff %!s(int64=3) %!d(string=hai) anos
src f2a33b7e8f Add "context" test %!s(int64=3) %!d(string=hai) anos
statistics cade258a8c More stuff %!s(int64=3) %!d(string=hai) anos
.gitignore f2a33b7e8f Add "context" test %!s(int64=3) %!d(string=hai) anos
LICENSE.txt e381c85c5f Add license file %!s(int64=3) %!d(string=hai) anos
Makefile 3919ad35d9 Lua 5.4 RC2 %!s(int64=5) %!d(string=hai) anos
README.md 87908cdee8 Update readme %!s(int64=4) %!d(string=hai) anos
UPDATING bde03b906d Update README and compilation instructions %!s(int64=4) %!d(string=hai) anos

README.md

LuaAOT 5.4.3

This is a modified version of Lua 5.4.3 that allows Lua functions to be compiled ahead-of-time to more efficient code. It also includes a compiler called luaot that converts a Lua module to an equivalent one written in C.

The luaot compiler is a simplistic compiler that compiles Lua bytecode to C. One may see it as a partial evaluation of the reference Lua interpreter. The main optimizations are that Lua jumps are converted into C gotos, and that there is no overhead of interpreting bytecodes at run time. Additionally, the C compiler will be able to optimize some kinds of things, specially constant folding and dead-code elimination for the opcodes that include immediate parameters.

The performance gains depend on the kind of program being run. For numerical benchmarks it can be twice as fast as regular Lua. But overall, it is not as fast as LuaJIT or Pallene.

Compilation and instalation

This is a modified version of the Lua interpreter so the process is the same you would use for compiling Lua. For full instructions, consult the doc/readme.html.

make linux -j4

Usage

Our compiler generates a .c file with a luaopen_ function. You can compile that into a .so module and then require it from Lua. The compilation is the same as any other extension module, except that you need to pass the path to the LuaAOT headers.

./src/luaot test.lua -o testcompiled.c
gcc -shared -fPIC -O2 -I./src testcompiled.c -o testcompiled.so
./src/lua -l testcompiled

Be careful about the name of the generated file. If it has the same name as the original Lua file, the require may prioritize the Lua file instead of the compiled on. We also recommend compiling with optimizations, at least -O2.

Experiments

If you are interested in reproducing the experiments from our paper, please consult the documentation in the experiments and scripts directory. Note that you must be inside the experiments directory when you run the scripts:

../scripts/compile binarytrees.lua
../scripts/run binarytrees_fast 10