Slide 1

Slide 1 text

君の並行処理は 実行するまでもなく 間違っている チェシャ猫 (@y_taka_23) golang.tokyo #20 (2018/12/18) #golangtokyo

Slide 2

Slide 2 text

A Static Verification Framework for Message Passing in Go Using Behavioural Types J.Lange et al. (2018) #golangtokyo

Slide 3

Slide 3 text

並行処理、完璧に書ける人? #golangtokyo

Slide 4

Slide 4 text

#golangtokyo Development Unit / E2E Tests Operation

Slide 5

Slide 5 text

#golangtokyo Development Unit / E2E Tests Operation too hard...

Slide 6

Slide 6 text

#golangtokyo Development Unit / E2E Tests Operation too hard... Chaos Tests

Slide 7

Slide 7 text

#golangtokyo Development Unit / E2E Tests Operation Static Types! too hard... Chaos Tests

Slide 8

Slide 8 text

#golangtokyo func prod(ch chan int) { for i := 0; i < 5; i++ { ch <- 1 } close(ch) } func cons(ch1, ch2 chan int) { for { select { case x := <-ch1: fmt.Println(x) case x := <-ch2: fmt.Println(x) } } } func main() { ch1, ch2 := make(chan int), make(chan int) go prod(ch1) go prod(ch2) cons(ch1, ch2) } prod(ch chan int) {...} cons(ch1, ch2 chan int) {...} main(ch chan int) {...}

Slide 9

Slide 9 text

#golangtokyo func prod(ch chan int) { for i := 0; i < 5; i++ { ch <- 1 } close(ch) } func cons(ch1, ch2 chan int) { for { select { case x := <-ch1: fmt.Println(x) case x := <-ch2: fmt.Println(x) } } } func main() { ch1, ch2 := make(chan int), make(chan int) go prod(ch1) go prod(ch2) cons(ch1, ch1) }

Slide 10

Slide 10 text

#golangtokyo func prod(ch chan int) { for i := 0; i < 5; i++ { ch <- 1 } close(ch) } func cons(ch1, ch2 chan int) { for { select { case x := <-ch1: fmt.Println(x) case x := <-ch2: fmt.Println(x) } } } func main() { ch1, ch2 := make(chan int), make(chan int) go prod(ch1) go prod(ch2) cons(ch1, ch1) } prod(ch chan int) {...} cons(ch1, ch2 chan int) {...} main(ch chan int) {...}

Slide 11

Slide 11 text

普通の型では区別できない #golangtokyo

Slide 12

Slide 12 text

振る舞い型 Behavioural Types #golangtokyo

Slide 13

Slide 13 text

#golangtokyo

Slide 14

Slide 14 text

チャネル生成 #golangtokyo ch := make(chan int, 4)

Slide 15

Slide 15 text

送受信 #golangtokyo ch <- 42 / x:= <-ch

Slide 16

Slide 16 text

バッファリング #golangtokyo x y

Slide 17

Slide 17 text

逐次実行 #golangtokyo T S

Slide 18

Slide 18 text

内部選択 #golangtokyo T S if

Slide 19

Slide 19 text

外部選択 #golangtokyo T S select <-ch1 <-ch2

Slide 20

Slide 20 text

並行実行 #golangtokyo T S

Slide 21

Slide 21 text

#golangtokyo func prod(ch chan int) { for i := 0; i < 5; i++ { ch <- 1 } close(ch) } func cons(ch1, ch2 chan int) { for { select { case x := <-ch1: fmt.Println(x) case x := <-ch2: fmt.Println(x) } } } func main() { ch1, ch2 := make(chan int), make(chan int) go prod(ch1) go prod(ch2) cons(ch1, ch2) }

Slide 22

Slide 22 text

#golangtokyo func prod(ch chan int) { for i := 0; i < 5; i++ { ch <- 1 } close(ch) } func cons(ch1, ch2 chan int) { for { select { case x := <-ch1: fmt.Println(x) case x := <-ch2: fmt.Println(x) } } } func main() { ch1, ch2 := make(chan int), make(chan int) go prod(ch1) go prod(ch2) cons(ch1, ch2) }

Slide 23

Slide 23 text

#golangtokyo func prod(ch chan int) { for i := 0; i < 5; i++ { ch <- 1 } close(ch) } func cons(ch1, ch2 chan int) { for { select { case x := <-ch1: fmt.Println(x) case x := <-ch2: fmt.Println(x) } } } func main() { ch1, ch2 := make(chan int), make(chan int) go prod(ch1) go prod(ch2) cons(ch1, ch2) }

Slide 24

Slide 24 text

#golangtokyo func prod(ch chan int) { for i := 0; i < 5; i++ { ch <- 1 } close(ch) } func cons(ch1, ch2 chan int) { for { select { case x := <-ch1: fmt.Println(x) case x := <-ch2: fmt.Println(x) } } } func main() { ch1, ch2 := make(chan int), make(chan int) go prod(ch1) go prod(ch2) cons(ch1, ch2) }

Slide 25

Slide 25 text

#golangtokyo

Slide 26

Slide 26 text

#golangtokyo Labeled Trans. Sys. Go Source Code Termination Safety / Liveness Specification Modal µ-Calculi Behavioural Types mCRL2 KITTeL This Paper This Paper (By Hand)

Slide 27

Slide 27 text

検査できる性質の例 ● 無限ループが発生しない ● デッドロックが発生しない ● どの goroutine も飢餓状態にならない ● close 済みチャネルに送信しない ● チャネル内の値はいつか受信される #golangtokyo

Slide 28

Slide 28 text

まとめ ● 並行処理に特有の難しさ ○ 通常の単体テストによる保証が困難 ● 振る舞い型による抽象化 ○ チャネル通信に関わる性質のみに注目 ● 実行することなく性質を保証 ○ ラベル付き遷移系に変換して自動で検証 #golangtokyo

Slide 29

Slide 29 text

A Static Verification Framework for Message Passing in Go Using Behavioural Types J.Lange et al. (2018) #golangtokyo

Slide 30

Slide 30 text

Verify Behaviour in Go! Presented by チェシャ猫 (@y_taka_23) #golangtokyo