LEFT | RIGHT |
(no file at all) | |
| 1 The State of the Gopher (Oct) |
| 2 10 Oct 2014 |
| 3 Tags: dotgo, gopher |
| 4 |
| 5 Brad Fitzpatrick |
| 6 Gopher, Google |
| 7 @bradfitz |
| 8 bradfitz@golang.org |
| 9 |
| 10 * The State of the Gopher |
| 11 |
| 12 - where we've been |
| 13 - where we're going |
| 14 |
| 15 .image state-of-the-gopher/gopher.jpg |
| 16 |
| 17 * bradfitz |
| 18 |
| 19 - Work on Go's standard library, builders, etc |
| 20 - Started contributing to Go May 2010 |
| 21 - [[http://camlistore.org]], my big, old Go project: personal data storage & ind
exing for life |
| 22 |
| 23 * The Past |
| 24 |
| 25 * Userbase before November 2009 |
| 26 |
| 27 - 3-10 people inside Google? |
| 28 |
| 29 * November 2009 |
| 30 |
| 31 - Go is [[http://google-opensource.blogspot.com/2009/11/hey-ho-lets-go.html][ope
n sourced]]: |
| 32 |
| 33 .image state-of-the-gopher/opensource.png |
| 34 |
| 35 * Website in 2009 |
| 36 |
| 37 .image state-of-the-gopher/website1.png |
| 38 |
| 39 * Website in 2009 |
| 40 |
| 41 .image state-of-the-gopher/website2.png |
| 42 |
| 43 * Compilers in 2009 |
| 44 |
| 45 - already two: `gc` and `gccgo` |
| 46 |
| 47 * Aside: GC vs gc |
| 48 |
| 49 - `gc`: "Go compiler", based originally on Plan 9's C compiler. The main Go comp
iler. |
| 50 - `GC`: "Garbage Collector" |
| 51 |
| 52 * Ports in 2009 |
| 53 |
| 54 - linux-386 |
| 55 - linux-amd64 |
| 56 - linux-arm, just starting to work |
| 57 - darwin-386 |
| 58 - darwin-amd64 |
| 59 - nacl-386 (first attempt) |
| 60 With gccgo, more. |
| 61 |
| 62 * Tools in 2009 |
| 63 |
| 64 - gofmt |
| 65 - gofix |
| 66 - godoc |
| 67 |
| 68 * Release Highlights |
| 69 |
| 70 * weekly releases |
| 71 |
| 72 - "weekly.2009-12-09" |
| 73 - break users weekly, not daily |
| 74 - gofix appears |
| 75 |
| 76 * monthly releases |
| 77 |
| 78 - "r56" ... "r60" |
| 79 - break users monthly, not weekly |
| 80 - still painful to write and use packages (Makefiles) |
| 81 |
| 82 * Go 1.0 (2012-03-28) |
| 83 |
| 84 - the "error" type |
| 85 - delete(m, k) |
| 86 |
| 87 // before Go 1: |
| 88 latLong[storeID] = LatLong{}, false |
| 89 name[userID] = "", false |
| 90 |
| 91 // new: |
| 92 delete(name, userID) |
| 93 |
| 94 - [[https://golang.org/doc/go1compat][stability promise]] + API check tool: |
| 95 |
| 96 pkg net/http, const StatusOK = 200 |
| 97 pkg net/http, const StatusOK ideal-int |
| 98 pkg net/http, type RoundTripper interface { RoundTrip } |
| 99 pkg net/http, type Server struct, TLSConfig *tls.Config |
| 100 pkg net/http, var DefaultServeMux *ServeMux |
| 101 pkg time, method (*Timer) Reset(Duration) bool |
| 102 pkg unicode/utf8, func ValidRune(int32) bool |
| 103 |
| 104 - the `go` tool (get, build, test, ...) |
| 105 |
| 106 * Go 1.1 (2013-05-03) |
| 107 |
| 108 - method values |
| 109 |
| 110 type S struct { once sync.Once; ... } |
| 111 func (s *S) init() { ... } |
| 112 func (s *S) Foo() { |
| 113 s.once.Do(s.init) |
| 114 |
| 115 - func "terminating statement" |
| 116 |
| 117 func abs(n int) int { |
| 118 switch { |
| 119 case n < 0: return -n |
| 120 default: return n |
| 121 } |
| 122 } |
| 123 |
| 124 - 64-bit "int", large heaps |
| 125 - 30-40% speed improvement, stdlib++ |
| 126 - more precise heap GC, usually |
| 127 |
| 128 * Aside: precise vs conservative GC |
| 129 |
| 130 Conservative GC: if it "looks like" a pointer, treat it like one. |
| 131 |
| 132 [ ptr? ] [ ptr? ] [ ptr? ] [ ptr? ] [ ptr? ] [ ptr? ] [ ptr? ] [ ptr? ] |
| 133 [ ptr? ] [ byte slice (skipped in Go 1.0) ] |
| 134 [ ptr? ] [ ptr? ] [ ptr? ] [ ptr? ] [ ptr? ] [ ptr? ] [ ptr? ] [ ptr? ] |
| 135 |
| 136 Terrible for 32-bit (e.g. ARM) computers: many integers look like pointers. |
| 137 |
| 138 Precise GC: |
| 139 |
| 140 [ int ] [ ptr ] [ string ] [ byte slice ] |
| 141 [ int ] [ t f t f ] [ ptr ] [ int ] [ float64 ] [ ptr ] |
| 142 |
| 143 Requires knowing what every position in memory _actually_ is. |
| 144 |
| 145 - no false retention, only look at some memory during GC |
| 146 |
| 147 * Go 1.2 (2013-12-01) |
| 148 |
| 149 - 6 month release cycle begins |
| 150 - setting slice capacity with s[i:j:k] |
| 151 |
| 152 s := make([]byte, 10, 20) |
| 153 foo(s[10:12:15]) |
| 154 |
| 155 func foo(s []byte) { fmt.Println(len(s), cap(s)) } |
| 156 |
| 157 - preemption in scheduler |
| 158 - go test -cover |
| 159 |
| 160 * Go 1.3 (2014-06-18) |
| 161 |
| 162 - no language changes |
| 163 - GOOS=solaris,dragonfly,plan9,nacl |
| 164 - precise GC of the stack (mostly) |
| 165 - contiguous stacks (mostly) |
| 166 |
| 167 * Aside: Segmented vs. Contiguous stacks |
| 168 |
| 169 - C++/Java: one huge stack per thread |
| 170 - Go <= 1.2: multiple discontiguous 4K stacks, bounce between |
| 171 - Go 1.3: one little stack, grow & shrink as needed |
| 172 .image state-of-the-gopher/contig-stack.png _ 550 |
| 173 |
| 174 * The present (relative to Nov 2009) |
| 175 |
| 176 * More ports |
| 177 |
| 178 - Windows |
| 179 - FreeBSD, OpenBSD, NetBSD |
| 180 - Solaris, Plan 9, DragonFly BSD |
| 181 - NaCl (again) |
| 182 |
| 183 * Better docs |
| 184 |
| 185 - [[http://blog.golangorg][Blog]] articles, |
| 186 - Community [[https://code.google.com/p/go-wiki/w/list][Wiki]], |
| 187 - [[https://code.google.com/p/go-wiki/wiki/Books][Books]] |
| 188 |
| 189 * Users: up and to the right |
| 190 |
| 191 - Go [[https://code.google.com/p/go-wiki/wiki/GoUserGroups][user groups]], [[htt
p://go-meetups.appspot.com/][meetups]] |
| 192 - GitHub commits, stars, forks |
| 193 - Since 2009: `golang-nuts@` (1450 → 14134), `-dev` (37 → 2152) |
| 194 .link http://redmonk.com/dberkholz/2014/03/18/go-the-emerging-language-of-cloud-
infrastructure/ Go: the emerging language of cloud infrastructure |
| 195 |
| 196 .image state-of-the-gopher/oloh.png |
| 197 |
| 198 * The Cloud |
| 199 |
| 200 - Docker |
| 201 - CoreOS, etcd, fleet |
| 202 - Juju |
| 203 - NATS, gnatsd, Packer, Heka |
| 204 - dl.google.com, Vitess, Kubernetes |
| 205 - App Engine |
| 206 |
| 207 * Conferences |
| 208 |
| 209 [[http://connpass.com/series/312/][GoCon Tokyo]] |
| 210 |
| 211 * Conferences |
| 212 |
| 213 .image state-of-the-gopher/gophercon.png |
| 214 |
| 215 * Conferences |
| 216 |
| 217 .image state-of-the-gopher/dotgo.png |
| 218 |
| 219 * Conferences |
| 220 |
| 221 .image state-of-the-gopher/india.png |
| 222 |
| 223 * CoreOS |
| 224 |
| 225 .image state-of-the-gopher/bus.jpg |
| 226 |
| 227 - increasingly running [[http://build.golang.org]], each in a Docker container |
| 228 - Go powering Go development! |
| 229 |
| 230 * build.golang.org |
| 231 |
| 232 .image state-of-the-gopher/build.png 400 _ |
| 233 |
| 234 * Better tools |
| 235 |
| 236 - go/parser: godoc, [[http://godoc.org]], gofmt, gofix → |
| 237 - [[http://godoc.org/code.google.com/p/go.tools/cmd/goimports][goimports]]: auto
matic import lines |
| 238 - go/types, gofix+types,· |
| 239 - go/ast, go/ssa, [[http://godoc.org/code.google.com/p/go.tools/cmd/oracle][orac
le]], |
| 240 - [[http://godoc.org/code.google.com/p/go.tools/cmd/eg][eg]], example-based refa
ctoring |
| 241 - [[http://godoc.org/code.google.com/p/go.tools/cmd/gorename][gorename]], safe g
lobal renaming tool |
| 242 |
| 243 Tooling begets better tooling! |
| 244 |
| 245 - goimports + go/types + go/parser == [[https://twitter.com/sqs/status/520203018
957250560][goreturns]] (lazy "return err") |
| 246 |
| 247 * The Future |
| 248 |
| 249 * Go 1.4 |
| 250 |
| 251 * Go 1.4 (2014-12-01?) |
| 252 |
| 253 - fully precise GC of the stack + heap |
| 254 - segmented stacks & conservative GC deleted |
| 255 - stack copier & shrinker requires precise stack types too |
| 256 |
| 257 - `runtime` conversion from C to Go: maps, channels, interfaces, type checks, pr
intln, defer, panic, etc. |
| 258 |
| 259 - Garbage collector and scheduler are still in C |
| 260 |
| 261 * Go 1.4 |
| 262 |
| 263 - [[http://golang.org/s/go14android][GOOS=android]] (Elias Naur, David Crawshaw) |
| 264 - GOOS=nacl GOARCH=arm |
| 265 - [[http://golang.org/s/go14internal]["internal" packages]] |
| 266 - [[http://golang.org/s/go1.4-generate]["go generate"]] |
| 267 - [[https://docs.google.com/a/golang.org/document/d/1QXzI9I1pOfZPujQzxhyRy6EeHYT
QitKKjHfpq0zpxZs][syscall package frozen, go.sys]] |
| 268 - "go tool pprof" converted from Perl (!) to Go |
| 269 - minor stdlib additions, improvements |
| 270 |
| 271 * Go 1.5 |
| 272 |
| 273 * Go 1.5 (2014-06-01?) |
| 274 |
| 275 - Concurrent GC is main theme |
| 276 - Roadmap: [[http://golang.org/s/go14gc]] (GC in 1.4, 1.5, 1.6+) |
| 277 |
| 278 * Go 1.5: ports |
| 279 |
| 280 - GOOS=ios revival? (Minux, David Crawshaw) |
| 281 - GOARCH=ppc64 (minux) |
| 282 - GOARCH=arm64 (aram, dfc) |
| 283 |
| 284 * Go 1.5: removing more C |
| 285 |
| 286 Didn't make Go 1.4: |
| 287 |
| 288 - `cmd/link`: linker rewrite in Go |
| 289 - `cmd/asm`: assembler rewrite in Go |
| 290 - "gc" compiler in Go |
| 291 |
| 292 * "gc" Compiler in Go |
| 293 |
| 294 - lots of C |
| 295 - C → Go translator == kinda ugly Go |
| 296 - refactor that Go with tools: `eg`, `gorename`, etc |
| 297 - add packages, tests |
| 298 - unify all `8g`, `5g`, `6g`, `9g` |
| 299 - SSA form, new optimizations |
| 300 |
| 301 See rsc's GopherCon [[http://talks.golang.org/2014/c2go.slide#1][slides]], [[htt
p://gophercon.sourcegraph.com/post/83820197495/russ-cox-porting-the-go-compiler-
from-c-to-go][notes]], [[https://www.youtube.com/watch?v=QIE5nV5fDwA][video]]. |
| 302 |
| 303 * Go 1.5 Tracing |
| 304 |
| 305 - Dmitry's GOTRACE + Chrome trace viewer |
| 306 |
| 307 .image state-of-the-gopher/trace.png |
| 308 |
| 309 * Go 1.6 |
| 310 |
| 311 - More GC work |
| 312 - Ongoing compiler-in-Go cleanup & optimizations |
| 313 - PNaCl? |
| 314 - [[https://docs.google.com/a/google.com/document/d/1d3iI2QWURgDIsSR6G2275vMeQ_X
7w-qxM2Vp7iGwwuM/pub][NUMA-aware scheduler]]? |
| 315 - unknown surprises |
| 316 Who knows. |
| 317 Find out next year at dotGo Paris 2015! |
| 318 |
| 319 * Go 2.0 |
| 320 |
| 321 - maybe one day |
| 322 |
| 323 * Outside of the core |
| 324 |
| 325 * libraries & tools |
| 326 |
| 327 - HTTP/2, to be merged into `net/http` |
| 328 - go.tools: `goimports`, `eg`, `gorename`, `oracle`, ... |
| 329 - go.text: Unicode collation, normalization, ... |
| 330 - go.mobile: Android, iOS, gaming, 3D graphics, event handling |
| 331 - go.crypto |
| 332 - go.net |
| 333 - go.tools |
| 334 - go.syscall |
| 335 |
| 336 * gccgo |
| 337 |
| 338 - keeping up with spec |
| 339 - better in some ways (codegen, OS, arch) |
| 340 - worse in others (precise GC, escape analysis) |
| 341 - work underway to improve |
| 342 |
| 343 All checking & improving each other: |
| 344 |
| 345 - gc, gccgo, go/types, language spec, unit tests |
| 346 |
| 347 * Notable other compilers |
| 348 |
| 349 - [[https://github.com/go-llvm/llgo][llgo]], Go → LLVM → PNaCL, etc |
| 350 - [[https://github.com/tardisgo/tardisgo][TARDIS Go]], Go → Haxe → JS, anything |
| 351 - [[https://github.com/gopherjs/gopherjs][GopherJS]], Go → JS |
| 352 |
| 353 And all three written in Go, use `go/parser`, `go/types`, etc. |
| 354 We can't wait to join them. |
| 355 |
| 356 * In summary |
| 357 |
| 358 * The growth is exciting |
| 359 |
| 360 - things are getting cleaner, |
| 361 - things are getting faster, |
| 362 - things are getting more impressive, |
| 363 - everything is growing on top of everything else, |
| 364 - hard to keep up with golang-dev@, golang-nuts@, bugs, wiki, new github project
s, code reviews, |
| 365 |
| 366 * You all are awesome· |
| 367 |
| 368 - keep being awesome |
| 369 - keep making awesome things |
LEFT | RIGHT |