動的型付けとは?実行時に型を検査する
動的型付けとは、値の型がコンパイル時の変数ではなく実行時の値に結び付けられることを意味し、型エラーはコードが動くときにのみ現れます。
Python、Ruby、JavaScriptのような動的型付け言語では、変数に固定の型はなく、値が自らの型を持ち歩き、検査はプログラムの実行中に行われます。これはコードを簡潔で柔軟にし、どこにでも何でも渡せますが、型の不一致がその行が実際に動くときにのみ爆発することも意味します。だからこそテストがこれほど重要なのです。
型が検査されるとき
動的型付けは型の検査を実行時へ先送りします。不一致な型を拒否するコンパイル段階はなく、代わりに操作は実行されたときにfailし、その瞬間に型エラーを送出します。したがって型のバグは、特定の経路が動くまで隠れ得ます。
動的型付けの利点
- 型注釈がほとんど、あるいは全くない簡潔なコード。
- 多様な形のデータを容易に扱う柔軟性。
- 素早いプロトタイピングと迅速な反復。
- duck typing: 宣言された型より振る舞いが重要。
動的 vs 静的型付け
静的型付けは型エラーをコンパイル時に捕まえ、動的型付けは実行時に捕まえます。動的はより柔軟で簡潔ですが、あるクラスのエラーを実行中のコードへ押し出すため、それらを捕まえるのにテストへより強く頼ります。
テストがより重要な理由
型を検査するコンパイラがないため、テストスイートが安全網になります。テストで実行されない経路のコードは、型エラーを無期限に隠し得ます。多くのチームは、いくらかの静的な安全性を取り戻すためにオプションの型チェッカー(mypyやTypeScriptなど)を追加します。
手短な例
Pythonでは、len(5) は有効な構文ですが、整数には長さがないため実行時にTypeErrorでfailします。その行が実行されるまで何もそれを捕まえません。
CIにおける動的型付け
動的言語では、テストの実行こそが型エラーがついに表面化する場所であり、徹底したテストが不可欠になります。本物の型エラーは決定論的にfailし、リトライではなく修正すべきです。Latchkeyは一時的なインフラ障害のみをリトライするため、本物の型バグはpipelineで見えたままになります。
重要なポイント
- 動的型付けは実行時に型を検査するため、型エラーはコードが動くときにのみ現れる。
- 簡潔で柔軟だが、コンパイラが捕まえるものを捕まえるためにテストに依存する。
- CIの型エラーは修正すべき決定論的なバグであり、リトライすべき一時的な障害ではない。