Olifant
A simple functional language targeting LLVM, WIP
Project is setup with stack
$ git pull https://github.com/jaseemabid/Olifant && cd Olifant
$ stack setup && stack build
See the blog post Lessons learned building a toy compiler for a detailed introduction to the project.
The test coverage isn't great, but has a bunch of good code samples. They run
pretty fast
$ stack test
The README maybe sparse, but there is a lot of inline documentation
$ stack haddock --no-haddock-deps --open
Olifant programs can be compiled to native binaries and executed in one step
$ stack exec olifant <<< 'sum 4 5'
$ 9
This is NOT an interpreter, a machine native binary is produced and executed in
one step
$ file /tmp/cmd.exe
$ /tmp/cmd.exe: Mach-O 64-bit executable x86_64
There are some samples programs in the examples directory - these are real
programs used by the test runner so if the tests are
The intermediary forms can be exported with additional flags. For example, the
output of the parser can be viewed with -p
.
$ stack exec olifant -- -p <<< 'sum 4 5'
[ App (Ref
{rname = "sum", ri = 0, rty = TInt :> (TInt :> TInt), rscope = Extern})
[Lit (Number 4), Lit (Number 5)]
]
Similarly, Core is exported with -c
and the intermediary LLVM IR is exported
with -l
.
The compiler accepts programs from stdin or takes a file as argument.
$ olifant -l examples/vars.ol
$ file vars.ll
vars.ll: ASCII text
Docker images are automatically built by quay.io as well as by Travis CI as part of automated testing. If you have trouble building the dependencies/libraries locally, try the container.
$ make container
$ docker run -it olifant/olifant
I would LOVE any code contributions. There is a milestone to track priority bugs and features if you are looking for some inspiration.