型システム
型推論のない静的型付き言語ではプログラマがメソッドや関数の型を宣言しなければならない。これはプログラムの追加的なドキュメントとして機能することがあり、コンパイラによってコードと同期させることが強制される。しかし型宣言のない静的型付き言語もあるので、これは静的型付けのというよりは型宣言の報酬である。言語が型推論の機能を持っていたとしても、型推論による暗黙的型付けを多用しすぎると可読性やメンテナンス性がかえって低下することがある。型推論を使用することが適切ではないケースについて一定のガイドラインが示されていることもある。
動的型付けはいくつかの静的型付けでは不正となり実現できない仕組みを可能にする。例えばデータをコードとして実行するeval関数である。さらに動的型付けでは、具体的なデータ構造の代わりに文字列を暫定的に用いることなどがやりやすく、プロトタイピングとの相性も良い。
動的型付き言語のメタプログラミング機能はより強力で使いやすいことが多い。例を挙げると、C++のテンプレートはRubyやPythonでの等価なコードより、書くのが煩わしい。またイントロスペクションのような、より高度な実行時の仕組みを静的型付き言語で使うのは、さらに困難になることが多い。
プログラミング言語はさまざまな値を扱う。代表的かつ最も原始的なものは数値や文字列だが、一般的に有限の資源制約があるコンピュータにとって都合のよい内部表現が使われ、例えば数値には32ビットや64ビットといった固定サイズの整数型や浮動小数点数型が、文字列には特定の文字コード集合によって符号化された整数値の羅列(文字配列)が使われることが多い。文字列の表現には最後の文字(番兵)に0を使用するゼロ終端文字列(ヌル終端文字列)が使われることもあれば、長さ情報を別途整数値で保持する複合データ構造が使われることもある。三角関数は浮動小数点数を引数にとり浮動小数点数を返す。先頭の文字を大文字にする関数は文字列を引数にとり文字列を返す。ユーザーからの入力を数値として扱うためには、文字列を解釈して数値を返す関数が必要である。ここで、3.14 や "hoge" といった値について「浮動小数点数」や「文字列」といった種類に分類して扱っているが、同じ種類の値であれば同じ操作(演算)が可能である。この「値の種類」が型(データ型)である。
ダックタイピングは、構造的型付けに類似した型付けのスタイルであり、オブジェクトが対象になることが多い。例えばオブジェクトが特定のプロパティ/フィールド/変数を所持しているか、または特定のメソッド/関数/手続きを所持しているならば等価判定される。これも部分型(サブタイプ)視点である。この等価判定は、エラー発生のないプロパティ参照またはメソッド実行に直結している。ダックタイピングの名称は、帰納法の一種であるダックテストに由来している。
さらに動的型付けに基づく動的ダックタイピングと、静的型付けに基づく静的ダックタイピングがある。特にC++のテンプレートは静的ダックタイピング機能の典型であり、例えば関数呼び出し演算子をオーバーロードした関数オブジェクトを定義することで、関数ポインタと区別することなく統一的にアルゴリズムの述語オブジェクトとして扱うこともできる。適切な演算子オーバーロードを定義することで、組み込みの数値型やポインタ型と同じ記法で扱える型をユーザー定義することもできる。
分類には諸説あり、「ダックタイピングは実行時の動的な型付けであり、構造的型付けはコンパイル時の静的な型付けである」とみなす者もいれば、「構造的型付けはコンパイル時の静的なダックタイピングである」とみなす者もいる。