github.com/graybobo/golang.org-package-offline-cache@v0.0.0-20200626051047-6608995c132f/x/talks/2014/compiling.slide (about) 1 Go: Easy to Read, Hard to Compile 2 Corner cases when compiling Go 3 4 Ian Lance Taylor 5 Google 6 iant@golang.org 7 8 * Introduction 9 10 - To really learn a language, write a compiler for it 11 - Compiler bugs imply language complexity 12 - Or, compiler bugs imply differences from C/C++ 13 - Sometimes simpler for users is harder for compilers 14 - Fortunately Go is much simpler to compile than C++ or even C 15 16 This talk is based on Go compiler bugs encountered over the years. 17 18 * Recursive Types 19 20 Names in Go packages are defined in the entire package, so Go types 21 can refer to themselves recursively. 22 23 .code compiling/rtype1.go /1 START OMIT/,/1 END OMIT/ 24 25 This is not permitted in C/C++, except for the special case of a 26 struct/union/class field which is a pointer/reference. 27 28 All Go compiler code that walks over types has to be careful to avoid 29 endless loops. 30 31 * Recursive Types 32 33 What good is a recursive pointer type? It can only be nil or a 34 pointer to itself. That's enough for Peano arithmetic. 35 36 .code compiling/rtype1.go /2 START OMIT/,/2 END OMIT/ 37 38 * Recursive Types 39 40 Actually, a recursive pointer can have a bit more information: it can 41 have a finalizer. 42 43 .play compiling/rtype1.go /3 START OMIT/,/3 END OMIT/ 44 45 * Recursive Types 46 47 Recursive function types are actually useful: they can implement a 48 state machine. 49 50 .code compiling/rtype2.go /1 START OMIT/,/1 END OMIT/ 51 52 * Recursive types 53 54 .play compiling/rtype2.go /2 START OMIT/,/2 END OMIT/ 55 56 * Recursive Types 57 58 Simple rule: all names at package scope are visible in the entire 59 package. 60 61 Complex consequence: compiler must handle recursive types (also 62 recursive initializers). 63 64 * Constants 65 66 Go has both typed and untyped constants. They follow the same rules, 67 except that a typed constant must be representable in its type. 68 69 This is reasonably clear for integers, less so for floats. 70 71 .play compiling/const1.go /1 START OMIT/,/1 END OMIT/ 72 73 * Constants 74 75 Go's floating point variables follow IEEE-754 rules. 76 77 Constants do not. 78 79 .play compiling/const2.go /1 START OMIT/,/1 END OMIT/ 80 81 * Constants 82 83 The special unsafe.Sizeof function returns a constant. 84 85 .play compiling/const3.go /1 START OMIT/,/1 END OMIT/ 86 87 * Constants 88 89 Simple rule: constants are untyped; they are mathematically exact and 90 do not require type conversions. 91 92 Complex consequence: exact floating point behavior depends on the 93 type. 94 95 * Name Lookup 96 97 Name lookup in a Go compiler is simple compared to many languages. 98 For every name the scope in which to look it up is obvious. This 99 makes parsing Go quite simple. 100 101 With one exception. What is the scope for i? 102 103 .code compiling/name1.go /1 START OMIT/,/1 END OMIT/ 104 105 * Name Lookup 106 107 One possibility. 108 109 .play compiling/name1.go /2 START OMIT/,/2 END OMIT/ 110 111 * Name Lookup 112 113 Another possibility. 114 115 .play compiling/name2.go /2 START OMIT/,/2 END OMIT/ 116 117 * Name Lookup 118 119 Simple rule: in a struct composite literal you can use field names as 120 keys. 121 122 Complex consequence: if you don't know the type of the composite 123 literal, the lookup scope of names used as keys is unclear when 124 parsing. 125 126 * Methods 127 128 Any named type can have methods. Any struct type can inherit methods 129 from an embedded field. It follows that you can sometimes call 130 methods on a variable even if it has an unnamed type. 131 132 .play compiling/var1.go /1 START OMIT/,/1 END OMIT/ 133 134 * Methods 135 136 Simple rules: named types can have methods; structs can have embedded 137 fields. 138 139 Complex consequence: unnamed types can have methods. 140 141 * Conclusion 142 143 - Go is simpler to compile than most languages 144 - There are still complexities for the compiler 145 - Most complexities stem from making Go easier to write