You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
TinyCompiler - a 500-ish lines of code compiler in a weekend
Have you ever wondered how a compiler works, but you never found courage to find out?
Then this project is for you (N.B.: a detailed description is available here).
I have never had the chance to look under the hood either, but one week-end I have decided to to write a translator from the esoteric programming language wend (short for week-end),
which I just invented myself, into regular GNU assembly.
The goal is to keep the code as tiny as possible, 500-ish lines of python sounds great.
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 precisionintsqrt(int n, int shift) {
int x;
int x_old;
int n_one;
if n > 2147483647/shift { // pay attention to potential overflowsreturn2 * 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 divisionwhiletrue {
x_old = x;
x = (x + n_one / x) / 2;
ifabs(x - x_old) <= 1 {
return x;
}
}
}
intabs(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);
}
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.