Upgrade to Pro — share decks privately, control downloads, hide ads and more …

「型安全」って、どういう意味?

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
Avatar for こと こと
July 12, 2024
650

 「型安全」って、どういう意味?

Avatar for こと

こと

July 12, 2024
Tweet

Transcript

  1. クイズ ヘンな事を言っているのはどれ?? 型安全性はコンパイル言語の特徴で、C言語、Java、Rustなどのコンパイル言語は型安全だ。 TypeScriptを使っていても、 any や as を多用すると型安全が損なわれる。 例外をthrowするのは型安全ではないので、 Option

    型や Result 型を使って何らかの値をreturnしよう。 PHPやPythonは動的言語なので型安全ではない。 今日のゴール=これらがなぜヘンなのかを理解する! •◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦ こと@HACK.BAR 「型安全」ってどういう意味? 2 / 30 Hackers' MeetUp #1 - 2024/07/13
  2. プログラミング言語の構成要素 プログラミング言語 = 構文 + 意味論 構文(Syntax) … プログラムが「どんな形(見た目)をしているか」を規定する 意味論(Semantics)

    … プログラムが「どのように振る舞うか」を規定する ◦◦•◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦ こと@HACK.BAR 「型安全」ってどういう意味? 4 / 30 Hackers' MeetUp #1 - 2024/07/13
  3. Boolean true, false のいずれかの値を持つ。 if-then-else式(a.k.a. 三項演算子)とともに使う if true then false

    else true ◦◦◦•◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦ こと@HACK.BAR 「型安全」ってどういう意味? 5 / 30 Hackers' MeetUp #1 - 2024/07/13
  4. 自然数 以下の生成規則で作られる数 自然数の生成規則 特別な数 Zero が存在する 任意の自然数 n について、その 次の自然数(successor)

    を与える演算 Succ が存在する 自然数の例:               Zero ... 0            Succ(Zero) ... 1         Succ(Succ(Zero)) ... 2      Succ(Succ(Succ(Zero))) ... 3   Succ(Succ(Succ(Succ(Zero)))) ... 4 ◦◦◦◦•◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦ こと@HACK.BAR 「型安全」ってどういう意味? 6 / 30 Hackers' MeetUp #1 - 2024/07/13
  5. 自然数を扱う操作 Pred Succの逆で、1個前の自然数を返す Pred Zero = Zero と約束する isZero 自然数から

    Bool への関数で、以下のように自然と定義される isZero Zero = true isZero (Succ n) = false ◦◦◦◦◦•◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦ こと@HACK.BAR 「型安全」ってどういう意味? 7 / 30 Hackers' MeetUp #1 - 2024/07/13
  6. 本セッションで扱う言語のSyntaxのまとめ 型 (types) Bool ... booleanの型 Nat ... 自然数の型 項

    (terms) true false zero succ t pred t isZero t if t then t else t 上記で、 t は何らかの項を表すものです(メタ変数といいます) たとえば、 succ t 自体がプログラムになるのではなく、 t を何らかのプログラムで置換した、 succ true や succ isZero false などが有効なプログラムになります。 ◦◦◦◦◦◦•◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦ こと@HACK.BAR 「型安全」ってどういう意味? 8 / 30 Hackers' MeetUp #1 - 2024/07/13
  7. Semantics 意味論 = プログラムが「どのように振る舞うか」を規定する 「振る舞い」には、様々な種類のものが存在します 本セッションで重要なのは、以下の2つです 評価(Evaluation) … プログラムが「どのように別のプログラムに置換されるか?」 型付(Typing)

    … プログラムが「どのような型を持つか?」 ◦◦◦◦◦◦◦•◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦ こと@HACK.BAR 「型安全」ってどういう意味? 9 / 30 Hackers' MeetUp #1 - 2024/07/13
  8. 評価 評価(Evaluation) … プログラムが「どのように別のプログラムに置換されるか?」 項 t が 項 t' に置換されることを

    「 t は t' に評価される」と表現し、 t --> t' と書きます。 項 t が 部分項 t1 , t2 , …を持つ項で、 「部分項 t1 が t1' に評価されるという前提のもとで t が t' に評価されること」を t1 --> t1' --------- t --> t' と書きます。 具体的には、いくつかの 評価規則(Evaluation Rules) を与えることで評価のsemanticsが決まる ◦◦◦◦◦◦◦◦•◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦ こと@HACK.BAR 「型安全」ってどういう意味? 10 / 30 Hackers' MeetUp #1 - 2024/07/13
  9. Succ, Predの評価規則 E-Succ    t --> t' ------------------ succ t -->

    succ t' E-PredZero pred zero --> zero E-PredSucc pred (succ nv) --> nv ここに、 nv は 数値( true , false でない値)を表すメタ変数とする。 zero , succ zero , succ (succ zero) , … など。 ◦◦◦◦◦◦◦◦◦•◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦ こと@HACK.BAR 「型安全」ってどういう意味? 11 / 30 Hackers' MeetUp #1 - 2024/07/13
  10. isZeroの評価規則 E-IsZeroZero isZero zero --> true E-IsZeroSucc isZero (succ nv)

    --> false E-IsZero t --> t' ----------------------- isZero t --> isZero t' ◦◦◦◦◦◦◦◦◦◦•◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦ こと@HACK.BAR 「型安全」ってどういう意味? 12 / 30 Hackers' MeetUp #1 - 2024/07/13
  11. If-then-elseの評価規則 E-IfTrue if true then t2 else t3 --> t2

    E-IfFalse if false then t2 else t3 --> t3 E-If t1 --> t1' ------------------------------------------------ if t1 then t2 else t3 --> if t1' then t2 else t3 ◦◦◦◦◦◦◦◦◦◦◦•◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦ こと@HACK.BAR 「型安全」ってどういう意味? 13 / 30 Hackers' MeetUp #1 - 2024/07/13
  12. 評価の結果 is 何? プログラムを評価した結果、得られるもの=「値」 値を、特別な項として定義する場合と、項とは別なものとして定義する場合があります 今回は、より単純な前者の立場を取ります → 以下の特別な項を値とみなすことにする: true false

    zero succ nv Recall: nv は数の値を表すメタ変数. ◦◦◦◦◦◦◦◦◦◦◦◦•◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦ こと@HACK.BAR 「型安全」ってどういう意味? 14 / 30 Hackers' MeetUp #1 - 2024/07/13
  13. 評価の例 与えられたプログラムの形に注目し、適用可能な評価規則を繰り返し適用していく succ (if (isZero zero) then zero else true)

    ---> succ (if true then zero else true) ... E-IsZeroZero ---> succ zero ... E-IfTrue 評価の結果として、値 succ zero が取り出された。 ◦◦◦◦◦◦◦◦◦◦◦◦◦•◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦ こと@HACK.BAR 「型安全」ってどういう意味? 15 / 30 Hackers' MeetUp #1 - 2024/07/13
  14. それ以上評価できないプログラム 元のプログラムによっては、値でないもので評価がストップする場合もある succ (if (isZero (succ zero)) then zero else

    true) ---> succ (if false then zero else true) ... E-IsZeroSucc ---> succ true ... E-IfFalse -/-> ... どの評価規則も適用できない! このようなプログラムは、実行時におけるエラーを呈するとみなすことができる ◦◦◦◦◦◦◦◦◦◦◦◦◦◦•◦◦◦◦◦◦◦◦◦◦◦◦◦◦ こと@HACK.BAR 「型安全」ってどういう意味? 16 / 30 Hackers' MeetUp #1 - 2024/07/13
  15. 型付 型付(Typing) = 「項 t と 型 T の関係」 以下の形式で与えられる

    t : T ... "項tは型Tを持つ" 具体的には、いくつかの 型付規則(Typing Rules) によって構成的に定義される。 ◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦•◦◦◦◦◦◦◦◦◦◦◦◦◦ こと@HACK.BAR 「型安全」ってどういう意味? 17 / 30 Hackers' MeetUp #1 - 2024/07/13
  16. 型付規則(1) … booleanとIf-then-else T-True true : Bool T-False false :

    Bool T-If t1 : Bool t2 : T t3 : T ------------------------- if t1 then t2 else t3 : T ◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦•◦◦◦◦◦◦◦◦◦◦◦◦ こと@HACK.BAR 「型安全」ってどういう意味? 18 / 30 Hackers' MeetUp #1 - 2024/07/13
  17. 型付規則(2) … 自然数 T-Zero zero : Nat T-Succ & T-Pred

    t : Nat t : Nat ------------ ------------ succ t : Nat pred t : Nat T-IsZero t : Nat --------------- isZero t : Bool ◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦•◦◦◦◦◦◦◦◦◦◦◦ こと@HACK.BAR 「型安全」ってどういう意味? 19 / 30 Hackers' MeetUp #1 - 2024/07/13
  18. 型チェック 型チェック (Type-checking) とは、与えられたプログラム断片に対して適当な型付規則を再帰的に適用することで、 プログラム全体の型を決定する手続きのことをいう。 たとえば、 succ (if (isZero zero)

    then zero else succ zero) の型チェックは以下のようになる: ----------- T-Zero ------------- T-Zero zero : Nat zero : Nat ------------------ T-IsZero ----------- T-Zero ----------------- T-Succ isZero zero : Bool zero : Nat succ zero : Nat ------------------------------------------------------------------------------ T-If if (isZero zero) then zero else succ zero : Nat --------------------------------------------------------- T-Succ succ (if (isZero zero) then zero else succ zero) : Nat プログラム断片の全体として型が定まる = 型導出木(Typing derivation tree) を書くことができる = well-typedなプログラム well-typedでないプログラム = ill-typed ◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦•◦◦◦◦◦◦◦◦◦◦ こと@HACK.BAR 「型安全」ってどういう意味? 20 / 30 Hackers' MeetUp #1 - 2024/07/13
  19. 進行定理 Progress Theorem 任意の項 t について、 t がwell-typedであるならば、以下のいずれかが成り立つ: t は値である

    t は評価可能な項である: 適当な項 t' があって、 t --> t' と評価される。 つまり、 「well-typedなプログラムは、それが値でない限り、何らかの評価規則があてはまる」 ということ!  … 前のページで書いた「型安全性(ざっくり版) 」の正確な表現。 ◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦•◦◦◦◦◦◦◦ こと@HACK.BAR 「型安全」ってどういう意味? 23 / 30 Hackers' MeetUp #1 - 2024/07/13
  20. 保存定理 Preservation Theorem t をwell-typedな項として、 t : T と型付けられるとする。 このとき、

    t が t --> t' と進行できる項であるならば、 t' : T である。 つまり 「well-typedな項は、適当な評価規則をあてはめてプログラムを置換しても全体の型が保たれる」 ということ! ◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦•◦◦◦◦◦◦ こと@HACK.BAR 「型安全」ってどういう意味? 24 / 30 Hackers' MeetUp #1 - 2024/07/13
  21. まとめ 「型安全である/ない」というのは、プログラミング言語のデザイン自体に対する言明であって、 コードの書き方とかライブラリの実装に対して言う言葉ではない。 … 少なくとも、型理論とかやっている人は、そういうふうには使わない(と思う) 。 言語のデザインは 「構文+意味論」 と2つの要素に大別される 意味論

    のうち「評価規則」と「型付規則」が、型安全性を語るうえでは重要 言語が型安全であるとは、その言語の評価規則と型付規則において、 「型がつくプログラムはおかしなことにならない(=ちゃんと評価できる) 」こと をいう 完全に正確な定義では、 「型安全 = 進行定理と保存定理が成り立つこと」 ◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦•◦◦◦◦◦ こと@HACK.BAR 「型安全」ってどういう意味? 25 / 30 Hackers' MeetUp #1 - 2024/07/13
  22. Appendix 関数(abstraction) が出てくると、話は少しややこしくなる まず、シンタックスが関数と変数を含むように拡張される T ::= ; 型 Bool ;

    booleans' type Nat ; natural numbers' type T -> T ; function types t ::= ; term ... x ; variables (x:T) => t ; functions t t ; applications 関数 (x:T) => t は値に含まれる(それ以上評価できない) 適用 t t の評価規則を定める。 ◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦•◦◦◦◦ こと@HACK.BAR 「型安全」ってどういう意味? 26 / 30 Hackers' MeetUp #1 - 2024/07/13
  23. 関数適用の評価規則(1) E-App1, E-App2 t1 --> t1' t2 --> t2' ----------------

    ---------------- t1 t2 --> t1' t2 v1 t2 --> v1 t2' この2つの評価規則には、次の評価戦略が暗に埋め込まれている まず関数項 t1 を値になるまで評価して それから引数項 t2 を評価する E-App2 の関数項が 項でなく 値 を意味するメタ変数 v になっているのがPoint! OCaml, PureScriptなど、多くの関数型言語が取っている戦略(正格評価) Haskellは、異なる評価戦略(遅延評価)をとっている ◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦•◦◦◦ こと@HACK.BAR 「型安全」ってどういう意味? 27 / 30 Hackers' MeetUp #1 - 2024/07/13
  24. 関数適用の評価規則(2) – β-簡約 記法 [x |-> v2] t12 は、 「項

    t12 におけるすべての変数名 x の出現を 値 v2 で置き換えたもの」を表すとする。 これを使って、以下の評価規則をSemanticsに含める E-AppAbs ((x: T) => t12) v2 --> [x |-> v2] t12 例 ((x1: Nat) => if isZero x1 then succ zero else pred x1) (pred (succ zero)) --> ((x1: Nat) => if isZero x1 then succ zero else pred x1) zero ... E-App2, E-PredSucc --> [x |-> zero](if isZero x1 then succ zero else pred x1) ... E-AppAbs == if isZero zero then succ zero else pred zero --> if true then succ zero else pred zero ... E-If --> succ zero ... E-IfTrue ◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦•◦◦ こと@HACK.BAR 「型安全」ってどういう意味? 28 / 30 Hackers' MeetUp #1 - 2024/07/13
  25. 型環境 関数・変数が出てくると、型付が単純に項と型の関係ではなくなる、以下の形式の3者関係になる Typing relation Γ |- t : T Γ

    … 型環境(Type environment) は、tの型判定を行うスコープにおいて定義されている変数と型の組のリスト Γ |- t : T は、 「型環境 Γ において項 t は型 T を持つ」 という言明と読める。 ◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦•◦ こと@HACK.BAR 「型安全」ってどういう意味? 29 / 30 Hackers' MeetUp #1 - 2024/07/13
  26. 関数の型付規則 T-Var (x:T) ∈ Γ ---------- Γ |- x :

    T T-Abs Γ, x:T1 |- t2 : T2 ------------------------------ Γ |- (x:T1) => t2 : T1 -> T2 T-App Γ |- t1 : T1 -> T2 t2 : T1 -------------------------------- Γ |- t1 t2 : T2 ◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦◦• こと@HACK.BAR 「型安全」ってどういう意味? 30 / 30 Hackers' MeetUp #1 - 2024/07/13