動的型付け

出典: フリー百科事典『ウィキペディア(Wikipedia)』
2014年2月20日 (木) 20:41時点におけるMetaNest (トーク)による版
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
移動先: 案内検索

テンプレート:出典の明記

動的型付け(どうてきかたづけ、テンプレート:Lang-en-short)とは、プログラミング言語で書かれたプログラムにおいて、変数や、サブルーチン引数や返り値などの値について、そのを、コンパイル時などそのプログラムの実行よりも前にあらかじめ決めるということをせず、実行時の実際の値による、という型システムの性質のことである。

また、そのような性質の言語を、動的型付き言語(どうてきかたつきげんご、テンプレート:Lang-en-short)という。これに対し、型は実行前に決まる、というのが静的型付けである。型推論を利用していて、構文上は型の記述が省略可能な言語もあるが、そういった言語も静的型付けである(MLなど)。

静的型付けは、

  • 機能(関数)が形式に合った正しい型のデータのみを処理することを事前の検査により保証する
  • この保証があるため、高度な最適化が可能である

と主張される。この方向性に基づき、全ての機能と変数において処理する対象の型をプログラムの定義時点で決定し、たとえみかけの構造が同じであっても型が異なるデータを受け付けない(あるいは上位互換の型に限定する)。MLなどでは型に従わない式は許されない。Javaなどでは明示的にキャストする必要があり、キャストは実行時に検査される。Cなどではキャストを正しく使うのはプログラマの責任であり、通常のコンパイラは特にチェックなどを入れず書かれた通りのコードを吐く。

これに対し、動的型付けでは、定義では型の限定を行わず、実行時に合致するデータが渡されると期待する、または合致するデータであるかを判定する。期待する型とは異なるデータが渡された場合、単にエラーとするものもあれば、型変換ないし強制(coerce、数値を文字列にしたりするような変換)したり、場合によっては委譲といったプロトコルに従うものもある。

例えば、Perl, pythonで共に実行可能(文法エラーとはならない)な下記のコードにおいて、Perlでは20と表示される一方、Pythonでは実行時にTypeError例外が発生する。なおこの2種類を「強い動的型付け」「弱い動的型付け」と区別するのは間違いである(どちらも、プログラムが異常なまま走り続けることは無いので、強い型付けである)。

print('10'+10);

プログラムの最適化手法のうち、静的型付けでは容易だが動的型付けでは難しいものがあり、動的型付けが不利とされる理由のひとつになっている。

動的型付けのルーツはプログラミング言語LISPにさかのぼる。LISPはラムダ算法に基づく記号処理を目的とした計算モデルであったため(その「モデル」が大学院生によって FORTRAN に移植された)、究極的に数字と文字列と関数とそれらのリストの間に区別がなく、全てが「評価可能な対象」という意味で等価である。そのため同時期のCOBOLFortranとは一線を画す「型のない言語」のはしりとなった。(実際にはLISPといえどもハードウェア上のレジスタを利用するため、小さな数字(FIXNUM、有限数)は大きな数字(BIGNUM、無限数)とは別の実体を持っている。しかしプログラマーが違いを意識するのは実効性能が問題になる場合のみである)

その後LISPの流れを汲む簡易言語Logoを経て、動的な型という概念を明確にしたのがSmalltalkである。

オブジェクト指向に基づくSmalltalkでは、全ての処理対象は何らかのクラスに属すため、型という概念そのものは存在する。しかしSmalltalkでは、

  1. 全てのクラスはルートクラスである Object に由来するので、最低限 Object としての振る舞いが保証される
  2. たとえ同一の機能名を持っていても、実際に起こる結果はクラスによって異なるかもしれない
  3. クラス(型)自体も一種のオブジェクトであり、必要なら型に関するメタプログラミングが行える

などの特徴を持ち、型よりもむしろ「特定の名称のメソッドを受け付けるべき」「メソッドはその名前に見合った動作を行うべき」というプロトコル的な立場による疎結合の信頼性を重視している。このプロトコル的な信頼性こそが動的型付けの要である。これを積極的に行うのがダック・タイピングである。

両者の違いは、静的は予防的な立場であり、動的は自浄的な立場といえるだろう。

通常、静的型付けはオペレーティングシステムやシステムプログラムのような大規模で厳密性が要求される領域に適合するといわれている。反面最初の型定義を誤ると一部分の影響が全体に波及すること、また柔軟性に乏しくわずかな変換に手間のかかる経路を用意したり同じような機能を型別に実装しなければならないことなど、いわばお役所仕事的な煩雑さを伴うという弱点を持つ。(なお近年の研究により静的型付き言語も文脈から型を推論する型推論能力を持つなど簡略化の方向へ向かってはいる)

一方動的型付き言語ではそもそも対象に特定の構造を期待しないため変更への対応は柔軟である。特に配列、辞書、集合といったコレクションの利便性が顕著で、そのため近年いわゆるスクリプト言語動的プログラミング言語は多くが動的型付けを採用している。動的型付けの難点である最適化の弱さは、コンピューターの能力が増すことで相対的に小さな問題になっており、スクリプト言語を中心に今後も動的型付けは発展するものと思われる。