| The Evolution of Go |
| GopherCon 2015 Keynote - July 9, 2015 |
| |
| Robert Griesemer |
| Google, Inc. |
| gri@golang.org |
| |
| |
| * Video |
| |
| A video of this talk was recorded at GopherCon in Denver. |
| |
| .link https://www.youtube.com/watch?v=0ReKdcpNyQg Watch the talk on YouTube |
| |
| |
| * |
| |
| .image gophercon-goevolution/GopherEvolution.svg |
| |
| |
| * Personal background |
| |
| - Personal interest in programming languages. |
| |
| - After grad school, programming in industry felt like a huge step backwards. |
| |
| - Over the years, spent a lot of time thinking about programming languages. |
| |
| - Good language design is *hard*. |
| |
| - After 15 years of using C++, only two ways forward: *sell*out*or*bail*out*! |
| |
| - Lucky to be on board with Rob and Ken. |
| |
| |
| * Starting points |
| |
| - Clear goal in mind: We needed a better language for what we do at Google. |
| |
| - Personal motivation: Wanted a clean, small, compiled language with modern features. |
| |
| - Clear about what was wrong: Complexity, missing concurrency support, lack of scalability, insane build times. |
| |
| - Good ideas about how to address issues. |
| |
| - Unpolished thoughts about the rest. |
| |
| - Three experienced people's insights on how not to do it. |
| |
| - Lure: Designing a new language is easy. |
| |
| What could possibly go wrong? |
| |
| |
| * Guiding principles |
| |
| - Simplicity, safety, and readability are paramount. |
| |
| - Striving for orthogonality in design. |
| |
| - Minimal: One way to write a piece of code. |
| |
| - It's about *expressing*algorithms*, not the type system. |
| |
| - Collective unconscious history of programming languages. |
| |
| Things of interest should be easy; even if that means not everything is possible. |
| |
| |
| * Literature on good language design is sparse |
| |
| .image gophercon-goevolution/HoaresPLHints.JPG 400 600 |
| |
| - "Hints on Programming Language Design" (C.A.R. Hoare, 1973) |
| - "Everything you always wanted to know about programming languages but were afraid to ask" (C.A.R. Hoare, 1978) |
| |
| |
| * First design notes |
| |
| Date: Sun, 23 Sep 2007 23:33:41 -0700 |
| From: "Robert Griesemer" <gri@google.com> |
| To: "Rob 'Commander' Pike" <r@google.com>, ken@google.com |
| Subject: prog lang discussion |
| ... |
| *** General: |
| Starting point: C, fix some obvious flaws, remove crud, add a few missing features |
| - no includes, instead: import |
| - no macros (do we need something instead?) |
| - ideally only one file instead of a .h and .c file, module interface |
| should be extracted automatically |
| - statements: like in C, though should fix 'switch' statement |
| - expressions: like in C, though with caveats (do we need ',' expressions?) |
| - essentially strongly typed, but probably w/ support for runtime types |
| - want arrays with bounds checking on always (except perhaps in 'unsafe mode'-see section on GC) |
| - mechanism to hook up GC (I think that most code can live w/ GC, but for a true systems |
| programming language there should be mode w/ full control over memory allocation) |
| - support for interfaces (differentiate between concrete, or implementation types, and abstract, |
| or interface types) |
| - support for nested and anonymous functions/closures (don't pay if not used) |
| - a simple compiler should be able to generate decent code |
| - the various language mechanisms should result in predictable code |
| ... |
| |
| |
| * Looking back |
| |
| Many Day One ideas made it into Go: |
| |
| - Syntax: Leading keyword notation (const, var, type, etc), many cleanups. |
| - Expressions: 5 binary precedence levels maximum. |
| - Explicitly sized basic types, rune type, no implicit conversions. |
| |
| - Packages and imports. |
| - Methods with explicit receiver parameter. |
| - Interfaces. |
| - Understanding that we would somehow add concurrency support based on Rob's previous work. |
| |
| Many concepts were missing, and even more ideas didn't make it. |
| |
| However, we were off to a good start. This was not at all obvious at the time! |
| |
| |
| * Most ideas come from previous ideas. |
| (Alan Kay) |
| |
| Or, as some critics would say: There's nothing new in Go! |
| |
| |
| They are missing the point: |
| |
| The task of the programming language designer *"*is*consolidation*not*innovation*"*. |
| (Hoare, 1973). |
| |
| |
| * The Algol family |
| |
| |
| * Algol60 |
| |
| |
| (John Backus, John McCarthy, Alan Perlis, et al, 1958-1960) |
| |
| => Block structure, nested and recursive functions and procedures, type declarations and static typing, "for" statement, "return" statement, semicolon separated statements, "begin"-"end" blocks, "call by name", etc. |
| |
| "Here is a language [Algol60] so far ahead of its time, that it was not only an improvement on its predecessors, but also on nearly all its successors." (C.A.R. Hoare) |
| |
| Coincidentally, a few years before: |
| - Backus Naur Normal Form (John Backus, Peter Naur, 1958) |
| |
| |
| * Algol successors |
| |
| - *Pascal* (N. Wirth, ETH Zürich, 1968-1970) |
| => BEGIN/END for blocks, semicolons as separators, left-to-right declarations, |
| principled structured data types, notion of predeclared ("standard") functions, designed for teaching. |
| |
| - *C* (Dennis Ritchie, Bell Labs, 1969-1973) |
| => Curly braces for blocks, semicolons as terminators, declarations mimic use, |
| duality between arrays and pointers, static typing but weak enforcement, designed to write Unix kernel. |
| |
| |
| * Pascal successors |
| |
| - *Modula*, *Modula-2* (N. Wirth, 1978, 1980) |
| => Modules separate compilation and encapsulation, coroutines and monitors, support for low-level programming. |
| |
| - *Oberon* (N. Wirth, 1986) |
| => Simplified modules, dynamic type extension and type tests, streamlined syntax. |
| |
| Philosophy: "Make it as simple as possible, but not simpler." (A. Einstein) |
| |
| - *Object*Oberon* (J. Templ, H.P. Moessenboeck, 1989) |
| => Experimental Oberon dialect with classes and methods. |
| |
| - *Oberon-2* (J. Templ, H.P Moessenboeck, N. Wirth, 1991) |
| => Oberon with methods on records (== structs), replaces Object Oberon. |
| |
| |
| * Tree node lookup in Oberon-2 |
| |
| |
| MODULE Trees; |
| |
| IMPORT Texts, Oberon; |
| |
| TYPE |
| Tree* = POINTER TO Node; (* star denotes export, not pointer! *) |
| Node* = RECORD |
| name-: POINTER TO ARRAY OF CHAR; (* minus denotes read-only export *) |
| left, right: Tree |
| END; |
| |
| PROCEDURE (t: Tree) Lookup* (name: ARRAY OF CHAR): Tree; |
| VAR p: Tree; |
| BEGIN p := t; |
| WHILE (p # NIL) & (name # p.name^) DO |
| IF name < p.name^ THEN p := p.left ELSE p := p.right END |
| END; |
| RETURN p |
| END Lookup; |
| |
| ... |
| |
| |
| * Analogous code in Go |
| |
| |
| package trees |
| |
| import ( "fmt"; "runtime" ) |
| |
| type ( |
| Tree *Node |
| Node struct { |
| name string |
| left, right Tree |
| } |
| ) |
| |
| func (t *Node) Lookup(name string) Tree { |
| var p Tree |
| p = t |
| for p != nil && name != p.name { |
| if name < p.name { p = p.left } else { p = p.right } |
| } |
| return p |
| } |
| |
| ... |
| |
| |
| * Observations |
| |
| - Syntax details are different but structure is the same. |
| => C tokens, Oberon structure. |
| |
| - Same concepts (packages, imports, types, functions/methods, etc). |
| => Go concepts further distilled (e.g.; just one loop construct). |
| |
| Go's heritage is at least as much Oberon as it is C! |
| (packages, imports, strict memory safety, garbage collection, dynamic type checks, etc.) |
| |
| |
| * Object orientation and generics |
| |
| Around 1990: OO and type-system "craze" taking its toll on programming languages. |
| - C++, Java, others |
| - complex OO type systems |
| - complex generic type systems |
| |
| Proliferation of dynamically typed interpreted languages: |
| - Erlang, Perl, Python, Lua, Javascript, Ruby, etc. |
| |
| 1990s, 2000s: Backlash. |
| - Complex OO code is modern analog to unstructured "spaghetti code" of 1970. |
| - Realization that large programs in dynamically typed languages become unmaintainable. |
| - Cluttered notation: “Public Static Void” (Rob Pike, OSCON 2010). |
| |
| |
| * Object orientation in Go: Interfaces |
| |
| Inspiration: Smalltalk (Alan Kay, Dan Ingalls, Adele Goldberg, 1972-1980) |
| - Everything is an object. |
| - Any message can be sent to any object. |
| |
| Want: Similar power in (mostly) statically typed language without the type-system fuss. |
| - Notion of interfaces for static typing. |
| - Usually objects carry type information => restricts object types to "classes". |
| |
| *Crucial*insight*: Can attach methods to any type if interfaces carry type info rather than objects. |
| |
| Methods and interfaces are the only additional mechanisms needed for object-oriented programming. |
| |
| |
| * Concurrency |
| |
| - Good concurrency support was considered essential from day one. |
| |
| - Rob Pike’s work on NewSqueak turned out to fit really well into Go. |
| |
| Origins: |
| |
| - “Newsqueak: A Language for Communicating with Mice”, Rob Pike, 1994. |
| |
| - “Communicating Sequential Processes”, CACM, C.A.R. Hoare, 1978. |
| |
| |
| * Generics |
| |
| - Single biggest language feature (what exactly is it?) absent in Go. |
| |
| - Often missed by newcomers to Go. |
| |
| - Type-system mechanism; unclear if essential language feature. |
| |
| - Incredibly complex in both semantics and implementation. |
| |
| - Significant trade-offs: Larger binary, slower binary, or larger source code. |
| |
| - Not-orthogonal: Affects many other language features as well as how library is written. |
| |
| - For now: Hold off and keep thinking about it. |
| |
| |
| * Putting it all together |
| |
| Luxury to spend two years to hammer out basics (thanks, Google!). |
| |
| Crucial: *Added*one*feature*at*a*time.* |
| |
| Initially: Team of three very different people. |
| - Intensive discussions, emotional. |
| - Humbling experience. |
| |
| Having multiple people illuminating each new feature from different angles |
| made language much stronger. |
| |
| Later: |
| - Russ Cox's razor cutting through the crud, making it work well. |
| - Ian Lance Taylor providing a 2nd implementation (validation of design). |
| - go/types (now in 1.5!) provides a 3rd frontend (validation of compilers and spec). |
| |
| Having 3 frontends proved tremendously useful. |
| |
| |
| * Evolving Go |
| |
| Original design went through many (syntactic and semantic) transitions: |
| |
| - Parallel library development ensured we didn't design "into the blue". |
| |
| - gofmt (for language changes) and gofix (for API changes) for existing code. |
| |
| Features that came in much later: |
| |
| - Optional semicolons, optional types for composite literals, optional bounds in slice expressions, recover, etc. |
| |
| - Semantic clarifications (maps, channel ops, etc.). |
| |
| - Small backward-compatible adjustments still happening at very low rate. |
| |
| |
| * The future of Go |
| |
| |
| * What makes a programming language successful? |
| |
| - Clear target |
| |
| - Solid implementation: *language*, *libraries*, and *tools*! |
| |
| - Market readiness |
| |
| - Technological breakthrough |
| |
| - Language features without competitors |
| |
| - Rarely: Marketing |
| |
| |
| * How about Go? |
| |
| - Clear target behind design |
| - Multi-paradigm (imperative, functional, object-oriented) |
| - Syntactically light-weight |
| - Language features without competition: goroutines, interfaces, defer |
| - Tools without competition: fast compiler, gofmt, go build |
| - Strong standard libraries |
| - Solid implementation |
| - Excellent documentation, online tools (playground, tour) |
| - But: No corporate marketing to speak of |
| |
| |
| * Will Go become mainstream? |
| |
| - Need to cross the chasm from early adopters to early mainstream. Are we there yet? |
| - Go community must remain unified behind this goal. |
| - Don't make too many mistakes going forward. |
| |
| It takes about 10 years for a programming language to become "established". |
| |
| |
| * Pitfalls |
| |
| The language is frozen, but these are a form of "language design": |
| |
| - +build tags and other specialized comments |
| - special interpretation of import paths and canonical import path comments |
| - internal packages |
| - vendoring descriptions |
| |
| These mechanisms are not part of the language spec and thus may diverge |
| over time or have different semantics on different platforms. |
| |
| Need to be watchful of this development. |
| |
| |
| * Closing thoughts |
| |
| - In 1960, language experts from America and Europe teamed up to create Algol 60. |
| - In 1970, the Algol tree split into the C and the Pascal branch. |
| - ~40 years later, the two branches join again in Go. |
| - Let's see if Go can enjoy an equally long run as its predecessors! |