型システム
静的型付けか動的型付けかの選択はいくつかのトレードオフを必要とする。
静的型付けは型エラーをコンパイル時にある程度確実に発見する。よって最終的なプログラムの信頼性を上げるはずである。しかしながら、型エラーがどれほど犯しやすい間違いなのか、その内の何割が静的型付けで検出できるのか、という点についてプログラマの意見は割れている。静的型付けの支持者は型検査されたプログラムの方が信頼性が高いと信じており、それに対して動的型付けの支持者は実際に流通しているソフトウェアの信頼性では大差ない点を指摘している。
静的型付けは大抵、より高速に実行可能なコンパイル済みコードを生成する。コンパイラが正確なデータ型を知っていれば、最適化されたコードを生成できる。さらに、静的型付き言語のコンパイラではショートカットをみつけるのもより簡単になる。この理由からCommon Lispなどのいくつかの動的型付き言語では随意で型宣言ができるようになっている。最適化のための型付けは静的型付けの影響で普及した。
対照的に、動的型付けのほうがコンパイラやインタプリタの動作が高速になることがある。動的型付けの言語ではソースコードが変更されてもやり直すべき解析が少ないためである。これは「編集-コンパイル-テスト-デバッグ」というサイクルの時間を減らす。
ポリモーフィズム(多相)という語は、コード(具体的には関数やクラス)が複数の型の値に基づいて動作できること、または同じデータ構造の異なるインスタンスが異なった型の要素を持てることを指す。型システムによってはコードの再利用性を改善するためにポリモーフィズムを持つものもある。ポリモーフィズムのある言語ではプログラマはリストや連想配列のようなデータ構造を使用される要素の型ごとにではなく、単に一度だけ実装すればよい。この理由から計算機科学ではこの種のポリモーフィズムの利用はジェネリックプログラミングと呼ばれることがある。ポリモーフィズムの型理論における基礎は抽象化やモジュール、また(場合によっては)派生型についての研究と密接な関連がある。
より表現力の高い型システムでは、型はプログラマの意図を説明することができるので、型自身がドキュメントの役割を果たし、可読性の向上に寄与することもある。例として、何らかの時刻情報(タイムスタンプ)を返す関数を定義するとき、単なる64ビットの組み込み整数型ではなく専用のタイムスタンプ型(構造体型など)を返す関数として宣言すると、その型情報が関数の意味を記述していることになる。
強い(strong)と弱い(weak)は、静的/動的型付けでのプログラム要素の型を解釈(interpret)する際の性質である。
強い型付けとは、プログラミング言語仕様内でデータ値の型を解釈するという全く普通の方法に従ったものである。暗黙的型変換(implicit type conversion)と型強制(type coercion)と型ジャグリング(type juggling)は、言語仕様内なので、こちら側になる。基底型を派生型にするなど一定の型制約での実行時型チェック付きの型キャスト(type casting)も、こちら側になる。特殊な例では、LISP風の潜在的型付けやダックタイピングによる型解釈も言語仕様内なので、こちら側である。
弱い型付けとは、言語仕様外になる明示的型変換(explicit type conversion)と型キャスト(type casting)の使用によって、データ値の型を様々に解釈できる変則的な方法を大幅に許容したものである。型安全性は保証されなくなる。具体例としては以下がある: