blob: 2f87420e5b972bc5295f38bb4122f55f57d8e278 [file] [log] [blame]
The State of the Gopher (Oct)
10 Oct 2014
Tags: dotgo, gopher
Brad Fitzpatrick
Gopher, Google
@bradfitz
bradfitz@golang.org
* The State of the Gopher
- where we've been
- where we're going
.image state-of-the-gopher/gopher.jpg
* bradfitz
- Work on Go's standard library, builders, etc
- Started contributing to Go May 2010
- [[http://camlistore.org]], my big, old Go project: personal data storage & indexing for life
* The Past
* Userbase before November 2009
- 3-10 people inside Google?
* November 2009
- Go is [[http://google-opensource.blogspot.com/2009/11/hey-ho-lets-go.html][open sourced]]:
.image state-of-the-gopher/opensource.png
* Website in 2009
.image state-of-the-gopher/website1.png
* Website in 2009
.image state-of-the-gopher/website2.png
* Compilers in 2009
- already two: `gc` and `gccgo`
* Aside: GC vs gc
- `gc`: "Go compiler", based originally on Plan 9's C compiler. The main Go compiler.
- `GC`: "Garbage Collector"
* Ports in 2009
- linux-386
- linux-amd64
- linux-arm, just starting to work
- darwin-386
- darwin-amd64
- nacl-386 (first attempt)
With gccgo, more.
* Tools in 2009
- gofmt
- gofix
- godoc
* Release Highlights
* weekly releases
- "weekly.2009-12-09"
- break users weekly, not daily
- gofix appears
* monthly releases
- "r56" ... "r60"
- break users monthly, not weekly
- still painful to write and use packages (Makefiles)
* Go 1.0 (2012-03-28)
- the "error" type
- delete(m, k)
// before Go 1:
latLong[storeID] = LatLong{}, false
name[userID] = "", false
// new:
delete(name, userID)
- [[https://golang.org/doc/go1compat][stability promise]] + API check tool:
pkg net/http, const StatusOK = 200
pkg net/http, const StatusOK ideal-int
pkg net/http, type RoundTripper interface { RoundTrip }
pkg net/http, type Server struct, TLSConfig *tls.Config
pkg net/http, var DefaultServeMux *ServeMux
pkg time, method (*Timer) Reset(Duration) bool
pkg unicode/utf8, func ValidRune(int32) bool
- the `go` tool (get, build, test, ...)
* Go 1.1 (2013-05-03)
- method values
type S struct { once sync.Once; ... }
func (s *S) init() { ... }
func (s *S) Foo() {
s.once.Do(s.init)
- func "terminating statement"
func abs(n int) int {
switch {
case n < 0: return -n
default: return n
}
}
- 64-bit "int", large heaps
- 30-40% speed improvement, stdlib++
- more precise heap GC, usually
* Aside: precise vs conservative GC
Conservative GC: if it "looks like" a pointer, treat it like one.
[ ptr? ] [ ptr? ] [ ptr? ] [ ptr? ] [ ptr? ] [ ptr? ] [ ptr? ] [ ptr? ]
[ ptr? ] [ byte slice (skipped in Go 1.0) ]
[ ptr? ] [ ptr? ] [ ptr? ] [ ptr? ] [ ptr? ] [ ptr? ] [ ptr? ] [ ptr? ]
Terrible for 32-bit (e.g. ARM) computers: many integers look like pointers.
Precise GC:
[ int ] [ ptr ] [ string ] [ byte slice ]
[ int ] [ t f t f ] [ ptr ] [ int ] [ float64 ] [ ptr ]
Requires knowing what every position in memory _actually_ is.
- no false retention, only look at some memory during GC
* Go 1.2 (2013-12-01)
- 6 month release cycle begins
- setting slice capacity with s[i:j:k]
s := make([]byte, 10, 20)
foo(s[10:12:15])
func foo(s []byte) { fmt.Println(len(s), cap(s)) }
- preemption in scheduler
- go test -cover
* Go 1.3 (2014-06-18)
- no language changes
- GOOS=solaris,dragonfly,plan9,nacl
- precise GC of the stack (mostly)
- contiguous stacks (mostly)
* Aside: Segmented vs. Contiguous stacks
- C++/Java: one huge stack per thread
- Go <= 1.2: multiple discontiguous 4K stacks, bounce between
- Go 1.3: one little stack, grow & shrink as needed
.image state-of-the-gopher/contig-stack.png _ 550
* The present (relative to Nov 2009)
* More ports
- Windows
- FreeBSD, OpenBSD, NetBSD
- Solaris, Plan 9, DragonFly BSD
- NaCl (again)
* Better docs
- [[http://blog.golang.org][Blog]] articles,
- Community [[https://golang.org/wiki][Wiki]],
- [[https://golang.org/wiki/Books][Books]]
* Users: up and to the right
- Go [[https://code.google.com/p/go-wiki/wiki/GoUserGroups][user groups]], [[http://go-meetups.appspot.com/][meetups]]
- GitHub commits, stars, forks
- Since 2009: `golang-nuts@` (1450 14134), `-dev` (37 2152)
.link http://redmonk.com/dberkholz/2014/03/18/go-the-emerging-language-of-cloud-infrastructure/ Go: the emerging language of cloud infrastructure
.image state-of-the-gopher/oloh.png
* The Cloud
- Docker
- CoreOS, etcd, fleet
- Juju
- NATS, gnatsd, Packer, Heka
- dl.google.com, Vitess, Kubernetes
- App Engine
* Conferences
[[http://connpass.com/series/312/][GoCon Tokyo]]
* Conferences
.image state-of-the-gopher/gophercon.png
* Conferences
.image state-of-the-gopher/dotgo.png
* Conferences
.image state-of-the-gopher/india.png
* CoreOS
.image state-of-the-gopher/bus.jpg
- increasingly running [[http://build.golang.org]], each in a Docker container
- Go powering Go development!
* build.golang.org
.image state-of-the-gopher/build.png 400 _
* Better tools
- go/parser: godoc, [[http://godoc.org]], gofmt, gofix →
- [[http://godoc.org/code.google.com/p/go.tools/cmd/goimports][goimports]]: automatic import lines
- go/types, gofix+types,
- go/ast, go/ssa, [[http://godoc.org/code.google.com/p/go.tools/cmd/oracle][oracle]],
- [[http://godoc.org/code.google.com/p/go.tools/cmd/eg][eg]], example-based refactoring
- [[http://godoc.org/code.google.com/p/go.tools/cmd/gorename][gorename]], safe global renaming tool
Tooling begets better tooling!
- goimports + go/types + go/parser == [[https://twitter.com/sqs/status/520203018957250560][goreturns]] (lazy "return err")
* The Future
* Go 1.4
* Go 1.4 (2014-12-01?)
- fully precise GC of the stack + heap
- segmented stacks & conservative GC deleted
- stack copier & shrinker requires precise stack types too
- `runtime` conversion from C to Go: maps, channels, interfaces, type checks, println, defer, panic, etc.
- Garbage collector and scheduler are still in C
* Go 1.4
- [[http://golang.org/s/go14android][GOOS=android]] (Elias Naur, David Crawshaw)
- GOOS=nacl GOARCH=arm
- [[http://golang.org/s/go14internal]["internal" packages]]
- [[http://golang.org/s/go1.4-generate]["go generate"]]
- [[https://docs.google.com/a/golang.org/document/d/1QXzI9I1pOfZPujQzxhyRy6EeHYTQitKKjHfpq0zpxZs][syscall package frozen, go.sys]]
- "go tool pprof" converted from Perl (!) to Go
- minor stdlib additions, improvements
* Go 1.5
* Go 1.5 (2014-06-01?)
- Concurrent GC is main theme
- Roadmap: [[http://golang.org/s/go14gc]] (GC in 1.4, 1.5, 1.6+)
* Go 1.5: ports
- GOOS=ios revival? (Minux, David Crawshaw)
- GOARCH=ppc64 (minux)
- GOARCH=arm64 (aram, dfc)
* Go 1.5: removing more C
Didn't make Go 1.4:
- `cmd/link`: linker rewrite in Go
- `cmd/asm`: assembler rewrite in Go
- "gc" compiler in Go
* "gc" Compiler in Go
- lots of C
- C → Go translator == kinda ugly Go
- refactor that Go with tools: `eg`, `gorename`, etc
- add packages, tests
- unify all `8g`, `5g`, `6g`, `9g`
- SSA form, new optimizations
See rsc's GopherCon [[http://go.dev/talks/2014/c2go.slide#1][slides]], [[http://gophercon.sourcegraph.com/post/83820197495/russ-cox-porting-the-go-compiler-from-c-to-go][notes]], [[https://www.youtube.com/watch?v=QIE5nV5fDwA][video]].
* Go 1.5 Tracing
- Dmitry's GOTRACE + Chrome trace viewer
.image state-of-the-gopher/trace.png
* Go 1.6
- More GC work
- Ongoing compiler-in-Go cleanup & optimizations
- PNaCl?
- [[https://docs.google.com/a/google.com/document/d/1d3iI2QWURgDIsSR6G2275vMeQ_X7w-qxM2Vp7iGwwuM/pub][NUMA-aware scheduler]]?
- unknown surprises
Who knows.
Find out next year at dotGo Paris 2015!
* Go 2.0
- maybe one day
* Outside of the core
* libraries & tools
- HTTP/2, to be merged into `net/http`
- go.tools: `goimports`, `eg`, `gorename`, `oracle`, ...
- go.text: Unicode collation, normalization, ...
- go.mobile: Android, iOS, gaming, 3D graphics, event handling
- go.crypto
- go.net
- go.tools
- go.syscall
* gccgo
- keeping up with spec
- better in some ways (codegen, OS, arch)
- worse in others (precise GC, escape analysis)
- work underway to improve
All checking & improving each other:
- gc, gccgo, go/types, language spec, unit tests
* Notable other compilers
- [[https://github.com/go-llvm/llgo][llgo]], Go → LLVM → PNaCL, etc
- [[https://github.com/tardisgo/tardisgo][TARDIS Go]], Go → Haxe → JS, anything
- [[https://github.com/gopherjs/gopherjs][GopherJS]], Go → JS
And all three written in Go, use `go/parser`, `go/types`, etc.
We can't wait to join them.
* In summary
* The growth is exciting
- things are getting cleaner,
- things are getting faster,
- things are getting more impressive,
- everything is growing on top of everything else,
- hard to keep up with golang-dev@, golang-nuts@, bugs, wiki, new github projects, code reviews,
* You all are awesome
- keep being awesome
- keep making awesome things