https://github.com/ssloy/tinycompiler
Writing a compiler in a week-end
https://github.com/ssloy/tinycompiler
Last synced: 18 days ago
JSON representation
Writing a compiler in a week-end
- Host: GitHub
- URL: https://github.com/ssloy/tinycompiler
- Owner: ssloy
- License: wtfpl
- Created: 2024-01-12T22:53:54.000Z (over 1 year ago)
- Default Branch: main
- Last Pushed: 2025-03-07T15:07:06.000Z (about 2 months ago)
- Last Synced: 2025-04-03T11:08:10.152Z (26 days ago)
- Language: Python
- Size: 287 KB
- Stars: 371
- Watchers: 4
- Forks: 19
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE.txt
Awesome Lists containing this project
- awesome-ccamel - ssloy/tinycompiler - Writing a compiler in a week-end (Python)
README
# 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](https://ssloy.github.io/tinycompiler/)**).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:
```cpp
main() {
// square root of a fixed-point number
// stored in a 32 bit integer variable, shift is the precisionint 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 14519println sqrt(25735, 8192);
}
```## run tests
```sh
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](https://github.com/ssloy/tinycompiler/tree/main/test-programs/gfx) files.
```sh
make gfx
```
### Mandelbrot set### Ray tracer
### Zero-player breakout game
### Fire
### Sunset race
### Metaballs
