「型」という言葉は話者と文脈によって異なった意味で使われることがあります。型理論の研究者などは下の定義 1 のみを「型」と呼ぶので注意しましょう。
-
定義 1: 型システムによる静的検証のためにプログラム内の式や文などの構成要素を分類する概念
- 例文: Boolean 型を持つ式を函数として適用するコードを書いたので型エラーが発生した。
- 例文: Ruby は型のない言語だ。
- 注意: 定義 1 は俗に「静的な型」「コンパイル時の型」と呼ばれることがあるが、コンパイルの有無は定義とは特に関係がない。
-
定義 2: プログラムが取り扱う情報(の特定の部分集合)の範囲や意味
- 例文: 整数型の値同士は足し算や掛け算ができる。
- 例文: 一般的なプログラミング言語は整数型の他に実数型や真理値型も扱える。
-
定義 3: どのような型 (定義 2) の値をどのようなビットやバイトの並びとして表現するかというデータの形態・形式の定義
- 例文: Java の int 型は $-2^{31}$ から $2^{31}-1$ までの整数を 2 の補数表現で表す 4 バイトの型だ。
- 例文: C では代入時などに暗黙の型変換が行われることがある。
-
定義 4: 一部のプログラミング言語において、構築したい第一級オブジェクトの型 (定義 3) やそれに対して実行できる操作を定義する、プログラム内の構成要素
- 例文: C++ では class や union を使って新しい型を定義できる。
- 例文: C# では struct は値型を、class は参照型を定義する。
-
定義 5: プログラム内の特定の第一級オブジェクトを生成するのに使われた型 (定義 4) が何だったかという情報
- 例文: Ruby では全てのオブジェクトが実行時型情報を持つ。
- 例文: Java の instanceof 演算子は実行時にオブジェクトの型を検査する。
- 注意: 定義 5 は俗に「動的な型」「実行時の型」と呼ばれることがある。ただし、言語仕様や処理系の性能によっては型を使う計算がプログラム実行前に完結している事もありうる。
-
定義 6: プログラム内のそれぞれの第一級オブジェクトがどのようなプロパティやメソッドを持っているかというデータ構造
- 注意: 定義 6 も俗に「動的な型」「実行時の型」と呼ばれることがある。英語では shape などと呼ばれることがある。
- 例えば JavaScript ではクラスのような型 (定義 4) を用いなくてもオブジェクトごとに固有のプロパティやメソッドを定義できる。
foo.bar
という式はオブジェクトfoo
が持つプロパティbar
へのアクセスを試みる意味論を持つが、その評価結果は実際にオブジェクトがプロパティを持っているかどうかによって変わる。プロパティやメソッドが存在しない場合に評価結果が特殊な値 (undefined
) になったり例外が送出されたりするような挙動を好ましくないものとして排除したいという文脈において、俗に以下のような言い回しがされることがある。- 例文: JavaScript では実行時にオブジェクトの型が検査される。
- 例文: 函数に渡したオブジェクトの型が合っていなかったので例外が発生した。