-
Notifications
You must be signed in to change notification settings - Fork 0
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.
- Mugo ist ein experimenteller Compiler für einen Subset von Go. Er erzeugt ausschließlich X86-64 Assembler für Linux und unterstützt einen gerade so großen Anteil von Go, dass er sich selber übersetzen kann (Artikel dazu).
- 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 und GoNB sind Go-Kernel für Jupyter Notebook
- Gore, ein REPL (read-eval-print-loop) zum interaktiven Testen von Go-Code
- MVM ist ein weiterer Go-Interpreter vom selben Autor wie Yaegi
- 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++.
- Dingo ist ein Transpiler, der Go um weitere Features ergänzt und nach Go übersetzt. Zu den Features gehören Sum Types, vereinfachte Fehlerbehandlung und Konstrukte der Funktionalen Programmierung.
- Gown (Go+Own) ist ein Präprozessor, der Compile-Time Ownership-Modell bietet, vergleichbar mit dem Borrow-Checker von Rust/Pony.
- 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
- XGo ist eine Erweiterung von Go, die viele syntaktische Vereinfachungen anbietet und das einfache Mischen von Code in Go, C/C++, Python und Javascript ermöglicht. XGo ist der Nachfolger der Sprache Go+, die Go für Schüler, Studenten, wissenschaftliche Anwendungen und Skripting attraktiver machen sollte.
- Borgo ist ein Compiler für eine Programmiersprache, die die Einfachheit von Go mit der Ausdrucksstärke von Rust kombinieren soll. Der Compiler ist ein Transpiler nach Go.
- GoAWK ist ein POSIX-kompatibler AWK-Interpreter, geschrieben in Go.
- cxgo ist ein Transpiler von C nach Go.
- GoJa ist eine Javascript Runtime in Go.
- Elvish ist eine in Go geschriebene Shell.
- Goro ist ein PHP-Interpreter in Go.
- FrankenPHP ist ein PHP Application Server als Plugin des Webservers Caddy.
- Go-Starlark ist ein Interpreter für Starlark, ein Derivat von Python ohne Klassen und Exceptions.