動的型付け(どうてきかたづけ)はプログラミングパラダイムの一つ。一般に多くのプログラミング言語は処理するデータを数字型、文字列型、それらの複合型(構造型)のような型によって分類するのが普通である。これはデータの型付けによって
信頼性(型安全)
機能(関数)は形式に合った正しい型のデータのみを処理すべき
最適化
型の定義が精密であるほど実行性能を引き出しやすい
の2つの問題に対処できるからである。この方向性に基づき、全ての機能と変数において処理する対象の型をプログラムの定義時点で決定し、たとえみかけの構造が同じであっても型が異なるデータを受け付けない(あるいは上位互換の型に限定する)立場を静的型付けという。
これに対し定義上では型の限定を行わず、実行時に合致するデータが渡されると期待する、または合致するデータであるかを判定し、必要なら適切な変換を施したり別の機能に委譲するような立場を動的型付けという。静的型付けとは対立的な立場であり、特に最適化の難しさが動的型付けの弱点といえる。
動的型付けのルーツはプログラミング言語LISPにさかのぼる。LISPはラムダ算法に基づく記号処理を目的とした計算モデルであったため(その「モデル」が大学院生によって FORTRAN に移植された)、究極的に数字と文字列と関数とそれらのリストの間に区別がなく、全てが「評価可能な対象」という意味で等価である。そのため同時期のCOBOLやFortranとは一線を画す「型のない言語」のはしりとなった。(実際にはLISPといえどもハードウェア上のレジスタを利用するため、小さな数字(FIXNUM、有限数)は大きな数字(BIGNUM、無限数)とは別の実体を持っている。しかしプログラマーが違いを意識するのは実効性能が問題になる場合のみである)
その後LISPの流れを汲む簡易言語Logoを経て、動的な型という概念を明確にしたのがSmalltalkである。
オブジェクト指向に基づくSmalltalkでは、全ての処理対象は何らかのクラスに属すため、型という概念そのものは存在する。しかしSmalltalkでは、
全てのクラスはルートクラスであるObjectに由来するので、最低限オブジェクトとしての振る舞いが保証される
たとえ同一の機能名を持っていても、実際に起こる結果はクラスによって異なるかもしれない
クラス(型)自体も一種のオブジェクトであり、必要なら型に関するメタプログラミングが行える
などの特徴を持ち、型よりもむしろ「特定の名称のメソッドを受け付けるべき」「メソッドはその名前に見合った動作を行うべき」というプロトコル的な立場による弱い結合の信頼性を重視している。このプロトコル的な信頼性こそが動的型付けの要である。これを積極的に行うのがダック・タイピングである。
両者の違いは、静的言語は予防的な立場であり、動的言語は自浄的な立場といえるだろう。
通常、静的型付けはオペレーティングシステムやシステムプログラムのような大規模で厳密性が要求される領域に適合するといわれている。反面最初の型定義を誤ると一部分の影響が全体に波及すること、また柔軟性に乏しくわずかな変換に手間のかかる経路を用意したり同じような機能を型別に実装しなければならないことなど、いわばお役所仕事的な煩雑さを伴うという弱点を持つ。(なお近年の研究により静的型付けの言語も文脈から型を推論する型推論能力を持つなど簡略化の方向へ向かってはいる)
一方動的型付けの言語ではそもそも対象に特定の構造を期待しないため変更への対応は柔軟である。特に配列、辞書、集合といったコレクションの利便性が顕著で、そのため近年いわゆるスクリプト言語は多くが動的型付けを採用している。動的型付けの難点である最適化の弱さは、コンピューターの能力が増すことで相対的に小さな問題になっており、スクリプト言語を中心に今後も動的型付けは発展するものと思われる。
関連項目
型システム
カテゴリ: プログラミングパラダイム | 型理論
更新日時:2008年6月21日(土)01:39
取得日時:2008/09/04 14:06