Skip to content

ssloy/tinycompiler

Repository files navigation

tinycompiler - a 500-ish lines of code compiler in a weekend

Have you ever wondered how a compiler works? If so, this project is for you.

This weekend I'll write a compiler that translates a code written in a very simple programming language Wend (short for a week-end) into GNU assembly. This repository, however, will contain more than the final code. It will tell you a story about compilers.

So behold, here is a program that uses virtually all concepts in Wend:

main() {
    // square root of a fixed-point number
    // stored in a 32 bit integer variable, shift is the precision

    int sqrt(int n, int shift) {
        int x;
        int x_old;
        int n_one;

        if n > 2147483647/shift { // pay attention to potential overflows
            return 2 * sqrt(n / 4, shift);
        }
        x = shift; // initial guess 1.0, can do better, but oh well
        n_one = n * shift; // need to compensate for fixp division
        while true {
            x_old = x;
            x = (x + n_one / x) / 2;
            if abs(x - x_old) <= 1 {
                return x;
            }
        }
    }

    int abs(int x) {
        if x < 0 {
            return -x;
        } else {
            return x;
        }
    }

    // 25735 is approximately equal to pi * 8192;
    // expected value of the output is sqrt(pi) * 8192 approx 14519

    println sqrt(25735, 8192);
}

There will no be dynamic memory allocation, no pointers, no garbage collection. There will be nested functions, function overloading and type checking.

And as usual, there will be a program with a raytracer :)

run tests

make test

Graphics!

It is so dull to compute Fibonacci numbers, so here are more eyecandy examples for our compiler, check test-programs/gfx/*.wend files.

make gfx

Mandelbrot set

Zero-player breakout game

Fire

Sunset race

Metaballs