型システム
構造的型システムとは外部に見せている構造(インタフェース、特に暗黙的なもの)が同じものを持つ値を同じ型であるとするもので、名前的型システムとは型宣言の構文からのみ型の同一性を判定する(型が同じ「名前」を持たなければならない)ものである。
オブジェクト指向言語のように基底型と派生型の関係がある言語では、互換性の関係はより複雑なものとなる。型Derivedが型Baseの派生型であるとすると、Derived型の値はBase型の値が必要とされる文脈で使用することができる(リスコフの置換原則)。しかし逆は真ではない。等価性と同様に派生型の関係はプログラミング言語によって異なった方法で定義され、多くのバリエーションが存在しうる。パラメータ付けされたまたはアドホックなポリモーフィズムを持つ言語の存在は型の互換性に何らかの意味を持つのかもしれない。
型付けを更に厳密に定義した区分として型なし(英: untyped)という区分が存在する。代表的な言語としてはSmalltalk、BCPL、B言語、アセンブリ言語などがある。Smalltalkでは高速化のため処理系依存で実行時に型検査することがあるものの言語的には型検査がなく、動的型付け言語のように文字列に割り算をするといった不正な操作をしても処理系が型検査して停止する事は無い。
BCPL、B言語、アセンブリ言語などオブジェクト指向とは関係なく型を持たない言語では、ハードウェアのワード長に依存した1種類の型のみを持つか、言語を使う側でデータを参照するときにデータ幅や種類の解釈を決定することとなる。
オブジェクト指向型の型なしの言語では処理系が型検査をしない代わり、ライブラリで例外を投げて停止する。例えばSmalltalkではオブジェクトに対し対応するメソッドが存在しないメッセージを投げると、最終的にクラスごとに定義した#doesNotUnderstand:メソッドに至る。このメソッドが例外を投げるようになっていれば停止するが、そうでなければ停止することなく走り続ける。対照的に動的型付け言語では、演算子のような一部の操作について値の型に応じた型検査を処理系が行いエラーとしてしまう。エラー発生時の挙動については言語によって異なり、例えば数値を文字列値で割るという2 / 'A'のような無意味な演算に対して、PythonはTypeError例外をスローし、JavaScriptはNaNを返す。型なしのオブジェクト指向言語は最適化がしづらい反面、オブジェクトの操作を処理系に制限されないため使用者が後から自由にオブジェクトの操作を追加できる利点がある。