TL;DR
値の型の正しさを、コンパイル時ではなく実行時に検査する型システムの方式。対になるのは、コンパイル時にソースコードを解析して検査する静的型付けである。
仕組み
Wikipedia によると、動的型付けでは、代入、関数の適用、ダウンキャスト、ディスパッチなどの時点で、実行時の型情報を参照して型を検査する。静的型付けが事前に誤りを防ぐ予防的な立場なのに対し、動的型付けは実行中に誤りを検出する自浄的な立場といえる。
例
Python や Ruby のような言語が動的型付けを採用している。スクリプト言語の多くは動的型付けである。Wikipedia によると、LISP がそのルーツで、Smalltalk が動的な型の概念を明確にした。
Python で文字列と数値を足すと、実行時に TypeError が発生する。Perl では print('10'+10); が 20 を出力する。
注意点
対象に特定の構造を期待しないので、変更に柔軟に対応でき、配列や辞書のようなコレクションも扱いやすい。一方で、静的型付けに比べて最適化が難しい。
Wikipedia によると、Python を「強い」動的型付け、Perl を「弱い」動的型付けと分けるのは誤りで、どちらも異常な状態のまま実行を続けないので、強い型付けに分類される。
Effective Rust によると、Rust の手続き的マクロを使うと、コンパイル時の安全性を保ったまま、動的型付けの言語のような表現力を得られる。