github.com/graybobo/golang.org-package-offline-cache@v0.0.0-20200626051047-6608995c132f/x/talks/2014/research.slide (about) 1 The Research Problems of Implementing Go 2 3 Russ Cox 4 Google 5 6 http://golang.org/ 7 8 * About the Talk 9 10 I gave this talk at Google's Cambridge, Massachusetts office at an event for area Ph.D. students. The purpose of the event and the talk was to give a sense of some of the research that goes on at Google. The talk presents some research questions motivated by Go. We have answered some well, but others remain open. 11 12 * About Go 13 14 Go is an open source programming language that makes it easy to build simple, reliable, and efficient software. 15 16 Design began in late 2007. 17 18 - Robert Griesemer, Rob Pike, Ken Thompson 19 - Russ Cox, Ian Lance Taylor 20 21 Became open source in November 2009. 22 23 Developed entirely in the open; very active community. 24 Language stable as of Go 1, early 2012. 25 Work continues. 26 27 * Motivation for Go 28 29 .image ../2012/splash/datacenter.jpg 30 31 * Motivation for Go 32 33 Started as an answer to software problems at Google: 34 35 - multicore processors 36 - networked systems 37 - massive computation clusters 38 - scale: 10⁷ lines of code 39 - scale: 10³ programmers 40 - scale: 10⁶⁺ machines (design point) 41 42 Deployed: parts of YouTube, dl.google.com, Blogger, Google Code, Google Fiber, ... 43 44 * Go 45 46 A simple but powerful and fun language. 47 48 - start with C, remove complex parts 49 - add interfaces, concurrency 50 - also: garbage collection, closures, reflection, strings, ... 51 52 For more background on design: 53 54 - [[http://commandcenter.blogspot.com/2012/06/less-is-exponentially-more.html][Less is exponentially more]] 55 - [[http://talks.golang.org/2012/splash.article][Go at Google: Language Design in the Service of Software Engineering]] 56 57 * Research and Go 58 59 Go is designed for building production systems at Google. 60 61 - Goal: make that job easier, faster, better. 62 - Non-goal: break new ground in programming language research 63 64 Plenty of research questions about how to implement Go well. 65 66 - Concurrency 67 - Polymorphism 68 - Garbage collection 69 - Program translation 70 71 * Concurrency 72 73 * Concurrency 74 75 Go provides two important concepts: 76 77 A goroutine is a thread of control within the program, with its own local variables and stack. Cheap, easy to create. 78 79 A channel carries typed messages between goroutines. 80 81 * Concurrency 82 83 .play ../2013/distsys/hello.go 84 85 * Concurrency: CSP 86 87 Channels adopted from Hoare's Communicating Sequential Processes. 88 89 - Orthogonal to rest of language 90 - Can keep familiar model for computation 91 - Focus on _composition_ of regular code 92 93 Go _enables_ simple, safe concurrent programming. 94 It doesn't _forbid_ bad programming. 95 96 Caveat: not purely memory safe; sharing is legal. 97 Passing a pointer over a channel is idiomatic. 98 99 Experience shows this is practical. 100 101 * Concurrency 102 103 Sequential network address resolution, given a work list: 104 105 .play ../2013/distsys/addr1.go /lookup/+1,/^}/-1 106 107 * Concurrency 108 109 Parallel network address resolution, given a work list: 110 111 .play ../2013/distsys/addr2.go /lookup/+1,/^}/-1 112 113 * Implementing Concurrency 114 115 Challenge: Make channel communication scale 116 117 - start with one global channel lock 118 - per-channel locks, locked in address order for multi-channel operations 119 120 Research question: lock-free channels? 121 122 * Polymorphism 123 124 * Interfaces 125 126 An interface defines a set of methods. 127 128 package io 129 130 type Writer interface { 131 Write(data []byte) (n int, err error) 132 } 133 134 * Interfaces 135 136 A type implements the interface by implementing the methods. 137 138 package bytes 139 140 type Buffer struct { 141 ... 142 } 143 144 func (b *Buffer) Write(data []byte) (n int, err error) { 145 ... 146 } 147 148 * Interfaces 149 150 An implementation of an interface can be assigned to a variable of that interface type. 151 152 package fmt 153 154 func Fprintf(w io.Writer, format string, args ...interface{}) 155 156 * Interfaces 157 158 .play ../2013/distsys/writebuffer.go /^func.main/+1,/^}/-1 159 160 * Interface Advantages 161 162 - no dependence between interface and implementation 163 - easy testing 164 - avoids overdesign, rigid hierarchy of inheritance-based OO 165 166 The source of all generality in the Go language. 167 168 * Implementing Interfaces 169 170 How do you make method dispatch efficient? 171 172 b := new(bytes.Buffer) 173 var w io.Writer 174 w = b 175 fmt.Fprintf(w, "hello, %s\n", "world") 176 ... w.Write(text) // what happens here? 177 178 At w.Write call, how does the runtime find the method to call? 179 180 * Implementing Interfaces 181 182 How do you make method dispatch efficient? 183 184 b := new(bytes.Buffer) 185 var w io.Writer 186 w = b // do the work here! 187 fmt.Fprintf(w, "hello, %s\n", "world") 188 ... w.Write(text) // plain indirect function call 189 190 Interface holds two words: "itable" and actual value (or pointer to value). 191 192 Itable contains type information plus list of function pointers for methods in interface. 193 194 w.itable.fn[1](w.data, text) 195 196 Conversion sites usually trivial to cache. 197 198 * Interfaces for Algorithms 199 200 package sort 201 202 type Interface interface { 203 Len() int // return number of elements, len(x) 204 Less(i, j int) bool // report whether x[i] < x[j] 205 Swap(i, j int) // x[i], x[j] = x[j], x[i] 206 } 207 208 func Sort(data Interface) 209 210 Requires some boilerplate for each use: 211 212 type bySubject []Thread 213 214 func (x bySubject) Less(i, j int) bool { return x[i].Subject < x[j].Subject } 215 func (x bySubject) Swap(i, j int) { x[i], x[j] = x[j], x[i] } 216 func (x bySubject) Len() int { return len(x) } 217 218 sort.Sort(bySubject(threads)) 219 220 * Polymorphism: Can we do better? 221 222 func Sort(data []T, less func(x, y *T) bool) 223 224 sort.Sort(threads, func(x, y *Thread) bool { 225 return x.Subject < y.Subject 226 }) 227 228 Research question: what's a reasonable semantics? 229 Research question: what's a reasonable implementation? 230 231 - C says don't bother. 232 - C++ makes many copies of the same function. 233 - Java boxes everything implicitly: one function, but expensive data model. 234 - Java discards run-time type information. 235 236 Do you want slow programmers, slow compilers and bloated binaries, or slow execution? 237 238 * Garbage Collection 239 240 * Garbage Collection 241 242 Garbage collection simplifies APIs. 243 244 - In C and C++, too much API design (and too much programming effort!) is about memory management. 245 246 Fundamental to concurrency: too hard to track ownership otherwise. 247 248 Fundamental to interfaces: memory management details do not bifurcate otherwise-similar APIs. 249 250 Of course, adds cost, latency, complexity in run time system. 251 252 * Avoiding Garbage Collection 253 254 Observation: garbage collection is a service, and like any service it can be overloaded, oversubscribed. 255 256 Go lets you limit allocation by controlling memory layout. 257 258 type Point struct { 259 X, Y int 260 } 261 262 type Rectangle struct { 263 Min, Max Point 264 } 265 266 * Implementing Garbage Collection 267 268 Language decision: interior pointers are allowed, as are foreign pointers 269 270 - Cannot reuse Java GC algorithms directly. 271 - But gives _programmer_ more control over allocation. 272 273 Allocator: objects are allocated in pages with other objects of the same size. 274 275 Current GC: stop the world, parallel mark, start the world, background sweep. 276 277 Research question: how to make collector lower latency, possibly incremental? 278 279 * Program Translation 280 281 * Program Translation 282 283 Go programs can be parsed without context (unlike C and C++). 284 Go ships with a standard program formatter. 285 286 Makes automated edits indistinguishable from manual edits. 287 288 $ cat x.go 289 package main 290 291 var b bytes.Buffer 292 293 $ gofmt -r 'bytes.Buffer -> bytes.Writer' x.go 294 package main 295 296 var b bytes.Writer 297 298 $ 299 300 More advanced rewrites: "go fix" for API adjustments. 301 302 * Program Translation 303 304 Research Question: What about translating other programs to Go? 305 306 Exploring the conversion of C programs to Go today. 307 308 - Decide return type (for example, int vs bool). 309 - Decide which variables are pointers vs arrays. 310 - Decide which functions are really methods. 311 - Decide natural package boundaries. 312 313 What about other languages? 314 315 * Research and Go 316 317 Plenty of research questions about how to implement Go well. 318 319 - Concurrency 320 - Polymorphism 321 - Garbage collection 322 - Program translation 323