This is an elaboration and annotation of Ben Lynn's Haskell compiler and C VM. The main aim is to improve upon the compiler, in various layers (see Future plans).
- Valid subset of Haskell! Code works on GHC as long as you have
curly braces and delimiters as needed (see
classy.hs) - Type inference, type classes, algebraic data types
- Pure! The last function defined should be a function of type
String -> String, which will receive input from stdin and whose output will be printed to the console - VM (~350 SLOC) is written in ANSI C and works on 32 and 64-bit systems
- Compiles to combinatory logic (CL), evaluation proceeds via graph reduction
./blynn <binary> <input> <output>
Where binary is the CL program to run, input is the
file whose contents are passed to the program, and output is the file
to write the output to.
- An ANSI C compiler and
make. That's it!
To check self-compilation, run ./check.sh classy.hs. It does the
following:
- Run
classy(compiler binary) onclassy.hs(compiler source), producingclassy2 - Run
classy2onclassy.hs, producingclassy3 - Check that
classy2andclassy3are identical
If you've made a change to what classy.hs outputs, (e.g. an
optimization to code generation), run ./check_compile.sh classy.hs
instead. It adds another step to the same process in check.sh to
ensure that the changes propagate.
- Create bootstrapping path from original classy compiler
- Monadic I/O
-
putc,getc, filesystems - Combinators should take a continuation, doing I/O then passing the result to the continuation
-
- Alternate VM in Forth?
Initial phase; parsing and totality, then reduce heap usage.
- Use more typeclasses in this compiler
- Remove undefined, only use total functions
- "Don't pay for what you don't use" (only emit code for functions referenced from main)
- Convert to CPS and perform partial evaluation
- Rewrite in applicative style with typeclasses
- Add block comments
- Use Parsec-style parsing
- Better parser error messages
- Writer show instance for
Msg
- Writer show instance for
-
donotation- Implement layout parsing, as in this paper
- Separation of
CharandInttypes - Add more types to the standard prelude
- Allow class constraint in class declaration
like (
class Functor f => Applicative f where ...) - Multi-parameter typeclasses
- Dependent/linear types?