alang is a toy compiler written for a statically typed langugage similar to C in terms of features.
alang only targets 64-bit X86-64 Linux and generates free standing binaries that don't depend on libc by default.
souvenir excersises all of alang's features. Please take a look if you are interested.
import "github.com/davecgh/go-spew/spew"for printf debugging during developmentnasmas a runtime dependency for assembling object filesldfor linking
- Run
go test -tags integrationto run integration tests - Run
go generate parsing/*goto get proper parse tree printing - Run
go generate ir/*goto get proper ir printing
Here is what the compiler does to generate a binary:
parse into ast -> frontend generates ir -> type check/inference happens on ir -> generate nasm asm -> pass asm to nasm and run ld
- Instructions from ir operate on variables numbered from 0. Variables can be of any size
- The first few variables are procedure arguments
- While most irs have all the variables they use in the main struct body, there are some exceptions. See
frontend.Prune(). The Extra field of ir.Inst comes in handy