| The State of Go |
| Where we are in May 2015 |
| 27 May 2015 |
| |
| Andrew Gerrand |
| adg@golang.org |
| |
| |
| * The State of the State of Go |
| |
| I gave a similar talk at FOSDEM in February 2015. |
| |
| .link /talks/2015/state-of-go.slide go.dev/talks/2015/state-of-go.slide |
| |
| This talk builds on that talk. |
| |
| |
| * Go 1.5 |
| |
| |
| * Release schedule |
| |
| Go 1.5 is scheduled for release in August 2015. |
| |
| The major work is done. |
| We are now in the "feature freeze" period. |
| |
| |
| * From C to Go |
| |
| The `gc` tool chain has been converted from C to Go. |
| |
| Machine-translated `compile` tool replaces `6g`, `8g`, etc. |
| Machine-translated `link` tool replaces `6l`, `8l`, etc. |
| New `asm` tool replaces `6a`, `8a`, etc. |
| |
| Go 1.5 has *no* C code in the tool chain or runtime. |
| |
| Rob will talk more about this. |
| |
| |
| * Concurrent Garbage Collector |
| |
| Goals: |
| |
| - Limit GC latency to less than 10 milliseconds. |
| - Run Go application code for at least 40ms out of every 50ms. |
| |
| .image state-of-go-may/gc.png |
| |
| .link /s/go14gc go.dev/s/go14gc |
| |
| |
| * Concurrent GC trade-offs |
| |
| The new GC spends a little more memory and CPU time |
| in exchange for significantly shorter GC pause times. |
| |
| .image state-of-go-may/gc2.png |
| |
| |
| * Better concurrency performance |
| |
| Setting `GOMAXPROCS=N` (where `N` is your number of CPUs) works well in Go 1.5. |
| |
| Better performance executing goroutines in parallel: |
| |
| .image state-of-go-may/conc-sieve.png _ 800 |
| |
| Better performance switching between goroutines in serial: |
| |
| .image state-of-go-may/conc-chain.png _ 800 |
| |
| |
| * Better concurrency performance (bottom line) |
| |
| Better performance under practical workloads: |
| |
| .image state-of-go-may/conc-practical.png _ 800 |
| |
| And our benchmark suite: |
| |
| .image state-of-go-may/conc-bench.png _ 500 |
| |
| |
| * Go 1.5 overall performance |
| |
| .image state-of-go-may/gcperf.png |
| |
| |
| * Go 1.5 overall performance (continued) |
| |
| .image state-of-go-may/perfchart.png |
| |
| |
| * OS/Arch ports |
| |
| Go 1.5 supports some new `GOOS/GOARCH` combinations: |
| |
| - `darwin/arm`, a.k.a iOS |
| - `darwin/arm64` (newer iDevices) |
| - `linux/arm64` (cgo is supported, but only with external linking) |
| - `openbsd/arm` (no cgo or external linking) |
| |
| And retires some old ones: |
| |
| DragonflyBSD dropped support for i386; `dragonfly/386` was removed from Go. |
| |
| Apple no longer supports OS X 10.6 (no security updates since 2013); |
| the Go port to OS X 10.6 (Snow Leopard) is no longer actively maintained. |
| |
| |
| * Shared libraries |
| |
| Go 1.5 can produce Go shared libraries that can be consumed by Go programs. |
| |
| Build the standard library as shared libraries: |
| |
| $ go install -buildmode=shared std |
| |
| Build a "Hello, world" program that links against the shared libraries: |
| |
| $ go build -linkshared hello.go |
| $ ls -l hello |
| -rwxr-xr-x 1 adg adg 13926 May 26 02:13 hello |
| |
| |
| Go 1.5 can also build Go programs as C archive files (for static linking) |
| or shared libraries (for dynamic linking) that can be consumed by C programs. |
| |
| .link /s/execmodes go.dev/s/execmodes |
| |
| (Demo) |
| |
| |
| * Go programs as C libraries |
| |
| Given a package: |
| |
| package p // import "p" |
| |
| import "C" |
| |
| //export Foo |
| func Foo() int32 { return 42 } |
| |
| And a main package that imports it: |
| |
| package main // import "m" |
| |
| import _ "p" |
| |
| func main() {} // ignored |
| |
| You can build an archive file that can be linked into a C program: |
| |
| $ go build -buildmode=c-archive m |
| $ ls $GOPATH/pkg/linux_amd64 |
| m.a p.a p.h |
| |
| |
| * A minor language change |
| |
| You may now omit the key type from a map literal. |
| |
| This map literal |
| |
| m := map[Point]string{ |
| Point{29.935523, 52.891566}: "Persepolis", |
| Point{-25.352594, 131.034361}: "Uluru", |
| Point{37.422455, -122.084306}: "Googleplex", |
| } |
| |
| may now be written as: |
| |
| m := map[Point]string{ |
| {29.935523, 52.891566}: "Persepolis", |
| {-25.352594, 131.034361}: "Uluru", |
| {37.422455, -122.084306}: "Googleplex", |
| } |
| |
| |
| * "go doc" |
| |
| The `go` tool has a new implementation of the old `doc` subcommand, |
| with a much improved command-line interface: |
| |
| $ go doc zip.reader |
| package zip // import "archive/zip" |
| |
| type Reader struct { |
| File []*File |
| Comment string |
| // Has unexported fields. |
| } |
| |
| func NewReader(r io.ReaderAt, size int64) (*Reader, error) |
| |
| $ cd $GOROOT/src/archive/zip |
| $ go doc reader |
| # same output as above |
| |
| (Demo) |
| |
| |
| * Execution tracing |
| |
| The new execution tracer collects data to produce diagrams of process execution. |
| |
| .image state-of-go/trace.png 350 _ |
| |
| Front end is the Android/Chrome trace-viewer. ([[https://github.com/google/trace-viewer][github.com/google/trace-viewer]]) |
| |
| .link /s/go15trace go.dev/s/go15trace |
| |
| |
| * Analysis and Refactoring Tools |
| |
| We have been working on tools for analyzing and manipulating Go source code. |
| |
| Analysis tools: |
| |
| - `oracle`: a tool for answering questions about Go source code (w/ plugins for Sublime Text and Emacs). |
| - `callgraph`: display the call graph of a Go program. |
| - `godoc`-analysis=pointer:` see pointer analysis details in godoc. |
| |
| Refactoring tools: |
| |
| - `eg`: a template-based refactoring tool |
| - `gorename`: type-safe renaming of identifiers in Go source code. |
| |
| |
| * Builder infrastructure |
| |
| We have been hacking away at our continuous build infrastructure. |
| |
| Now running Linux, Windows, OS X, FreeBSD, OpenBSD, and Plan 9 builders |
| on Google Compute Engine. |
| |
| Spin up builders to do work, spin up many in parallel. |
| Gives us results much faster. |
| |
| Sharding of tests on slower platforms (eg, ARM). |
| |
| Trybots test pending changes. (Demo) |
| |
| |
| * Mobile |
| |
| Go 1.5 provides support for Android and experimental support for iOS. |
| |
| .image state-of-go-may/iphone.jpg 500 _ |
| |
| |
| * The gomobile tool |
| |
| The `gomobile` tool simplifies toolchain installation and app |
| deployment. |
| (It only supports Android right now.) |
| |
| To install the Android compiler toolchain: |
| |
| $ gomobile init |
| |
| To build an Android APK and install on a device: |
| |
| $ gomobile install |
| |
| To build a shared library for an Android or iOS app: |
| |
| $ gomobile bind |
| |
| (Demo) |
| |
| |
| * Go community events |
| |
| - GoCon, Tokyo, June |
| - GopherCon, Denver, July |
| - GolangUK, London, August |
| - GothamGo, New York, October |
| - dotGo, Paris, November |
| |
| And more to be announced. |
| |
| .image state-of-go-may/gophercon.png |
| |
| |