Skip to content
/ babygo Public

babygo👶 is a small Go compiler made from scratch, which can compile itself. It's going to be the smallest and simplest go compiler in the world.

License

Notifications You must be signed in to change notification settings

DQNEO/babygo

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Babygo, a go compiler made from scratch

Test

Babygo is a small and simple go compiler. (Smallest and simplest in the world, I believe.) It is made from scratch and can compile itself.

  • No dependency to any libraries. Standard libraries and calling of system calls are home made.
  • Lexer, parser and code generator are handwritten.
  • Emit assemble code which results in a single static binary.

It depends only on as as an assembler and ld as a linker.

Design

Lexer, Parser and AST

The design and logic of ast, lexer and parser are borrowed (or should I say "stolen") from go/ast, go/scanner and go/parser.

Code generator

The design of code generator is borrowed from chibicc , a C compiler.

Remaining parts (Semantic analysis, Type management etc.)

This is purely my design :)

Environment

It supports x86-64 Linux only.

If you are not using Linux, you can use a dedicated docker image for this project.

$ docker pull dqneo/ubuntu-compiler-go
$ ./docker-run

Usage

Currently we are changing CLI design. This section will be updated later

Hello world

# Build babygo
$ go build -o babygo

# Build hello world by babygo
$ ./babygo build -o hello ./example/hello

# Run hello world
$ ./hello
hello world!

How to do self hosting

# Build babygo (1st generation)
$ go build -o babygo

# Build babygo (2nd generation) by babygo 1gen
$ ./babygo build -o babygo2 ./

# Build babygo (3rd generation) by babygo 2gen
$ ./babygo2 build -o ./babygo3 ./

# Check if babygo2 and babygo3 are identical
$ diff ./babygo2 ./babygo3

Test

Run this in the docker container:

$ make test

Reference

License

MIT

Author

@DQNEO

About

babygo👶 is a small Go compiler made from scratch, which can compile itself. It's going to be the smallest and simplest go compiler in the world.

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published