動的プログラミング言語
動的プログラミング言語(英: dynamic programming language)は、通常他の言語ではコンパイル時に行うことを実行時に行う高水準言語のクラスを指す計算機科学における用語である。動的言語(英: dynamic language)とも。実行時に行うこととは例えば、コードの追加やオブジェクトや定義の拡張や型システムの変更によるプログラムの拡張である。これらの動作は他の言語でも手間はかかるがエミュレート可能である。しかし、動的言語はそれらのための直接的ツールを提供する。
動的言語と動的型付けは同じ概念ではないし、全ての動的言語が必ずしも動的型付き言語というわけではないが、多くの動的言語は動的型付き言語である。
目次 |
定義の限界と曖昧さ[編集]
動的言語の定義は、「コンパイル」と「実行時」の区別だけでなく、「コード」と「データ」の区別も関わってくるため、非常にあいまいである。仮想機械や実行時コンパイラなど、機械語に何らかの抽象化を施し、機械語を実行時に生成する言語処理系は多い。一般に、ある言語が動的であるとは、その言語の能力を明確に表しているというよりも、動的な機能の使い易さを指しているといえる。
実装[編集]
動的プログラミングの概念を密接な関連のある機構がいくつか存在する。それらは必ずしも動的言語として必須とは言えないが、動的言語と呼ばれるものに広く採用されているのも確かである。
Eval[編集]
evalとは、LISPで導入された用語であり、S式と呼ばれるデータ構造で表現される命令列を実行するプロセスを指している。今日では、eval と言えばテキストなど機械語以外のデータで表されたプログラムを実行する何らかの機構やプロセスを指す。多くの言語では(LISPとは異なり)プログラムテキストを読むこととそれを内部表現に変換すること、さらには内部表現から実際の動作に変換することを区別しないため、新たなプログラムテキストの評価はそういった言語の一般的性質である。それらの言語で、プログラムの実行プロセスが eval に他ならない場合、これをインタプリタ言語と呼ぶ。
高階関数[編集]
エリック・マイヤー(Erik Meijer)とピーター・ドレイトン(Peter Drayton)は、実行時に実行コードをロード可能な任意の言語は(たとえ、そのコードがDLLの機械語コードだとしても)、一種の eval 機能を備えていると言えるとした。彼らは高階関数が動的プログラミングの本質であるとし、「eval は高階関数の代用品にすぎない」とした[1]。
オブジェクトシステムや型システムの実行時変更[編集]
動的言語では、オブジェクトシステムや型システムを実行時に変更できるのが一般的である。これはすなわち、実行時定義に従って新たなオブジェクトを生成したり、既存の型やオブジェクトの合成に基づいて新たなオブジェクトを生成することを意味する。また、継承関係や型の木構造の変更も指していて、既存の型の振る舞いも(特にメソッド呼び出しの観点で)それによって変化する。
関数型プログラミング[編集]
関数型プログラミングの概念は多くの動的言語に備わっている。これも LISP を起源としている。
クロージャ[編集]
関数型プログラミングの概念の中でも、動的言語でよく使われる機能としてクロージャがある。クロージャは関数の新たなインスタンスを生成し、生成時点のコンテキストへのアクセスを保証する。簡単な例として、テキストでの単語検索を行う関数の生成を挙げる。
function new_scanner (word)
temp_function = function (input)
scan_for_text (input, word)
end function
return temp_function
end function
ここで、内部で生成される関数には名前がなく、その代わりに temp_function という変数に「格納」されている。new_scanner が実行されるたびに、定義されたときに渡された word というパラメータを記憶している新たな関数が返される。
クロージャ[2]は関数型プログラミングの中核的ツールの1つであり、動的言語の多くはこの程度の関数型プログラミングをサポートしている。
継続[編集]
動的言語における別の機能として継続がある。継続は、再呼び出し可能な実行状態を表している。例えば、構文解析器が中間結果と継続を返し、後で再呼び出しされると、入力の構文解析を再開する。継続はクロージャなどのスコープと複雑に関連している。このため、継続を提供している動的言語は多くはない。
イントロスペクション[編集]
イントロスペクションは多くの動的言語で見られ、自分自身の構造・コード・型・データなどを解析するプログラムによく使われる。これは総称型やポリモーフィズムの値について型を決定するのと似たようなものである。プログラムのコードをデータとして完全に解析可能な場合もあり、例えば LISP ではプログラムをS式として解析可能である。
マクロ[編集]
動的プログラミング言語の中には、コードのイントロスペクションと eval 機能を組み合わせてマクロと呼ばれる機能を提供するものもある。C言語やC++におけるマクロは、プログラム内の文字列を置換するサブセット的かつ静的な機能でしかない。これに対し動的言語では、マクロはコンパイラ内部へのアクセスを提供し、実行時にも完全なアクセスを提供する。従って、コードの最適化にも関わり、言語の文法や構文を変化させる能力を持っている。
言語[編集]
アセンブリ言語、C言語、C++、初期の Java、FORTRAN などは動的プログラミング言語ではない。
関連項目[編集]
脚注[編集]
- ^ Meijer, Erik and Peter Drayton (2005年). “Static Typing Where Possible, Dynamic Typing When Needed: The End of the Cold War Between Programming Languages”. Microsoft Corporation. 2008年1月18日閲覧。
- ^ See example of use on p.330 of Larry Wall's Programming Perl ISBN 0-596-00027-8
外部リンク[編集]
- Dynamic Languages by David Ascher.