2007年3月29日木曜日

 

プログラミングの新潮流

高階関数

「関数を引数に取る関数」。関数や手続きを引数として渡すことで、実装の詳細を見ずに、「やりたいこと」に集中できる。実装の詳細を隠蔽する「抽象化」。
例えば、Lispの方言であるSchemeにはmapという高階関数があり、リストの各要素に対して関数を実行できる。この例ではmapに関数を渡すことで、リストの各要素へのアクセス方法など実装の詳細については隠したまま、要素1つずつに対して行うべき処理だけに集中できます。

クロージャ

スコープの外側の変数への参照を「閉じ込めた」関数オブジェクトです。

クロージャがあると、高階関数の使い勝手が非常に向上します。例えばクロージャがなければ、せっかく高階関数を使ってループを抽象化しても、ループの外側の変数を参照できないことになってしまいます。それでは高階関数による抽象化のメリットがだいなしです。

リフレクション

プログラムがプログラム自身を操作する機能です。
例えば、現在実行中のプログラムに関する情報を得たり、現在実行中のプ ログラムを書き換えたり(メソッドやクラスを追加/変更など)する機能がリフレクションに相当。プログラムそのものを扱うプログラミングであるこ とから、しばしばメタプログラミングと呼ばれます。自分自身でインタープリタが記述されることの多いLispなどの言語では、リフレクションは言語の本質 的機能の一部です。

これによって、人間がいちいちプログラムを書き換えたり設定ファイルを用意したりする手間が減り、生産性を向上させています。

アスペクト指向

複数のクラスを横断するような機能(例えばデバッグ用にさまざまなメソッド呼び出しのログを取る機能)を、ひとまとめにして 管理する機能です。従来のオブジェクト指向言語では、機能をクラスに従って組織化します。しかし、「ログを取ること」のように複数のクラスにまたがる機能 は、あちこちのクラスに分散してしまいがちです。このような機能は1つの関心事に所属するので、できればひとまとまりの塊として扱いたいものです。これを 「関心の分離(Separation of Concerns)」と呼び、機能をクラスから「引きはががして」まとめる単位となるのがアスペクトです。

アスペクト指向は比較的新しい概念ですが、その基礎になっているのは、Common Lispのオブジェクト指向機能であるCLOS*に含まれている「メソッドコンビネーション」という技術です。実際、アスペクト指向の提唱者Gregor Kiczalesは、CLOSの設計者の1人でもあります。

型推論

 JavaやC++のように、変数や式に型のある言語*では、プログラムを解析することでプログラム自身に型の矛盾があるかどうかを検出できます。プログラム中の多くのエラーは型の矛盾によって検出できますから、コンパイルするだけで実際に実行しなくても網羅的にエラー(の一部)を検出できるのは大変うれしいことです。

 しかし、変数や関数などにいちいち型宣言を行うのはいろいろと面倒を伴います。そのこともあって、Javaのプログラムと型宣言のないRubyの プログラムを比較すると、Javaの方がずいぶん冗長に見えます。また、いちいち型を考えないといけないのは、プログラマにとって少々負担です。

 「型推論」は、静的型のメリットはそのままに、型指定の手間を省く技術です。MLHaskellなどの関数型言語では広く採用されている技術 で、定数や定義済み関数の型などを手がかりに、変数や式の型をできる限りコンパイラが推定してくれます。ですから、プログラマーは型を指定する必要がほと んどありませんし、それでいて型の矛盾はコンパイル時に検出されます。

変数や式に型のある言語

このような言語は、「静的型」に分類される。Rubyのように変数や式に型を指定しない言語は「動的型」に分類される。

プログラミング言語の進化を追え:第2回 サルでも分かるプログラミング言語の新潮流【後編】

ラベル: , , , ,


This page is powered by Blogger. Isn't yours?

登録 投稿 [Atom]

Google