, 4 min read
Installing Pallene Compiler
Original post is here eklausmeier.goip.de/blog/2020/05-12-installing-pallene-compiler.
Pallene is a Lua based language. In contrast to Lua, which is untyped, Pallene is typed. A good paper on Pallene is "Pallene: A companion language for Lua", by Hugo Musso Gualandi, and Roberto Ierusalimschy.
From above paper:
The compiler itself is quite conventional. After a standard parsing step, it converts the program to a high-level intermediate form and from that it emits C code, which is then fed into a C compiler such as gcc.
From "A gradually typed subset of a scripting language can be simple and efficient":
Pallene was designed for performance, and one fundamental part of that is that its compiler generates efficient machine code. To simplify the implementation, and for portability, Pallene generates C source code instead of directly generating assembly language.
So, very generally, this idea is similar to f2c (Fortran to C), cobc (Cobol compiler), or Lush (Lisp Universal SHell).
The whole Pallene compiler is implemented in less than 7 kLines of Lua, and less than 1 kLines of C source code for the runtime.
To install Pallene compiler you need git
, gcc
, lua
, and luarocks
. Description is for Linux. MacOS is very similar.
1. Source. Fetch source code via git clone
.
$ git clone https://github.com/pallene-lang/pallene.git
Cloning into 'pallene'...
$ cd pallene
2. Rocks. Fetch required Lua rocks via luarocks
command.
$ luarocks install --local --only-deps pallene-dev-1.rockspec
Missing dependencies for pallene dev-1:
lpeglabel >= 1.5.0 (not installed)
inspect >= 3.1.0 (not installed)
argparse >= 0.7.0 (not installed)
luafilesystem >= 1.7.0 (not installed)
chronos >= 0.2 (not installed)
pallene dev-1 depends on lua ~> 5.3 (5.3-1 provided by VM)
pallene dev-1 depends on lpeglabel >= 1.5.0 (not installed)
Installing https://luarocks.org/lpeglabel-1.6.0-1.src.rock
lpeglabel 1.6.0-1 depends on lua >= 5.1 (5.3-1 provided by VM)
gcc -O2 -fPIC -I/usr/include -c lpcap.c -o lpcap.o
gcc -O2 -fPIC -I/usr/include -c lpcode.c -o lpcode.o
gcc -O2 -fPIC -I/usr/include -c lpprint.c -o lpprint.o
gcc -O2 -fPIC -I/usr/include -c lptree.c -o lptree.o
gcc -O2 -fPIC -I/usr/include -c lpvm.c -o lpvm.o
gcc -shared -o lpeglabel.so lpcap.o lpcode.o lpprint.o lptree.o lpvm.o
No existing manifest. Attempting to rebuild...
lpeglabel 1.6.0-1 is now installed in /home/klm/.luarocks (license: MIT/X11)
pallene dev-1 depends on inspect >= 3.1.0 (not installed)
Installing https://luarocks.org/inspect-3.1.1-0.src.rock
inspect 3.1.1-0 depends on lua >= 5.1 (5.3-1 provided by VM)
inspect 3.1.1-0 is now installed in /home/klm/.luarocks (license: MIT <http://opensource.org/licenses/MIT>)
pallene dev-1 depends on argparse >= 0.7.0 (not installed)
Installing https://luarocks.org/argparse-0.7.0-1.all.rock
argparse 0.7.0-1 depends on lua >= 5.1, < 5.4 (5.3-1 provided by VM)
argparse 0.7.0-1 is now installed in /home/klm/.luarocks (license: MIT)
pallene dev-1 depends on luafilesystem >= 1.7.0 (not installed)
Installing https://luarocks.org/luafilesystem-1.8.0-1.src.rock
luafilesystem 1.8.0-1 depends on lua >= 5.1 (5.3-1 provided by VM)
gcc -O2 -fPIC -I/usr/include -c src/lfs.c -o src/lfs.o
gcc -shared -o lfs.so src/lfs.o
luafilesystem 1.8.0-1 is now installed in /home/klm/.luarocks (license: MIT/X11)
pallene dev-1 depends on chronos >= 0.2 (not installed)
Installing https://luarocks.org/chronos-0.2-4.src.rock
chronos 0.2-4 depends on lua >= 5.1 (5.3-1 provided by VM)
gcc -O2 -fPIC -I/usr/include -c src/chronos.c -o src/chronos.o -I/usr/include
gcc -shared -o chronos.so src/chronos.o -L/usr/lib -Wl,-rpath,/usr/lib -lrt
chronos 0.2-4 is now installed in /home/klm/.luarocks (license: MIT/X11)
Stopping after installing dependencies for pallene dev-1
3. Environment variables. Make sure that you source the environment variables given by
luarocks path
For example:
export LUA_PATH='/usr/share/lua/5.3/?.lua;/usr/share/lua/5.3/?/init.lua;/usr/lib/lua/5.3/?.lua;/usr/lib/lua/5.3/?/init.lua;./?.lua;./?/init.lua;/home/klm/.luarocks/share/lua/5.3/?.lua;/home/klm/.luarocks/share/lua/5.3/?/init.lua'
export LUA_CPATH='/usr/lib/lua/5.3/?.so;/usr/lib/lua/5.3/loadall.so;./?.so;/home/klm/.luarocks/lib/lua/5.3/?.so'
export PATH='/home/klm/.luarocks/bin:/usr/bin:/home/klm/bin:...:.
4. Build Lua and runtime. Build Lua and the Pallene runtime (you are still in the pallene
directory):
make linux-readline
Some warnings will show up for Lua, but they can be ignored for now.
5. Run compiler. Now you can run pallenec
, provided you still are in the same directory, where you built pallene.
$ ./pallenec
Usage: pallenec [-h] [--emit-c] [--emit-asm] [--compile-c]
[--dump {parser,checker,ir,uninitialized,constant_propagation}]
<source_file>
Error: missing argument 'source_file'
6. Run example. Now check one of the examples.
$ pallenec examples/factorial/factorial.pln
$ ./lua/src/lua -l factorial examples/factorial/main.lua
The factorial of 5 is 120.
The most common error will be to not use the lua/src/lua
command from Pallene, but rather the system-wide.
You can compile all examples and benchmarks:
for i in examples/*/*.pln; do pallenec $i; done
for i in benchmark/*/*.pln; do pallenec $i; done
Things to note in Pallene: