Slide 1

Slide 1 text

Go Ͱͭ͘Δ൚༻ݴޠॲཧܥ ࣮૷ઓུ General-purpose Programming Language implemented with Go @ Go Con 2017 Spring

Slide 2

Slide 2 text

@Linda_pp @rhysd

Slide 3

Slide 3 text

ΞδΣϯμ • ؔ਺ܕݴޠ GoCaml • GoCaml ͷ࣮૷ with Go&LLVM • Զݴޠͷ࣮૷ઓུ

Slide 4

Slide 4 text

ؔ਺ܕݴޠ GoCaml

Slide 5

Slide 5 text

GoCaml ͱ͸ • ϛχϚϧͳ OCaml ͷαϒηοτ • ࣮૷4000ߦఔ౓ • ੩తܕ෇͚ɼܕਪ࿦ • MinCaml (※) ͷ࣮૷ϕʔε • https://github.com/rhysd/gocaml ˞IUUQTHJUIVCDPNFTVNJJNJODBNM let rec gcd m n = if m = 0 then n else if m <= n then gcd m (n - m) else gcd n (m - n) in print_int (gcd 21600 337500)

Slide 6

Slide 6 text

GoCaml ͷจ๏ʢԋࢉʣ • ϓϩάϥϜ͸ʢunit ܕʹධՁ͞ΕΔʣ1ͭͷࣜ • γʔέϯεࣜɼ੔਺ԋࢉɼදࣔ (* GoCaml: e1; e2 *) 1; 2; 3; -(1 + 2) * 10; 3.14 *. 3.0 *. 3.0; print_bool true; () /* Go */ func main() { 1; 2; 3 -(1 + 2) * 10 3.14 * 3.0 * 3.0 fmt.Printf("%v", true) }

Slide 7

Slide 7 text

GoCaml ͷจ๏ʢม਺ʣ • ม਺ఆٛ (* GoCaml: let e1 in e2 *) let r = 9.0 in let pi = 3.14 in let area = r *. r *. pi in print_float area; (* ࠶ఆٛʢshadowingʣ ΋ OK *) let r = 4 in let area = r * r in print_int area /* Go */ func main() { r := 9.0 pi := 3.14 area := r * r * pi fmt.Print(area) { r := 4 area := r * r fmt.Print(area) } }

Slide 8

Slide 8 text

GoCaml ͷจ๏ʢؔ਺ʣ (* GoCaml *) (* ؔ਺ఆٛ & ద༻*) let rec squre x = x *. x in squre 3.0; (* Ϋϩʔδϟ *) let PI = 3.14 in let rec f d = PI *. d *. d in (* ؔ਺͸஋ͱͯ͠΋࢖͑Δ *) let rec compose f g = let rec h x = f (g x) in h in let f = compose squre squre in /* Go */ func squre(x float64) float64 { return x * x } func main() { squre(3.0) PI := 3.14 circle := func(d float64) float64 { return PI * d * d } type F func(f float64) float64 compose := func(f F, g F) F { return func(x float64) float64 { return g(f(x)) } } f := compose(squre, squre) }

Slide 9

Slide 9 text

GoCaml ͷจ๏ʢtuple, arrayʣ (* GoCaml *) let arr = Array.make 4 42 in print_int arr.(3) in arr.(3) <- 99; print_int arr.(3) let tpl = 1, true, "aaa" in let (i, b, s) = tpl in print_int i; print_int b; print_int s; /* Go */ func main() { arr := make([]int, 4) for i := range arr { arr[i] = 42 } fmt.Print(arr[3]) arr[3] = 99 fmt.Print(arr[3]) tpl := struct { i int b bool s string }{ 1, true, "aaa" } i, b, s := tpl.i, tpl.b, tpl.s fmt.Print(i) fmt.Print(b) fmt.Print(s) }

Slide 10

Slide 10 text

GoCaml ͷͦͷଞͷݴޠػೳ • C extension • GC (Boehm GC) • gdb ͰσόοάͰ͖Δ • ϦϙδτϦͷ examples σΟϨΫτϦʹ΋͏গ͠ෳ ࡶͳྫ͕͋Γ·͢ • brainfxxk, N-queens, Xorshift128+, …

