動的型付け | Programming Place Plus 用語集

トップページ用語集

名称

解説

プログラム実行を開始する前に、変数引数戻り値などのを決定せず、実行時に決定させることをいいます。

プログラムを実行してから、実際のが何であるかによって型が決定されます。一方、プログラムの実行を始めるより前に型を決定済みにしておくことを、静的型付けといいます。

たとえば、変数 a に対する初期化a = read_data() であったとすると、変数 a の型は read_data関数が返した戻り値の型によって決定されます。静的型付けのプログラミング言語でも var a = read_data() のように、宣言のときに型を明確に記述せず、型を自動的に決めさせるものがありますが、これはコンパイルのときに型の判断を下すものであり(型推論)、あくまでも静的型付けということになります。

このあと if (a == 100) のようなコードが実行されるとすると、read_data関数が返したものが整数型(あるいは整数型への暗黙の型変換ができる型)であれば問題ありませんが、そうでなければ、この条件式は型が一致しておらず、実行時エラー例外として報告されることになります。これはチェックが甘くなっただけのようでもありますが、実際の型に応じた分岐処理を行うことができるので(たとえば、if (a.isInteger()) とか if (a.isString()) のようにして、型を実行時に判定する方法がある)、柔軟なコードを記述できる利点もあります。

この例でいえば、静的型付けでは、read_data関数の戻り値の型は実行前に確定済みですし、変数a の型も宣言時に明示的に指定しますから(あるいは型推論によって read_data関数の戻り値型になる)、型が一致していなければその時点でコンパイルエラーなどのかたちで検出され、プログラムを実行すること自体が不可能です。そして、変数a の型が決定済みである以上、if (a.isInteger()) とか if (a.isString()) のような方法で処理を分岐させることもできません。


このように、静的型付けでは、型と値が一致していないミスを、コンパイルエラーや警告などのかたちであらかじめ検出できます(プログラマーが誤ったキャストを行うなどしていなければ)。一般的に問題の発見は早いほうがいいので、この特徴は利点として捉えられることが多いです。しかし、すべての値の型を明確にし、不整合なくソースコードを組み上げなければ、実行を行うことすらできませんし、同じ意味の処理でも、型ごとに記述しなければならないなど(C++ のテンプレートのような解決策はある)、柔軟性に欠ける面もあります。

動的型付けの場合、プログラムを実行する前に型に関する問題を検出しきれないため、問題があれば、実行時に実行時エラーや例外として報告されることになります。荒く仕上げた状態でも実行してみて、完成している部分だけを確認することができますし、型に応じて処理を分岐させるなど、柔軟なコードを記述できる利点がありますが、問題のある箇所が実際に実行されない限り、そこに潜む間違いが検出できないということでもあります。また、型が実行前に決定できていると、最適化をかけやすくなり、パフォーマンスの良いプログラムになる可能性が高まります。

静的型付けを採用しているプログラミング言語を静的型付け言語、動的型付けを採用しているプログラミング言語を動的型付け言語と呼ぶことがあります。ただし、基本的には静的型付け言語であっても、リフレクションと呼ばれる機能を使うなどして、動的型付けのような柔軟さを得られる言語もありますし、基本的には動的型付け言語であっても、型を指示する方法を備えている言語もあります。


参考リンク

更新履歴


用語集のトップページへ

Programming Place Plus のトップページへ



はてなブックマーク に保存 Pocket に保存 Facebook でシェア
X で ポストフォロー LINE で送る noteで書く
rss1.0 取得ボタン RSS 管理者情報 プライバシーポリシー
先頭へ戻る