aboutsummaryrefslogtreecommitdiffstats
path: root/README.md
blob: 4caf1c3193940e7025cd549e3fe5f483fc369dab (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# Bad Diode's Lisp

For some time I've been meaning to learn more about compilers and programming
language theory. And so I found myself again delving into a rabbit hole of
wheel-reinvention for the purpose of fun and learning.

The goals for this project are to build a programming language that can be
interpreted directly from a VM and with support for compilation to assembly
(`x86_64` and/or `ARM (thumb or aarch64)`). It could make sense to output
bytecode for LLVM to take advantage of the built in optimizations, but let's
just go one step at a time. At the time I know some ARM assembly, but I'm not so
versed in `x86_64` and know nothing of LLVM bytecode.

I've chosen to implement a Lisp, perhaps a subset of Scheme. The syntax is not
so important for now, maybe in the future the compiler will take a different
home-brew language, but hopefully this helps setting the fundamentals for
a minimal working compiler. In principle, we could keep the internal
representation and language working as a lisp, but with a different external
syntax.

The language should have built-in structures for dynamic arrays, hash tables,
strings (and string views). It should be suitable for use in embedded systems
and be linked seamlessly with other compiled objects.

Accessing system resources, such as stdio or graphics could be done via function
calls to the give APIs. This should help decouple the CPU logic from hardware,
hopefully facilitating porting programs to different platforms (GBA, Rasberry
Pi, etc.).

The current plan is to build a bootstrap interpreter in C that can be used to
generate the self-hosted version of itself. I'll try to document the process
here as best as I can.

The bootstrap implementation should be kept simple, since we can focus on
optimization once we have a self-hosting compiler.

# Resources

- [Structure and Interpretation of Computer Programs][sicp]
- [Crafting Interpreters][crafting-interpreters]
- [Building a Scheme from scratch][scheme-from-scratch]
- [Compiling a Lisp][compiling-a-lisp]
- [An Incremental Approach to Compiler Construction][ghuloum11]
- [Make-A-Lisp Guide][mal]
- [An Introduction to Scheme and its Implementation][intro-to-scheme-and-imp]

[sicp]: https://mitpress.mit.edu/sites/default/files/sicp/index.html
[crafting-interpreters]: https://craftinginterpreters.com/
[scheme-from-scratch]: http://peter.michaux.ca/articles/scheme-from-scratch-introduction
[compiling-a-lisp]: https://bernsteinbear.com/blog/compiling-a-lisp-0/
[ghuloum11]: http://scheme2006.cs.uchicago.edu/11-ghuloum.pdf
[mal]: https://github.com/kanaka/mal/blob/master/process/guide.md
[intro-to-scheme-and-imp]: https://www.cs.utexas.edu/ftp/garbage/cs345/schintro-v14/schintro_toc.html#SEC271