| Gccgo in GCC 4.7.1 |
| 11 Jul 2012 |
| Tags: release |
| |
| Ian Lance Taylor |
| |
| * Introduction |
| |
| The Go language has always been defined by a [[https://golang.org/ref/spec][spec]], |
| not an implementation. |
| The Go team has written two different compilers that implement that spec: gc and gccgo. |
| Having two different implementations helps ensure that the spec is complete and correct: |
| when the compilers disagree, we fix the spec, |
| and change one or both compilers accordingly. |
| Gc is the original compiler, and the go tool uses it by default. |
| Gccgo is a different implementation with a different focus, |
| and in this post we’ll take a closer look at it. |
| |
| Gccgo is distributed as part of GCC, the GNU Compiler Collection. |
| GCC supports several different frontends for different languages; |
| gccgo is a Go frontend connected to the GCC backend. |
| The Go frontend is separate from the GCC project and is designed to be able |
| to connect to other compiler backends, |
| but currently only supports GCC. |
| |
| Compared to gc, gccgo is slower to compile code but supports more powerful optimizations, |
| so a CPU-bound program built by gccgo will usually run faster. |
| All the optimizations implemented in GCC over the years are available, |
| including inlining, loop optimizations, vectorization, |
| instruction scheduling, and more. |
| While it does not always produce better code, |
| in some cases programs compiled with gccgo can run 30% faster. |
| |
| The gc compiler supports only the most popular processors: |
| x86 (32-bit and 64-bit) and ARM. |
| Gccgo, however, supports all the processors that GCC supports. |
| Not all those processors have been thoroughly tested for gccgo, |
| but many have, including x86 (32-bit and 64-bit), |
| SPARC, MIPS, PowerPC and even Alpha. |
| Gccgo has also been tested on operating systems that the gc compiler does |
| not support, notably Solaris. |
| |
| Gccgo provides the standard, complete Go library. |
| Many of the core features of the Go runtime are the same in both gccgo and gc, |
| including the goroutine scheduler, channels, |
| the memory allocator, and the garbage collector. |
| Gccgo supports splitting goroutine stacks as the gc compiler does, |
| but currently only on x86 (32-bit or 64-bit) and only when using the gold |
| linker (on other processors, |
| each goroutine will have a large stack, and a deep series of function calls |
| may run past the end of the stack and crash the program). |
| |
| Gccgo distributions do not yet include a version of the go command. |
| However, if you install the go command from a standard Go release, |
| it already supports gccgo via the `-compiler` option: |
| go build `-compiler`gccgo`myprog`. |
| The tools used for calls between Go and C/C++, |
| cgo and SWIG, also support gccgo. |
| |
| We have put the Go frontend under the same BSD license as the rest of the Go |
| tools. You can download the source code for the frontend at the |
| [[https://github.com/golang/gofrontend][gofrontend project]]. |
| Note that when the Go frontend is linked with the GCC backend to make gccgo, |
| GCC’s GPL license takes precedence. |
| |
| The latest release of GCC, 4.7.1, includes gccgo with support for Go 1. |
| If you need better performance for CPU-bound Go programs, |
| or you need to support processors or operating systems that the gc compiler does not support, |
| gccgo might be the answer. |