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
classy2
onclassy.hs
, producingclassy3
- Check that
classy2
andclassy3
are 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
-
do
notation- Implement layout parsing, as in this paper
- Separation of
Char
andInt
types - 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?