型システムとは?値を統べる規則
型システムとは、言語が値を型に分類し、それらに適用する操作が有効かを検査するために用いる規則の集合です。
すべての言語は何らかの型の概念、すなわち整数、文字列、リスト、カスタムオブジェクトを持ち、型システムはそれらを統べる規則の総体です。それはどの型が存在するか、それらがどう組み合わさるか、どの型にどの操作が許されるかを定義します。良い型システムは無意味な操作(数値に関数を足すこと)を排除し、より強い形ではバグの丸ごとのカテゴリを防ぎます。
型システムがすること
型システムはすべての値と式に型を割り当て、それらがどう使えるかについての規則を強制します。関わる型にとって意味をなさない操作を拒否し、特定のバグを、害を及ぼす前にエラーへと変えます。
型システムの次元
- 静的 vs 動的: 型がコンパイル時か実行時に検査される。
- 強い vs 弱い: 規則がどれほど厳格に強制されるか。
- 名前的 vs 構造的: 名前による同一性か形による同一性か。
- 推論 vs 明示: どれだけ注釈を付けねばならないか。
強い型付け vs 弱い型付け
強い型システムは暗黙の変換に抵抗し、数値を文字列に黙って足すことはできません。弱いものは驚くような型強制を行います。強さは規則がどれほど寛容か(あるいはそうでないか)についてであり、静的か動的かとは別のものです。
型システムが重要な理由
型システムは組み込みで常時働く形の検証です。より豊かなシステムは不変条件(非nullや有効な状態のみ)を符号化でき、コードがコンパイルされれば特定のバグが単に不可能になります。これはすべてのbuildで無料で得られる検証です。
手短な例
型システムは、function greet(name: string): string のようなシグネチャに、呼び出し側が文字列を渡し文字列を受け取ることを保証させ、契約に違反する呼び出しを拒否します。
CIにおける型システム
CIで型チェッカーを走らせることは、型システムをすべての変更が通らねばならない関門に変え、レビュー前に不一致を捕まえます。型エラーは決定論的にfailし、リトライではなく修正すべきです。Latchkeyは重い型チェックをより大きなrunnerで速め、一時的なインフラ障害のみをリトライします。
重要なポイント
- 型システムとは、言語が値を分類し操作を検証するために用いる規則である。
- 静的/動的、強い/弱い、推論/明示のような軸に沿って変化する。
- より強い型システムは組み込みの検証として働き、バグのクラスを排除する。