動的型付け
静的型付けは、
機能(関数)が形式に合った正しい型のデータのみを処理することを事前の検査により保証する
この保証があるため、高度な最適化が可能である
と主張される。この方向性に基づき、全ての機能と変数において処理する対象の型をプログラムの定義時点で決定し、型が異なるデータを受け付けない(あるいは上位互換の型に限定する)。MLなどでは型に従わない式は許されない。Javaなどでは明示的にキャストする必要があり、キャストは実行時に検査される。Cなどではキャストを正しく使うのはプログラマの責任であり、通常のコンパイラは特にチェックなどを入れず書かれた通りのコードを吐く。
これに対し、動的型付けでは、定義では型の限定を行わず、実行時に合致するデータが渡されると期待する、または合致するデータであるかを判定する。期待する型とは異なるデータが渡された場合、単にエラーとするものもあれば、型変換ないし強制(coerce、数値を文字列にしたりするような変換)したり、場合によっては委譲といったプロトコルに従うものもある。
例えば、Perl, Pythonで共に実行可能(文法エラーとはならない)な下記のコードにおいて、Perlでは20と表示される一方、Pythonでは実行時にTypeError例外が発生する。なおこの2種類を「強い動的型付け」「弱い動的型付け」と区別するのは間違いである(どちらも、プログラムが異常なまま走り続けることは無いので、強い型付けである)。
プログラムの最適化手法のうち、静的型付けでは容易だが動的型付けでは難しいものがあり、動的型付けが不利とされる理由のひとつになっている。