I recently got a copy of the book Compiling to Assembly from
Scratch
by Vladamir Keleshev, which details how to write a compiler for a
subset of JavaScript to 32-bit ARM assembly code. The choice to use
ARM assembly is mainly for its simplicity in comparison to x86.
Keleshev elects to use TypeScript to write the compiler, which, as
he explains in the preface, is largely a compromise for its familiar
C-like syntax while still providing many functional programming
features desireable for writing a compiler. However, I chose to
write my version of the compiler in Haskell as it's my favorite
language, and the focus on functional programming from Keleshev
makes it a natural choice for the translation.
Overall, I had a lot of fun writing this compiler as I got to learn
more about the nitty-gritty low-level of how code is executed while
getting more practice with Haskell. In this post, I won't cover
every detail of the design of the compiler, but I'll try to hit on
what I found to be the most important or interesting aspects of the
code.