Live coding a basic Go compiler with LLVM in 20 minutes
github.com
github.com
After you get from text->AST is when all the magic happens. I've been reading up on this off and on for the last year or so and it's less magic than breaking the problem down into (not quite) simple steps that can be studied individually.
It's actually a quite fascinating field to go diving down the rabbit hole -- there's a lot of "lost" ideas from 20-30 years ago that one could take from pseudo-code to a fairly reasonable compilation pipeline without too much trouble. True, it wouldn't win on any benchmark test against something like LLVM with their millions of person hours invested in the optimation phases but it would be reasonable none the less.
Ran `go run .` and it ended with:
[...]
go: downloading github.com/mewmew/float v0.0.0-20181121163145-c0f786d7da73
go: downloading github.com/pkg/errors v0.8.0
go: downloading github.com/rickypai/natsort v0.0.0-20180124032556-f194e6bd5b0c
@$const_str = global [16 x i8] c"Hello world %d\0A\00"
declare void @printf(...)
define void @main() {
0:
%0 = add i64 30, 12
call void (...) @printf([16 x i8]* @$const_str, i64 %0)
ret void
}
0>What you're seeing is the LLVM IR for the program being printed. As another commenter noted, you can compile the program with make, which just runs `clang` on that IR.
Here is an external implementation of constant.Value: