Compiler
Gc ist der offizielle Compiler des Go-Projektes. Ein neues Go-Release beinhaltet immer den Gc. Gc war bis Version 1.4 in C geschrieben. Derzeit werden eine Reihe von Betriebssystemen und Prozessorarchitekturen unterstützt, darunter Linux, Windows und MacOS auf amd64, i386, ARM, MIPS und s390x.
Die jeweils aktuelle Version des Compiler kann hier herunter geladen werden. Für Debian ab wheezy ist er als Paket golang verfügbar.
Ein Go-Programm kann mit Gc direkt ausgeführt oder compiliert werden. Bei der direkten Ausführung wird es zunächst unterhalb von /tmp compiliert und dann ausgeführt.
$ go run hello.go
$ go build hello.go
$ ./hello
Seit Go 1.5 ist der Compiler vollständig in Go (und kleinen Teilen in Assembler) geschrieben. Im Compiler und der Runtime gibt es keinen C-Code mehr. Ein C-Compiler wird nur noch benötigt, wenn man Software compilieren möchte, die CGO verwendet.
Bei einem Build mit dem offiziellen Compiler und der dazugehörigen Toolchain wird normalerweise ein statisch gelinktes Binary erzeugt. Nur wenn CGO verwendet wird, ist das Binary dynamisch gelinkt. CGO wird allerdings auch von den weit verbreiteten Bibliotheken net und os/user verwendet, um bei der Namensauflösung von Hostnamen und Benutzern auf die NSS-Mechanismen zurückgreifen zu können. Der Artikel Statically compiling Go programs bechreibt, wie der Compiler hier genau vorgeht und wie man das Verhalten beeinflussen kann.
GccGo ist ein Compiler auf Basis der GNU Compiler Collection. Das dazugehörige Debian-Paket ist gccgo. Es werden alle offiziellen Architekturen in Debian Wheezy unterstützt.
$ gccgo -Wall -O2 -s -o hello hello.go
$ ./hello
GccGo erzeugt dynamisch gelinkte Binaries. Sie sind üblicherweise gegen die folgenden Bibliotheken gelinkt:
$ ldd hello
linux-vdso.so.1 => (0x00007fffb31ff000)
libgo.so.0 => /usr/lib/x86_64-linux-gnu/libgo.so.0 (0x00007fa704c26000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fa7049a4000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fa70478d000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fa704403000)
/lib64/ld-linux-x86-64.so.2 (0x00007fa707938000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fa7041e7000)
Neben den beiden oben genannten Compilern gibt es weitere Implementierungen von Go.
- LLGo ist ein Compiler Go, der auf der LLVM (Low Level Virtual Machine) Infrastruktur basiert. Es gibt Überlegungen, ihn in den Standard-Lieferumfang von LLVM zu integrieren.
- gollvm ist ein weiterer Go Compiler auf Basis von LLVM. Das Projekt ist relativ jung und wird von Google vorangetrieben.
- Der SSA Interpreter ist ein Interpreter, der Go Quelltext parst und direkt ausführt.
- gomacro ist ein interaktiver Go Interpreter und Debugger.
- Yaegi, ein anderer Go-Interpreter.
- LGo, ein Go-Kernel für Jupyter Notebook
- Gore, ein REPL (read-eval-print-loop) zum interaktiven Testen von Go-Code
- GopherJS übersetzt Go-Quelltext nach Javascript, das im Browser ausgeführt werden kann. Damit lassen sich moderne Web-Anwendungen vollständig in Go implementieren.
- Joy ist ein anderer Go-to-Javascript Compiler. Die Entwicklung ist noch nicht so weit wie bei GopherJS, dafür soll der erzeugte Javascript-Code schneller, schlanker und besser lesbar sein.
- Gomoku übersetzt Go-Programme nach C oder C++.