Rewrite the compiler
A few days ago I found a bug in the compiler that I decided merited basically an
entire rewrite of it.
This was long overdue. The compiler kind of grew organically and unhealthily
over time as I wrapped my head around how the whole WAM is structured, and now
that I understand a lot more I can do things right.
This new implementation is a lot "flatter" than the old one. It makes use of
CLOS classes and generic methods to un-nest a lot of the crap that was
previously happening in bigass `labels` blocks. This is a lot easier to read
and understand because you can take things a piece at a time.
Unfortunately, it's currently a lot slower than the old one. But at least it's
*correct*, and now I can start taking a look at optimizing the performance with
a cleaner base to start from.
Notes/ideas for the near future:
* Switch to structs instead of CLOS classes for all the bits and bobs in the
compilation process.
* Inline hot functions in the compilation process.
* Type hint the fucking compiler already. I've put this off for far too long.
* Move the compiler to its own package for easier profiling and to maintain my
shreds of sanity.
* Look into that generic-function-inlining library thing I saw on Reddit...
* Remove the last vestiges of `match` and kill the dependency on optima.
author |
Steve Losh <steve@stevelosh.com> |
date |
Tue, 07 Jun 2016 14:49:20 +0000 |
parents |
27f037427ad3 |
children |
13136d4b4761 |
.PHONY: test pubdocs bench profile
sourcefiles = $(shell ffind --full-path --dir src --literal .lisp)
docfiles = $(shell ls docs/*.markdown)
apidoc = docs/03-reference.markdown
test:
sbcl-rlwrap --noinform --load test/run.lisp --eval '(quit)'
src/quickutils.lisp: src/make-quickutils.lisp
cd src && sbcl-rlwrap --noinform --load make-quickutils.lisp --eval '(quit)'
$(apidoc): $(sourcefiles) docs/api.lisp
sbcl-rlwrap --noinform --load docs/api.lisp --eval '(quit)'
docs: docs/build/index.html
docs/build/index.html: $(docfiles)
cd docs && ~/.virtualenvs/d/bin/d
pubdocs: docs
hg -R ~/src/sjl.bitbucket.org pull -u
rsync --delete -a ./docs/build/ ~/src/sjl.bitbucket.org/bones
hg -R ~/src/sjl.bitbucket.org commit -Am 'bones: Update site.'
hg -R ~/src/sjl.bitbucket.org push
bench:
sbcl-rlwrap --noinform --load examples/bench.lisp --eval '(quit)'
profile:
sbcl-rlwrap --noinform --load examples/profile.lisp --eval '(quit)'