diff options
author | Ondřej Surý <ondrej@sury.org> | 2011-09-13 13:13:40 +0200 |
---|---|---|
committer | Ondřej Surý <ondrej@sury.org> | 2011-09-13 13:13:40 +0200 |
commit | 5ff4c17907d5b19510a62e08fd8d3b11e62b431d (patch) | |
tree | c0650497e988f47be9c6f2324fa692a52dea82e1 /doc/talks/go_talk-20100112.html | |
parent | 80f18fc933cf3f3e829c5455a1023d69f7b86e52 (diff) | |
download | golang-upstream/60.tar.gz |
Imported Upstream version 60upstream/60
Diffstat (limited to 'doc/talks/go_talk-20100112.html')
-rw-r--r-- | doc/talks/go_talk-20100112.html | 411 |
1 files changed, 411 insertions, 0 deletions
diff --git a/doc/talks/go_talk-20100112.html b/doc/talks/go_talk-20100112.html new file mode 100644 index 000000000..2e3643512 --- /dev/null +++ b/doc/talks/go_talk-20100112.html @@ -0,0 +1,411 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> +<title>Go (January 12, 2010)</title> +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<meta name="font-size-adjustment" content="-1" /> +<link rel="stylesheet" href="slidy.css" + type="text/css" media="screen, projection, print" /> +<script src="slidy.js" type="text/javascript"> +</script> +</head> +<body> +<!-- this defines the slide background --> + +<div class="background"> + + <div class="header"> + <!-- sized and colored via CSS --> + </div> + + <div class="footer"></div> + </div> + +<div class="slide titlepage"> +<div style="height: 135px; width: 480px; overflow: hidden; position: fixed; top: auto; bottom: 10px; left: auto; right: 0; "> +<img src="../gordon/bumper480x270.png" style="margin: -135px 0 0 0;"/> +</div> +<!-- <img src="google.png" style="position: fixed; top: auto; bottom: 30px; left: 20px; right: auto;"/> --> +<br/> +<img src="../go-logo-white.png"> +<br/> +<br/> +<h1 style="padding-right: 0pt; margin-right: 0pt; color: #0066cc; font-size: 250%; border-bottom: 0px;">The Go Programming Language</h1> +<div style="color: #ffcc00;"> +<h2>Russ Cox</h2> +<!-- <h3><i>rsc@google.com</i></h3> --> +<br/> +<h3>Stanford University<br/><br/>January 12, 2010</h3> +</div> +</div> + +<div class="slide"> + <h1>Go</h1> + + <h2>New</h2> + <h2>Experimental</h2> + <h2>Concurrent</h2> + <h2>Garbage-collected</h2> + <h2>Systems</h2> + <h2>Language</h2> +</div> + +<div class="slide"> + <h1>Hello, world</h1> +<pre> +package main + +import "fmt" + +func main() { + fmt.Printf("Hello, 世界\n") +} +</pre> +</div> + +<div class="slide"> + <h1>History</h1> + + <h2>Design started in late 2007.</h2> + <h2>Implementation starting to work mid-2008.</h2> + <h2>Released as an open source project in November 2009.</h2> + <h2>Work continues.<h2> + <h2>Robert Griesemer, Ken Thompson, Rob Pike, Ian Lance Taylor, Russ Cox, many others</h2> +</div> + +<div class="slide"> + <h1>Why?</h1> + + <h2>Go fast!</h2> + <h2>Make programming fun again.</h2> +</div> + +<div class="slide"> + <h1>Why isn't programming fun?</h1> + + <div class="incremental"> + <h2>Compiled, statically-typed languages (C, C++, Java) require too much typing and too much typing:</h2> + + <ul> + <li>verbose, lots of repetition</li> + <li>too much focus on type hierarchy</li> + <li>types get in the way as much as they help</li> + <li>compiles take far too long</li> + </ul> + </div> + + <div class="incremental"> + <h2>Dynamic languages (Python, JavaScript) fix these problems (no more types, no more compiler) but introduce others:</h2> + + <ul> + <li>errors at run time that should be caught statically</li> + <li>no compilation means slow code</li> + </ul> + </div> + + <h2 class="incremental">Can we combine the best of both?</h2> +</div> + +<div class="slide"> + <h1>Go</h1> + + <h2>Make the language fast.</h2> + <h2>Make the tools fast.</h2> +</div> + +<div class="slide"> + <h1>Go Approach: Static Types</h1> + + <h2>Static types, but declarations can infer type from expression:</h2> + +<pre> +var one, hi = 1, "hello" + +var double = func(x int) int { return x*2 } +</pre> + + <h2>Not full Hindley-Milner type inference.</h2> +</div> + + +<div class="slide"> + <h1>Go Approach: Methods</h1> + + <h2>Methods can be defined on any type.</h2> + +<pre> +type Point struct { + X, Y float64 +} + +func (p Point) Abs() float64 { + return math.Sqrt(p.X*p.X + p.Y*p.Y) +} +</pre> +</div> + +<div class="slide"> + <h1>Go Approach: Methods</h1> + + <h2>Methods can be defined on any type.</h2> + +<pre> +type MyFloat float64 + +func (f MyFloat) Abs() float64 { + v := float64(f) + if v < 0 { + v = -v + } + return v +} +</pre> +</div> + +<div class="slide"> + <h1>Go Approach: Abstract Types</h1> + + <h2>An interface type lists a set of methods. Any value with those methods satisfies the interface.</h2> + +<pre> +type Abser interface { + Abs() float64 +} + +func AbsPrinter(a Abser) +</pre> + + <h2>Can use Point or MyFloat (or ...):</h2> + +<pre> +p := Point{3, 4} +AbsPrinter(p) + +f := MyFloat(-10) +AbsPrinter(f) +</pre> + + <h2>Notice that Point never declared that it implements Abser. It just does. Same with MyFloat.</h2> +</div> + +<div class="slide"> + <h1>Go Approach: Packages</h1> + + <h2>A Go program comprises one or more packages.</h2> + <h2>Each package is one or more source files compiled and imported as a unit.</h2> +<pre> +package draw + +type Point struct { + X, Y int +} +</pre> + +<pre> +package main + +import "draw" + +var p draw.Point +</pre> +</div> + +<div class="slide"> + <h1>Go Approach: Visibility</h1> + + <h2>Inside a package, all locally defined names are visible in all source files.</h2> + + <h2>When imported, only the upper case names are visible.</h2> + +<pre> +package draw + +type <span style="color: black;">Point</span> struct { + <span style="color: black;">X</span>, <span style="color: black;">Y</span> int + dist float64 +} + +type cache map[Point] float64 +</pre> + +<h2>Clients that <code>import "draw"</code> can use the black names only.</h2> + +<h2>“Shift is the new <code>public</code>.”</h2> +</div> + +<div class="slide"> + <h1>Go Approach: Concurrency</h1> + + <h2>Cheap to create a new flow of control (goroutine):</h2> + +<pre> +func main() { + go expensiveComputation(x, y, z) + anotherExpensiveComputation(a, b, c) +} +</pre> + + <h2>Two expensive computations in parallel.</h2> +</div> + +<div class="slide"> + <h1>Go Approach: Synchronization</h1> + + <h2>Use explicit messages to communicate and synchronize.</h2> + +<pre> +func computeAndSend(ch chan int, x, y, z int) { + ch <- expensiveComputation(x, y, z) +} + +func main() { + ch := make(chan int) + go computeAndSend(ch, x, y, z) + v2 := anotherExpensiveComputation(a, b, c) + v1 := <-ch + fmt.Println(v1, v2) +} +</pre> + <h2>Notice communication of result in addition to synchronization.</h2> +</div> + +<div class="slide"> + <h1>Go Fast: Language</h1> + + <h2 class="incremental">Static types: enough to compile well, but inferred much of the time.</h2> + + <h2 class="incremental">Methods: on any type, orthogonal to type system.</h2> + + <h2 class="incremental">Abstract types: interface values, relations inferred statically.</h2> + + <h2 class="incremental">Visibility: inferred from case of name.</h2> + + <h2 class="incremental">Concurrency: lightweight way to start new thread of control.</h2> + + <h2 class="incremental">Synchronization: explicit, easy message passing.</h2> + + <br/> + + <h2 class="incremental">Lightweight feel of a scripting language but compiled.</h2> +</div> + +<div class="slide"> + <h1>Compile fast</h1> + + <div class="incremental"> + <h2>Observation: much of the compile time for a source file is spent processing + other, often unrelated files.</h2> + + <h2>In C: <code>a.c</code> includes <code>b.h</code>, which includes <code>c.h</code>, which includes <code>d.h</code>. + </h2> + + <h2>Except that it's more often a tree instead of a chain.</h2> + + <h2>On my Mac (OS X 10.5.8, gcc 4.0.1):</h2> + <ul> + <li>C: <code>#include <stdio.h></code> reads 360 lines from 9 files. + <li>C++: <code>#include <iostream></code> reads 25,326 lines from 131 files. + <li>Objective C: <code>#include <Carbon/Carbon.h></code> reads 124,730 lines from 689 files. + </ul> + + <h2>And we haven't done any real work yet!</h2> + + <h2>Same story in Java, Python, but reading binaries instead of source files.</h2> + </div> +</div> + +<div class="slide"> + <h1>Implementation: Summarize Dependencies</h1> + +<pre> +package gui + +import "draw" + +type Mouse struct { + Loc draw.Point + Buttons uint +} +</pre> + <h2>Compiled form of <code>gui</code> summarizes the necessary part of <code>draw</code> (just <code>Point</code>).</h2> + +</div> + +<div class="slide"> + <h1>Implementation: Summarize Dependencies</h1> + + <h2>Compiled form of <code>gui</code> summarizes the necessary part of <code>draw</code> (just <code>Point</code>). Pseudo-object:</h2> + +<pre> +package gui +type draw.Point struct { + X, Y int +} +type gui.Mouse struct { + Loc draw.Point + Buttons uint +} +</pre> + + <h2>A file that imports <code>gui</code> compiles without consulting <code>draw</code> or its dependencies.</h2> + + <h2>In Go: <code>import "fmt"</code> reads <i>one</i> file: 184 lines summarizing types from 7 packages.</h2> + + <h2>Tiny effect in this program but can be exponential in large programs.</h2> +</div> + +<div class="slide"> + <h1>Compilation Demo</h1> + + <h2>Build all standard Go packages: ~120,000 lines of code.</h2> +</div> + +<div class="slide"> + <h1>Go Status</h1> + + <div class="incremental"> + <div> + <h2>Open source:</h2> + <ul> + <li>released on November 10, 2009 + <li>regular releases (~ weekly) + <li>all development done in public Mercurial repository + <li>outside contributions welcome + </ul> + </div> + + <div> + <h2>Portable:</h2> + <ul> + <li>FreeBSD, Linux, OS X (x86, x86-64) + <li>(in progress) Linux arm, Native Client x86, Windows x86. + </ul> + </div> + + <div> + <h2>Still in progress, experimental. Yet to come:</h2> + <ul> + <li>mature garbage collector + <li>generics? + <li>exceptions? + <li>unions or sum types? + </ul> + </div> + </div> + +</div> + +<div class="slide titlepage"> + <h1>Questions?</h1> + <br><br> + <center> + <img src="../gordon/bumper640x360.png"> + </center> + <br><br> + <div style="color: #ffcc00;"> + <!-- <h3><i>rsc@google.com</i></h3> --> + </div> +</div> + +</body></html> |