| Keeping up with the Gophers |
| A brief history of gccgo, improvements, and the future |
| |
| Chris Manghane |
| Google Gopher | Compilers and Toolchains |
| cmang@golang.org |
| |
| * gccgo: "The Other Go Compiler" |
| |
| - Written and maintained by Ian Lance Taylor (released November 2009) |
| |
| 2010-01-26 Ian Lance Taylor <iant@google.com> |
| |
| * MAINTAINERS: Add myself as Go frontend maintainer. |
| |
| - Compiler frontend for the Go language written in C++ |
| |
| .image keeping-up/gccgo_structure.png 320 _ |
| |
| * gccgo: The Go Team didn't know |
| |
| "Ian just showed up at our door with a fully working compiler" ~ probably Rob |
| |
| .html keeping-up/gource_explosion.html |
| |
| * Why write a Go compiler in C++? |
| |
| * rationale: architecture support |
| |
| - cmd/gc (2009) targets 4 major architectures: i386, amd64, ARM, and IBM POWER |
| - gcc (4.3, 2009) targets 45 architectures officially, 28 unofficially |
| - leveraging gcc => minimal work to support Go on existing architectures |
| |
| * rationale: code generation |
| |
| - gcc has ~30 years of work put into code analysis and optimization |
| - cmd/gc has only recently focused on code generation (khr's SSA work) |
| - leveraging gcc => minimal work to produce optimized binaries |
| |
| * rationale: technical honesty |
| |
| - "Keeping each other honest" |
| - Distinct implementations => Inconsistencies in specification and implementations |
| - Users have options when an implementation lacks features |
| - Compilers seek feature parity => Compilers learn from each other |
| - Compilers generate better binaries => Virtuous cycle |
| |
| * gccgo improvements through a telescope |
| |
| * gofrontend: no dependency on gcc |
| |
| - gcc implements gofrontend's backend interface |
| |
| gofrontend (gcc/go/gofrontend/expressions.cc) |
| |
| .code keeping-up/backend_interface.diff |
| |
| backend (gcc/go/go-gcc.cc) |
| |
| .code keeping-up/cst.gcc |
| |
| * gccgo: builds the `go` tool |
| |
| - One way to build code across multiple compilers |
| |
| .code keeping-up/go_build.log |
| |
| * gofrontend: basic escape analysis |
| |
| - Implementation of _Escape_analysis_for_Java_ by JD Choi |
| |
| escape.go |
| |
| .code keeping-up/escape.go |
| |
| Connection Graph |
| |
| .image keeping-up/escape.png |
| |
| * Keeping up |
| |
| * gccgo: runtime and garbage collector parity |
| |
| - gccgo runtime is a modified version of Go 1.3 runtime |
| - Go 1.4 runtime was rewritten in Go |
| - Go 1.4 changed GC type info |
| |
| * beyond gccgo: compiler stack maps |
| |
| - Stack map records locations of live values at a certain address |
| - Allows Garbage Collector to be precise about types on stack |
| - Enables contiguous stacks to readjust copied pointers |
| - Little support in C compilers: gcc has no support, LLVM support is WIP |
| |
| * llvmgo: another "other Go compiler" |
| |
| - gofrontend provides backend interface LLVM can implement |
| - LLVM byte code is trusted in secure environments such as PNaCl |
| - Run native Go in the web |
| |
| * OS support: OSX and Windows |
| |
| - gccgo support on not unixes |
| - Expert needed |