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