型安全性入門
- 3. LT のきっかけ
● 最近、「型安全」って単語をよく聞きます
○ Scala のライブラリとか type safe の謳い文句が多い
● それ、ほんとに型安全なの?
○ 安全って何?
○ ちゃんと証明したの?自明なの?
● 今日は静的型安全性の話をします
○ 「型安全性」をざっくり理解してもらうことが目的
○ 静的型付き言語を前提に話します
○ 厳密な話はしないので、興味のある人は後で聞いて下さい
- 10. 安全性(バグの定義)は言語による
● だいたい言語 (Java, Scala, Go, OCaml, Haskell, etc.)
○ メモリ安全とか null 安全が多い(と思う)
● より高度な言語や型システム (ATS, Coq, etc.)
○ 配列の境界検査
○ Termination check(反復・再帰が常に停止することを検査)
○ Dead-lock freedom(絶対にデッドロックしないことを検査)
○ など
● ライブラリが +α の安全性を提供することも
○ DB クエリ言語の実行時型エラーを防ぐ (Slick, Rogue)
○ 行列演算のサイズ検査
○ など
- 11. 型検査の恩恵が薄いことも
List x = null
x.add(42) // NullPointerException
● Java はメモリのアクセス違反は起こさない
● でも、コンパイル時には検出せず、実行時に例外を投げる
● Java は「実行時に補足されたエラーだから OK」というスタンス(たぶん)
○ C, C++ だと(言語レベルで補足されない)セグメンテーション違反を起こす
● いわゆる null 安全な言語は、この手のエラーを型検査で検出
- 14. 健全性と完全性
型安全性 (type safety), 健全性 (soundness)
● 「型が付くならば、ある種のバグは絶対にない」(偽陰性の排除)
● 「型エラーならば、バグがあるかもしれない」(偽陽性の許容)
○ バグがないのに、間違って型エラー出しちゃうかも
○ バグがあるのに型検査を通過させるリスクが大きい
完全性 (completeness)
● 「型エラーがあれば、バグが絶対にある」(偽陽性の排除)
● 健全かつ完全な型検査は難しい
○ チューリング完全な言語では決定不能問題