サブタイピング (計算機科学)

サブタイピング（）や部分型とは、型のポリモーフィズムの形態であり、上位と定義された型を、その下位と定義された型で、型安全性に則って代替できるというの概念および実装を意味している。
スーパータイプは、そのサブタイプの数々によって代替/代入可能とされており、これは代入可能性（substitutability）と呼ばれる。そのスーパータイプとサブタイプの関係は、is-aとも言われる。記号codice_1を用いてcodice_2と表記される。
スーパータイプ＋サブタイプの概念はその時の用法で、上位型(supertype)＋下位型(subtype)、基底型(base type)＋派生型(derived type)、基本型(basic type)＋拡張型(extend type)、上位型(supertype)＋部分型(subtype) などの別称に使い分けられており、それぞれの性質にも差異がある。
起源.
サブタイピング（subtyping）は、Simula67で登場した継承と仮想手続き（仮想関数）を分析した計算機科学者によって1980年に考案された言葉である。それを更に研究したらが、1985年にインクルージョン多相という概念にまとめた。
サブタイピングは、型理論ではなく、オブジェクト指向言語の継承とメソッドオーバーライドによるのポリモーフィズムを由来にしている。1994年にバーバラ・リスコフが、オブジェクト指向の継承のサブタイピング用法を重視したリスコフの置換原則を提唱している。サブタイピングは上位概念と下位概念（hypernymy・hyponymy）に言及されることがあり、。
サブタイピングに関連付けられているその他の概念としては、発のインターフェース、ジェネリックプログラミングの総称型、部分構造論理由来のなどがある。サブタイピングを型理論視点で解釈拡張したものにがある。
関数型言語の型構築子には深さサブタイピング（depth subtyping）という別解釈が加えられている。関数型言語はレコード型の深さサブタイピングと幅サブタイピング（width subtyping）や、の共変反変サブタイピングも取り入れている。
例.
最初の例は、UMLクラス図のスーパークラスとサブクラスのサブタイピングである（右図参照）。ここでのsupertypeは基底型、subtypeは派生型と呼ばれやすい。
codice_3は基底型であり、codice_4/codice_5/codice_6は派生型である。codice_3型の変数codice_8には、codice_3型のインスタンスだけでなく、codice_4/codice_5/codice_6型のインスタンスをも代入できて、その際の変数codice_8は、codice_3型の派生（sub）で型付け（typing）されることになる。
二番目の例は、型の上位概念と下位概念に基づいた変数である。ここではsupertypeは上位型、subtypeは下位型と呼ばれやすい。
それぞれ数値型のcodice_15（総称的な数値）codice_16（浮動小数点）codice_17（整数）があるとして、これらはサブタイプ記号codice_1でこのように表現できる。
上の規則によって、codice_15型の変数codice_8に、codice_16型とcodice_17型の値を代入できることになる。従って変数codice_8は多相になる。
そのコード例はこのようになる。
 function max (x as Number, y as Number)
 if x < y then
 return y
 else
 return x
 end
関数codice_27は、codice_15型の引数codice_8,codice_30を通して、codice_16値とcodice_17値を計算できる。その際の引数codice_8,codice_30は、codice_15型の下位（sub）で型付け（typing）されることになる。
性質.
型理論においては、部分型関係は codice_1 と表記される。つまり、codice_37 という表記は codice_38 は codice_39 の部分型であるという意味である。型理論における部分型は、codice_37 ならば型 codice_38 を持つ式はどれでも型 codice_39 をも持つという事実によって特性付けられる。この形式的な推論規則は包摂（subsumption）として知られている。
型理論の研究者は、部分型であると宣言されたもののみを部分型とすると、2つの型の構造によって部分型関係にあるかが決まるを区別する。上記のクラスベースオブジェクト指向言語の例は名前的型システムである。構造的型システムのオブジェクト指向言語では、型 A のオブジェクトが型 B のオブジェクトの処理できるメッセージすべてを処理できるなら（言い換えると、同じメソッドを実装していれば）、継承関係に関係なく、A は B の部分型となる。
部分型を持つプログラミング言語の実装は大きく2つに分類される。型 A の値の内部表現が型 B の値としての内部表現も兼ねる"inclusive"（包含的）な実装と、型 A の値が型 B の値に「自動的に変換」されることのある"coercive"（強制的）な実装である。オブジェクト指向言語のサブクラスによる型の派生はたいてい包含的である。前述の整数と浮動小数点数の派生型関係は、内部表現が異なっているので、強制的な例である。
ほぼすべての型システムでは部分型関係が定義されている。それは反射律（任意の型 A について、A <: A）と推移律（A <: B かつ B <: C ならば A <: C）を満たすものである。つまり前順序が成り立つ。