blob: 930010e7a28f68ac0b09b2200588f1e6bd926fff [file] [log] [blame]
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