Slide 11

Slide 11 text

GoCaml ͷ࣮૷ w/ Go & LLVM

Slide 12

Slide 12 text

ίϯύΠϥ࣮૷ͷجຊํ਑ ιʔείʔυจࣈྻ → ࣮ߦܗࣜόΠφϦ ΁ ͷม׵ ந৅౓ɿେ → খ Ұؾʹม׵͢Δͷ͸೉͍͠ͷͰɼঃʑʹந৅౓Λམͱͨ͠σʔλߏ଄Λఆٛ͠ɼ ঃʑʹந৅౓ΛԼ͍͛ͯ͘ ιʔείʔυ → ߏจ໦ → ܕ෇͖தؒදݱ → LLVM IR → ΞηϯϒϦ → ػցޠ

Slide 13

Slide 13 text

GoCaml ͷίϯύΠϥ࣮૷ ιʔε ίʔυ τʔΫ ϯྻ ந৅ߏ จ໦ தؒද ݱ --7. *3 Ξηϯ ϒϦ T ΦϒδΣ Ϋτ P ࣮ߦϑΝ Πϧ ϥϯλ ΠϜ P ϥϯλ ΠϜ D

Slide 14

Slide 14 text

GoCaml ͷίϯύΠϥ࣮૷ ιʔε ίʔυ τʔΫ ϯྻ ந৅ߏ จ໦ தؒද ݱ --7. *3 Ξηϯ ϒϦ T ΦϒδΣ Ϋτ P ࣮ߦϑΝ Πϧ ϥϯλ ΠϜ P ϥϯλ ΠϜ D (PͰࣗલ࣮૷ --7. $ίϯύΠϥ ϦϯΧ ࣈ۟ղੳ ߏจղੳ ͍Ζ͍Ζ

Slide 15

Slide 15 text

LLVM (http://llvm.org/) ͱ͸ • ίϯύΠϥͷόοΫΤϯυ෦෼ΛϞδϡʔϧԽͯ͠ఏ ڙ͢ΔϥΠϒϥϦ܈ • GoCaml Ͱ͸ LLVM IR ͱݺ͹ΕΔ LLVM ಠࣗͷதؒݴ ޠ͔Β࠷దԽ&ωΠςΟϒίʔυΛੜ੒͢Δͷʹ࢖͏ • ࣮૷͸ C++ Ͱ C ͔Β࢖͑Δ API ͱɼ֤ݴޠ͔Β࢖͑ ΔόΠϯσΟϯάʢެࣜʹ͸ Python, OCaml, Goʣ͕ ͋Δ

Slide 16

Slide 16 text

ࣈ۟ղੳ • ྫ͑͹ “let a = 42 in a + b” Λ “let”, “a”, “=“, “42”, “in”, “a”, “+”, “b” ʹ෼ ղ͢Δॲཧ • ݹయతʹɼจࣈྻΛ1จࣈͣͭݟ͍ͯͬͯରԠ͢ΔτʔΫϯΛੜ੒͢ Δ • Lexer ͸ Goroutine Ͱ࣮ߦ͞ΕɼτʔΫϯ͸ channel Λ௨ͯ͡ύʔα ʹૹΒΕΔ • Go ͷ text/template ͷ࣮૷Λࢀߟʹ • https://github.com/golang/go/blob/master/src/text/template/parse/lex.go ιʔε ίʔυ τʔΫ ϯྻ ࣈ۟ղੳ

Slide 17

Slide 17 text

ߏจղੳ • τʔΫϯྻ͔ΒϓϩάϥϜΛ໦ߏ଄Ͱද͢ந৅ߏจ໦ʹม׵͢Δ • Go ެࣜπʔϧͷ goyacc Λ࢖ͬͯ YACC ͰύʔαΛఆٛ͠ɼGo ͷίʔυΛੜ੒͢Δ • https://godoc.org/golang.org/x/tools/cmd/goyacc • YACC ͷจ๏ΛֶͿͷ͸ RHG ͷ͕͓͢͢Ί • http://i.loveruby.net/ja/rhg/book/yacc.html MFUBJOB MFUB JOU WBSB JOU τʔΫ ϯྻ ந৅ߏ จ໦ ߏจղੳ

Slide 18

Slide 18 text

ந৅ߏจٛͷఆٛ • ϊʔυͷΠϯλʔϑΣʔε Node ͱɼ֤ϊʔ υͷ۩ମతͳܕΛߏ଄ମͰఆٛ • go/ast ͱ΄΅ಉ͡ʢ https://golang.org/pkg/ go/ast/ ʣ

Slide 19

Slide 19 text

package main import ( "github.com/rhysd/gocaml/ast" "github.com/rhysd/gocaml/lexer" "github.com/rhysd/gocaml/token" "github.com/rhysd/gocaml/parser" ) func (c *Compiler) Parse(src *Source) (*ast.AST, error) { // ࣈ۟ղੳΛߦ͏ Lexer ͷΠϯελϯε l := lexer.NewLexer(src) // Τϥʔϋϯυϥ l.Error = func(msg string, pos token.Position) { panic("error") } // Goroutine Λ࢖࣮ͬͯߦɼl.Tokens channel ʹτʔΫϯ͕ૹΒΕͯ͘Δ go l.Lex() // ύʔα͸ channel ͝͠ʹτʔΫϯΛड͚औͬͯߏจ໦Λͭ͘Δ ast, err := parser.Parse(l.Tokens) if err != nil { return nil, err } return ast, nil }

Slide 20

Slide 20 text

தؒදݱ΁ͷม׵ • ͕͜͜ࠓճͷ࣮૷ͷதͰ͸Ұ൪ॏ͍ • ߏจ໦͔Βதؒݴޠ΁ͷม׵͸Ϊϟοϓ͕େ ͖͍ͷͰঃʑʹந৅౓Λམͱ͍ͯ͘͠ BEGIN: program a$t1 = int 42 ; type=int $k4 = int 10 ; type=int $k5 = binary + a$t1 $k4 ; type=int $k6 = appx print_int $k5 ; type=() END: program ந৅ߏ จ໦ தؒද ݱ ͍Ζ͍Ζ MFUB JOU WBSB JOU

Slide 21

Slide 21 text

தؒදݱ΁ͷม׵ ߏจ໦ Ћม׵ ܕਪ࿦ ʢܕνΣοΫʣ தؒදݱ΁ͷϑΥʔ Ϛοτม׵ Ϋϩʔδϟ ม׵ ந৅ߏ จ໦ தؒද ݱ

Slide 22

Slide 22 text

ߏจ໦ΛᢞΊΔʢvisitorʣ • ߏจ໦ͷ֤ϊʔυΛ८ΔͨΊʹ visitor ύλʔϯΛ࢖͏ ʢਂ͞༏ઌʣ • visit ͷڍಈΛ੍ޚͰ͖ΔΑ͏ʹ͢Δʢvisit Λଧͪ੾Δ ͳͲʣ • ܕਪ࿦΍ߏจ໦ͷղੳɼҙຯνΣοΫɼதؒݴޠ΁ͷ ม׵͸͜ΕΛ༻͍Δ • go/ast ͷ ast.Visit ͱಉ͡

Slide 23

Slide 23 text

ߏจ໦ΛᢞΊΔʢvisitorʣ // Visitor ͷΠϯλʔϑΣʔεɽ͜ΕΛ࣮૷ͨ͠ܕ͸ߏจ໦Λ traverse Ͱ͖Δ type Visitor interface { // ߏจ໦ͷϊʔυΛड͚औͬͯʮࢠͷ visit ʹ࢖͏ visitorʯΛ໭Γ஋Ͱฦ͢ // nil ͳΒͦ͜Ͱ visit ऴྃ Visit(n Node) Visitor } // Visitor Λߏจ໦ʹద༻ func Visit(v Visitor, n Node) { if v = v.Visit(n); v == nil { return } // ࢠʹ࠶ؼతʹద༻ switch n := n.(type) { case *Add: // ଍͠ࢉϊʔυͷͱ͖ Visit(v, n.Left) Visit(v, n.Right) case *If: // ... // શͯͷࢠ͕͋ΔϊʔυͷࢠΛ visit } }

Slide 24

Slide 24 text

αม׵ ֤γϯϘϧʢ֎෦γϯϘϧҎ֎ʣʹ ID Λৼͬ ͯม਺໊ΛҰҙʹ͢Δɽ͜ΕͰείʔϓΛج ຊతʹؾʹ͠ͳͯ͘ྑ͘ͳΔ ߏจ໦ Ћม׵ // Go ٖࣅίʔυ func do_something () { x := 42 y := "aaa" { x := true } } // Go ٖࣅίʔυ func do_something$1 () { x$2 := 42 y$3 := "aaa" x$4 := true }

Slide 25

Slide 25 text

ܕਪ࿦ • γϯϓϧͳ Hindley-Mlner ܕਪ࿦ΞϧΰϦζϜ • ߏจ໦ͷ֤ϊʔυʹܕΛ͚͍ͭͯ͘ • visit ͨ࣌͠఺Ͱܕ͕ෆ໌ͳͱ͜Ζ͸ܕม਺Λಋೖ͠ɼʮݱ࣌఺Ͱ͸ෆ໌ʯͱͯ͠ ͓͘ɽ࠷ऴతʹͦͷม਺ͷ஋͕෼͔Ε͹ OKɽ • ܕม਺ʹ͍ͭͯͷ࿈ཱํఔࣜΛཱͯͯͦΕΛղ͘ײ͡ʢʮղ͘ʯॲཧΛ unification ͱ͍͏ʣ • ྫ͑͹഑ྻΞΫηε e1.(e2) Ͱ͋Ε͹ e1 ͷܕ͸഑ྻʢཁૉܕͷܕ͸ෆ໌ʣɼ e2 ͷܕ͸ intɼධՁ݁Ռ͸ e1 ͷཁૉܕʢ͜ͷ࣌఺Ͱ͸۩ମతʹͦΕ͕Կ͔͸ ෼͔Βͳ͍ʣͱ͍ͬͨ͜ͱ͕෼͔ΔͷͰɼͦΕΛίʔυʹམͱ͍ͯ͘͠ Ћม׵ ܕਪ࿦ ʢܕνΣοΫʣ

Slide 26

Slide 26 text

// Go ٖࣅίʔυ func lessFirst(a, b) { x := a[0] y := b[0] return x < y } func main() { p := []int{1} lessFirst(p, p) } • lessFirst : ? -> ? -> ?

Slide 27

Slide 27 text

• lessFirst : (? array) -> ? -> ? • x : ? // Go ٖࣅίʔυ func lessFirst(a, b) { x := a[0] y := b[0] return x < y } func main() { p := []int{1} lessFirst(p, p) }

Slide 28

Slide 28 text

• lessFirst : (? array) -> (? array) -> ? • x : ? • y : ? // Go ٖࣅίʔυ func lessFirst(a, b) { x := a[0] y := b[0] return x < y } func main() { p := []int{1} lessFirst(p, p) }

Slide 29

Slide 29 text

• lessFirst : (? array) -> (? array) -> bool • x : int ͔ bool ͔ float • y : int ͔ bool ͔ float // Go ٖࣅίʔυ func lessFirst(a, b) { x := a[0] y := b[0] return x < y } func main() { p := []int{1} lessFirst(p, p) }

Slide 30

Slide 30 text

• lessFirst : (? array) -> (? array) -> bool • x : int ͔ bool ͔ float • y : int ͔ bool ͔ float • main : () -> ? • p : (int array) // Go ٖࣅίʔυ func lessFirst(a, b) { x := a[0] y := b[0] return x < y } func main() { p := []int{1} lessFirst(p, p) }

Slide 31

Slide 31 text

• lessFirst : (int array) -> (int array) -> bool • x : int ͔ bool ͔ float • y : int ͔ bool ͔ float • main : () -> () • p : (int array) // Go ٖࣅίʔυ func lessFirst(a, b) { x := a[0] y := b[0] return x < y } func main() { p := []int{1} lessFirst(p, p) }

Slide 32

Slide 32 text

ܕਪ࿦ͷϝϦοτɾσϝϦοτ • ܕ͕߹Θͳ͍ or ܕม਺͕࢒ͬͯ͠·ͬͨ࣌͸ Τϥʔʹͳ Δ • ܕਪ࿦ʹΑΓɼܕΛҰ੾ॻ͔ͳͯ͘ྑ͍ʢෳࡶͳؔ਺ͷγ άωνϟͳͲʣ • ܕ͕߹Θͳ͍Τϥʔ͕ग़ͨͱ͖ʹਓؒʹͱͬͯΘ͔ΓͮΒ ͍ • ࠶ؼతͳܕʢؔ਺ͷҾ਺ʹͦͷؔ਺ࣗ਎Λ༩͑ͨ࣌ͳͲʣ ͕ਪ࿦Ͱ͖ͳ͍ͷͰ޻෉͕ඞཁ

Slide 33

Slide 33 text

தؒදݱͷఆٛ ܕਪ࿦ ʢܕνΣοΫʣ தؒදݱ΁ͷϑΥʔ Ϛοτม׵ CJOU C JG # # C C BQIJ# # B BQQQSJOU@JOU let b = 1 in let a = if b > 0 then b + 10 - 4 else b - 10 in print_int (a * 2) # # # #

Slide 34

Slide 34 text

தؒදݱͷఆٛ ܕਪ࿦ ʢܕνΣοΫʣ தؒදݱ΁ͷϑΥʔ Ϛοτม׵ CJOU C JG # # C C BQIJ# # B BQQQSJOU@JOU • ໋ྩ • {register} = rhs • Ϩδελ΁ͷ୅ೖ͸Ұ౓ ͖ΓʢSingle Static Assignmentʣ • ӈลʹ͸1ͭͷૢ࡞ͷΈ ͕هड़Ͱ͖Δʢਖ਼نܗʣ # # # #

Slide 35

Slide 35 text

தؒදݱͷఆٛ ܕਪ࿦ ʢܕνΣοΫʣ தؒදݱ΁ͷϑΥʔ Ϛοτม׵ CJOU C JG # # C C BQIJ# # B BQQQSJOU@JOU • جຊϒϩοΫ • ໋ྩྻΛ૒ํ޲Ϧε τͱͯ࣋ͭ͠ • ଞͷϒϩοΫͱ༗޲ ඇ८ճάϥϑ (DAG) Ͱͭͳ͕Δ # # # #

Slide 36

Slide 36 text

• Visitor Ͱߏจ໦ΛḷΓͳ͕Β໋ྩྻΛϊʔυ ͝ͱʹ࡞੒͍ͯ͘͠ • if ࣜͰͷ෼ذ΍ؔ਺ͷຊମͳͲͰ৽͍͠ϒϩο ΫΛͭ͘Δ தؒදݱϑΥʔϚοτ ΁ม׵ ܕਪ࿦ ʢܕνΣοΫʣ தؒදݱ΁ͷϑΥʔ Ϛοτม׵

Slide 37

Slide 37 text

Ϋϩʔδϟม׵ • தؒදݱʹม׵ͨ͠௚ޙͰ͸·ͩؔ਺ఆٛࣜ ͕ωετ͍ͯ͠Δ͕ɼLLVM IR ΍ΞηϯϒϦ ͸ؔ਺Λ΋ͪΖΜωετͰ͖ͳ͍ • ωετͨؔ͠਺ΛτοϓϨϕϧʹҠಈ͢Δॲ ཧ͕ඞཁ → Ϋϩʔδϟม׵ • ࣮͸Ұ൪େม தؒදݱ΁ͷϑΥʔ Ϛοτม׵ Ϋϩʔδϟ ม׵

Slide 38

Slide 38 text

Ϋϩʔδϟม׵ தؒදݱ΁ͷϑΥʔ Ϛοτม׵ Ϋϩʔδϟ ม׵ // Go ٖࣅίʔυ func main() { func square(x int) int { return x * x } square(10) } // ! square ΛτοϓϨϕϧʹҠಈ͢Δͷ͸؆୯ func square(x int) int { return x * x } func main() { square(10) }

Slide 39

Slide 39 text

Ϋϩʔδϟม׵ தؒදݱ΁ͷϑΥʔ Ϛοτม׵ Ϋϩʔδϟ ม׵ // Go ٖࣅίʔυ func main() { PI := 3.14 func circle(x float64) float64 { return x * x * PI } circle(3.0) } // ! ΫϩʔδϟͩͱͲ͏ͳΔʁ // PI ΛͲ͏ʹ͔఻ୡ͢Δඞཁ͕͋Δ func circle(x float64) float64 { return x * x * PI } func main() { PI := 3.14 circle(3.0) }

Slide 40

Slide 40 text

Ϋϩʔδϟม׵ தؒදݱ΁ͷϑΥʔ Ϛοτม׵ Ϋϩʔδϟ ม׵ // Go ٖࣅίʔυ func main() { PI := 3.14 func circle(x float64) float64 { return x * x * PI } circle(3.0) } // ! ؔ਺಺ʹΩϟϓνϟ͞ΕΔ஋ΛӅΕҾ਺ͱͯ͠౉͢ඞཁ͕͋Δ type Captures struct { PI float64 } func circle(cap Captures, x float64) float64 { PI := cap.PI return x * x * PI } func main() { PI := 3.14 circle(Captures{PI}, 3.0) }

Slide 41

Slide 41 text

• ໋ྩྻΛḷΓɼ࠶ؼతʹؔ਺ఆ͕ٛΩϟϓνϟʢ=ࣗ༝ม਺ʣΛ࣋ͭ ͔ௐ΂Δ • Ωϟϓνϟ͕͋Ε͹ͦͷؔ਺͸Ϋϩʔδϟͱͯ͠ݺͼग़͠ݩͰΩϟϓ νϟΦϒδΣΫτΛ࡞੒ • ݺͼग़ͨؔ͠਺͕͢ͰʹΫϩʔδϟͰͳ͍ͱ෼͔͍ͬͯΔؔ਺͸Ωϟ ϓνϟΦϒδΣΫτΛ࡞੒͠ͳ͍Α͏ʹ͢ΔʢKnown Function Optimizationʣ • ۩ମతͳ࣮૷ͱͯ͠͸ɼ͋Δؔ਺͕͋ͬͨͱ͖ʹ·ͣ͸ͦͷؔ਺͕ Known Ͱ͋ΔͱԾఆͯ͠ body Λ࠶ؼతʹḷΓɼ΋͠Ωϟϓνϟ͕ݟ͔ͭΕ͹લఏ͕ؒҧ͍ͬͯͨͷͰঢ়ଶΛ໭ͯ͠࠶౓ḷΓ௚͢ Ϋϩʔδϟม׵ தؒදݱ΁ͷϑΥʔ Ϛοτม׵ Ϋϩʔδϟ ม׵

Slide 42

Slide 42 text

LLVM IR ͷੜ੒ தؒද ݱ --7. *3 • LLVM ͷ Go binding ϥΠϒϥϦΛ࢖ͬͯதؒදݱ͔Β LLVM IR Λੜ੒͢ΔɽجຊϒϩοΫͷதͷ໋ྩྻΛḷΓɼର Ԡ͢Δ LLVM IR ͷ໋ྩΛ llvm.IRBuilder Λ࢖ͬͯੜ੒͍ͯ͠ ͘ • ͍ͭͰʹ LLVM IR ϨϕϧͰͷ࠷దԽ΋૸ΒͤΔɽΠϯϥΠ ϯԽ΍ෆཁίʔυͷআڈͳͲ͔ͳΓͷ࠷దԽΛͯ͘͠ΕΔ • ຊ౰͸࠷దԽͱίʔυੜ੒͕Ұ൪ॏ͍ͱ͜Ζ͕ͩɼ͋Δఔ ౓ LLVM ʹ೚ͤΒΕΔ

Slide 43

Slide 43 text

LLVM IR ͷֶश • LLVM C ͷ Go binding ʹ͍ͭͯ஌Δʹ͸ • LLVM ΛόοΫΤϯυͱͨ͠ Go ίϯύΠϥ LLGO ͕ࢀߟʹͳΔɽgo/* Λ࢖ͬ ͯதؒදݱΛߏங͠ɼGo binding ͰόΠφϦʹམͱ͍ͯ͠ΔɽJIT Λ࢖ͬͨ REPL ΋͋Δ • https://godoc.org/llvm.org/llvm/bindings/go/llvmʢLLVM ຊՈͷ Doxygen ʹൺ΂ͯʣ͔ͳΓಡΈ΍͍͢ɽ͕ɼࡌͬͯͳ͍΋ͷ΋͋ΔͷͰ஫ҙ • LLVM IR ʹ͍ͭͯ஌Δʹ͸ • Clang ͷు͘ IR ΛோΊΔ: `clang -S -emit-llvm` • ϦϑΝϨϯεϚχϡΞϧΛಡΉ http://llvm.org/docs/LangRef.html

Slide 44

Slide 44 text

Go Ͱॻ͍ͯΈͨײ૝ • ࢥͬͨ΄Ͳॻ͖ʹ͘͘ͳ͍ɽଟগίϐϖతίʔυͰ΋ Go ͔ͩΒ…ͱ ཧੑΛࣺͯͯॻ͚Δʢ࣮૷ߦͰݟͯ΋ OCaml ͷ2ഒఔ౓ʣ • ֤ϑΣʔζͰ͔ͬ͠ΓςετΛॻ͍͍ͯ͘ͷ͕ॏཁͳͷͰɼGo ͷς ετจԽ͸ྑ͍ • ஈ֊తʹม׵͍֤ͯ͘͠ϑΣʔζΛผύοέʔδʹ͢Δ͜ͱͰ͏͔ͬ Γ૬ޓࢀরͯ͠͠·͏ͷΛ๷͛Δ • ύʔαδΣωϨʔλ΍ LLVM ͷαϙʔτ͕ެࣜͰఏڙ͞Ε͍͍ͯͯΔ • Ӭଓతσʔλߏ଄͕ແ͍ͷͰɼ࠶ؼతʹ visit ͯ͠ undo ͢ΔΈ͍ͨͳ ॲཧ͕ॻ͖ʹ͍͘

Slide 45

Slide 45 text

Զݴޠͷ࣮૷ઓུ

Slide 46

Slide 46 text

GoCaml ࣮૷ͷܦҢ Ҏલ C++ ͰίϯύΠϥΛॻ͍͍͕ͯͨ಴࠳ͯ͠͠·ͬͨ https://github.com/rhysd/Dachs ݪҼ͸ 1. ߏจ໦͔ΒҰؾʹ IR ʹམͱͦ͏ͱͯ͠ม׵ॲཧ͕ෳࡶʹͳ Γ͗ͨ͢ 2. ߏจ౶ҥͳͲɼ࠷ॳ͔ΒػೳΛ੝Γ͗ͨ͢ 3. Ϗϧυ͕஗͍ʢ4෼Ҏ্ʣ

Slide 47

Slide 47 text

ԶݴޠʢDachsʣΛ෮׆ͤ͞Δ 1. தؒݴޠΛಋೖͨ͠ίϯύΠϥΛॻ͍ͯΈΔʢGoCamlʣ 2. GoCam ͷίʔυϕʔεΛͳΔ΂͘ྲྀ༻͠ͳ͕ΒϛχϚϧͳݴޠͱ ͯ͠ Dachs Λͭ͘ΔʢجຊܕɼϙΠϯλͷ௿ڃͳૢ࡞΍ߏ଄ମఆ ٛɼC ֦ுͳͲʣ 3. ഑ྻ΍ϋογϡͳͲͷجຊతͳσʔλߏ଄͸ Dachs ͷϥΠϒϥϦ ͱͯ͠ॻ͘ 4. ηϧϑϗετ͢Δ 5. ΑΓෳࡶͳݴޠػೳΛ࣮૷͍ͯ͘͠

Slide 48

Slide 48 text

͋ΔݴޠͰͦͷݴޠͷॲཧܥΛ࣮૷ ͢Δʢηϧϑϗετʣͷར఺ͱܽ఺ • υοάϑʔσΟϯά • ૣظ͔Βࣗ෼͕࢖͍͍ͨݴޠΛࣗ෼Ͱͭͬͯࣗ͘෼Ͱ࢖͑Δ • શͯࣗલͰ࣮૷͠ͳ͚Ε͹ͳΒͳ͍ʢςετϑϨʔϜϫʔΫɼσ όοΨͳͲʣ • όά͕ग़ͨ࣌ͷσόοά͕೉͘͠ͳΔ͔΋ʢͦͷίʔυʹ͋Δͷ ͔ɼͦͷίʔυΛίϯύΠϧͨ͠ίϯύΠϥͷίʔυʹ͋Δͷ͔ɼͦ ͷίʔυΛίϯύΠϧͨ͠ίϯύΠϥͷίʔυΛίϯύΠϧͨ͠ίʔ υʹ͋Δͷ͔…ʣ • جຊతʹ͸ 1ͭ໨ͱ2ͭ໨ͷར఺͕࠷ߴͳͷͰηϧϑϗετ͍ͨ͠

Slide 49

Slide 49 text

Go Ͱηϧϑϗετ͢ΔίϯύΠ ϥΛॻ͘ར఺ • ηϧϑϗετ͢Δࡍ͸طଘͷ࣮૷ΛϗετݴޠΛࣗ ෼ࣗ਎Ͱஔ͖׵͍͑ͯ͘ • ڧྗͳݴޠػೳ/ϥΠϒϥϦ͕࢖͑ΔϗετݴޠͰ ࠷ॳʹ࣮૷͢Δͱɼஔ͖׵͑Δͷ͕೉͘͠ͳΔ͸ͣ • Go ͸ඇৗʹ؆ૉͳݴޠ࢓༷Λ͍࣋ͬͯΔͷͰɼη ϧϑϗετ͢Δࡍʹݴޠͷஔ͖׵ָ͕͑ʹͳΓͦ͏

Slide 50

Slide 50 text

·ͱΊ • ίϯύΠϥ͸ஈ֊తͳσʔλͷม׵Ͱ͋Δ • Go ͱ LLVM ͰίϯύΠϥΛॻ͍ͯΈͨݶΓͰ ͸ॻ͖΍͘͢ɼґଘ΋গͳ͘Ͱ͖ͦ͏ • ૣظʹηϧϑϗετ͢Δʹ͸ɼίϯύΠϥͷ ॳظ࣮૷͸ Go Ͱॻ͍͓ͯ͘ͱྑͦ͞͏ʢ͜ Ε͔Βʣ

Slide 51

Slide 51 text

ʢऄ଍ʣൃදऀ঺հ • C++, Ruby, TypeScript, Vim script • C++ ͰίϯύΠϥΛॻ͍͍ͯͨΓɼCrystal ͷॲཧܥΛ͍ͬͯ͡ΈͨΓ • Electron + TypeScript + React ͰσεΫτοϓΞϓϦΛॻ͍ͨΓ • Vim ϓϥάΠϯΛ60ݸ͙Β͍ॻ͍ͯͨΓ • ࠷ۙ͸ Go ͰίϯύΠϥΛॻ͍ͨΓͯ͠·͢ • ιϑτ΢ΣΞΛͭ͘Δͷָ͕͍͠ @Linda_pp @rhysd