The other goal of the course is to give a taste of modern software development, specifically: test-driven development, version control, and the stress on reading, comprehending and extending code rather than writing from scratch.
The characteristic of the course is an iterative, incremental development: we start with the most trivial source language, develop the full compiler for it, and then keep extending the source language and the compiler in small steps, reusing the earlier work as much as possible. At each iteration, we build a complete end-to-end compiler producing runnable and testable executables, for a (progressively larger) subset of the source language.
Another characteristic is the extensive use of tagless-final style, taking the full advantage of extensibility afforded by it. The extensibility here means reuse -- of type-checked and compiled artifacts from the previous increment -- rather than copy-paste. The compiler is hence structured as a stack of domain-specific languages, with parsing at the bottom and assembly at the top. The languages are extended by adding new operations here and there (and only occasionally by redirection).
Yet another feature is the attention given to names, or `variables', and associating attributes to them. Our approach, which readily permits adding attributes at will and analyzing variable usage, may remind some of algebraic effects.
We cover all standard material for the compiler course, from parsing and type-checking to analyses, optimizations, calling conventions and assembly generation -- but in a quite non-traditional fashion.
This course was taught as an elective 15-lecture upper-level undergraduate course in the Fall/Winter of 2022 and 2023.
Course notes (the first few chapters)
<tfintro/0README.dr>
Code for the section: Introduction to tagless-final style
Free Variable as Effect, in Practice
A greatly simplified version of the course, which still, hopefully, gives
the taste of the incremental,
step-wise compiler development. The article also explains
extensible effects in compilation -- the technique currently used in the course.
emulator.ml [8K]
An elementary x86-64 emulator, to explain assembly in the
introduction. The knowledge of assembly is not a prerequisite.