I think I was reading about Oberon –the programming language, not the operating system– because a post on Hacker News, and I ended in the page of Niklaus Wirth.
Wirth was the chief designer of the programming languages: Euler (1965), PL360 (1966), ALGOL W (1966), Pascal (1970), Modula (1975), Modula-2 (1978), Oberon (1987), Oberon-2 (1991), and Oberon-07 (2007) –from the Wikipedia–, among other things.
That is truly remarkable. So I was looking around and I found that his website has PDFs describing the implementation of two compilers:
- Compiler Construction, where Wirth builds a compiler for Oberon-0 (a subset of Oberon) for a RISC CPU –which is the type of simplification you usually find in books building a compiler, but this one at least is register based–.
- PICL: A Programming Language for the Microcontroller PIC, and this is a real CPU –for a MCU–.
The code is very readable, and is not because I had to write some Pascal back at University –and Oberon is a descendant of that language–. There are things missing, but is mostly refinement of error reporting and things like that. Everything that is important, is there.
For example, the code generation of the multiplication for Oberon-0:
PROCEDURE MulOp*(VAR x, y: Item); (* x := x * y *)
BEGIN
IF (x.mode = Const) & (y.mode = Const) THEN x.a := x.a * y.a
ELSIF (y.mode = Const) & (y.a = 2) THEN load(x); Put1(Lsl, x.r, x.r, 1)
ELSIF y.mode = Const THEN load(x); Put1(Mul, x.r, x.r, y.a)
ELSIF x.mode = Const THEN load(y); Put1(Mul, y.r, y.r, x.a); x.mode := Reg; x.r := y.r
ELSE load(x); load(y); Put0(Mul, RH-2, x.r, y.r); DEC(RH); x.r := RH-1
END
END MulOp;
It even shows constant folding –both operands are constants–. The resulting code may not be super-optimized, but it is a full example in an easy to understand size.
I skimmed through the “Compiler Construction” book during my holidays and is not too long. I’m looking forward to read it properly when I have some time.