github.com/graybobo/golang.org-package-offline-cache@v0.0.0-20200626051047-6608995c132f/x/talks/2014/state-of-the-gopher.slide (about) 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 & indexing 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][open 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 compiler. 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.golang.org][Blog]] articles, 186 - Community [[https://golang.org/wiki][Wiki]], 187 - [[https://golang.org/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]], [[http://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]]: automatic import lines 238 - go/types, gofix+types, 239 - go/ast, go/ssa, [[http://godoc.org/code.google.com/p/go.tools/cmd/oracle][oracle]], 240 - [[http://godoc.org/code.google.com/p/go.tools/cmd/eg][eg]], example-based refactoring 241 - [[http://godoc.org/code.google.com/p/go.tools/cmd/gorename][gorename]], safe global renaming tool 242 243 Tooling begets better tooling! 244 245 - goimports + go/types + go/parser == [[https://twitter.com/sqs/status/520203018957250560][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, println, 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/1QXzI9I1pOfZPujQzxhyRy6EeHYTQitKKjHfpq0zpxZs][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]], [[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]]. 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_X7w-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 projects, code reviews, 365 366 * You all are awesome 367 368 - keep being awesome 369 - keep making awesome things