Skip to content

jaseemabid/Olifant

Repository files navigation

Olifant Build Status Docker Repository on Quay

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 🏎 too.

$ stack test

The README maybe sparse, but there is a lot of inline documentation 📜 in the code; which can be read with Haddock.

$ 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 ✅, these are guaranteed to work.

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.