Skip to content

Compiler

Harald Weidner edited this page Mar 24, 2024 · 7 revisions

Compiler für Go

Gc

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

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)

Weitere Compiler

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.

Interpreter

  • 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

Transpiler

  • 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++.

Embedded Systems

  • EmGo ist ein (Cross-)Compiler für Embedded Systems auf Basis von ARM Cotrex-M Prozessoren.
  • TinyGo ist ein Go-Compiler für Embedded Systems auf Basis von LLVM. Derzeit werden ARM und AVR-Plattformen sowie WebAssembly unterstützt.
  • TamaGo - Go auf Bare Metal ARM Systemen