§2.近代的プログラミングの主要概念




C++やC#,あるいはJavaのような言っちゃ悪いが“へたれ”な言語しか知らない人のために、近代的な言語の主要概念を簡単に解説しておく。(いま開発中のスクリプト言語にとりいれると言う意味ではない)

まずは、haskellから。

☆ haskell
>本家
http://www.haskell.org/>入門用によさげなページ(日本語)
http://www.teu.ac.jp/kougi/koshida/Prog6/index.html
http://www.sampou.org/haskell/tutorial-j/index.html
haskellは、間違いなく関数型プログラミング言語の頂点に立つ言語だとやねうらおは考えている。

・遅延評価(lazy evalution)

たとえば、次のような計算(式の評価)を行なうとする。

枠-1
30 - (f (3+1))


通常の言語では、fの呼び出しにさきがけて3+1を行なう。ところが、haskellでは、3+1を行なうのは、fの呼び出しのあとなのだ。3+1はオブジェクトで、オブジェクトの評価が行なわれるのは、常に必要に迫られた時のみだと言えばわかりやすいだろうか。

これを遅延評価と呼ぶ。これがC++のfunctorのような役割をする。haskellが非常に高速だと言われるのも、この遅延評価まわりにからくりがある。

一般に、C++で書かれたプログラムとhaskellで書かれたプログラムだと、後者のほうが速いことが多いのもうなずける。まあ、もっとも、C++で書いても、functorをバリバリ使いまくれば同等程度の速度にはなるだろう。ただ、面倒くさいだけで..

遅延評価のメリットはもうひとつある。それは無限リストを使えることだ。

枠-2
    ones = 1 : ones
    //  1,1,1,1,1,...という無限リスト


遅延評価のおかげでこのような無限リストに対して計算が出来る。これがもたらすメリットについてはここで詳しく述べない。上記の参考ページを見ていただきたい。

・カリー化(curry)

枠-3
    add                     :: Integer -> Integer -> Integer
    add x y                 =  x + y
    //  int add(int x,y) { return x+y; }の意味


これはカリー化されたaddです。2引数をとります。

カリー化された関数に対して部分適用(partial application)する例:

枠-4
    inc                    = add 1
    //  addが部分適用され、関数が返し値となる


まあ、カリー化やら、ラムダ式については、こっち
http://bm98.yaneu.com/intensive/spt1.html
http://members.tripod.co.jp/nbz/ref/lambda.htmlでも見ていただくとしよう。

・継続(continuation)

schemeのcallcc(call-with-current-continuation)というと語弊がある?Rubyでも最近実装されていたのが記憶に新しいかも知れない(将来的には無くなるそうですが):

http://www.namikilab.tuat.ac.jp/~sasada/prog/rb3.html
(平たく言えば)ある実行状態のsnapshotを保存しておいてその状態に戻すことが出来る、というものだ。

haskellが実用になるのかどうかは(やねうらおは)知らない。それは、現実的なライブラリまわりの話もあるし、ここで論じても仕方ないのかも知れない。実用性で言えば、Caml系のほうが、有力だろう。まあ、興味のある方は見ていただきたい。

☆ Object Caml
http://www.sato.kuis.kyoto-u.ac.jp/~igarashi/class/isle4/mltext/
あと、Mix-JuiceのMix-inという機構。glue code(モジュールとモジュールをつなぐためのコード)が不要になることや初期化処理が局所集中しないという部分は評価できる。

☆ Mix-Juice
http://staff.aist.go.jp/y-ichisugi/ja/mj/
・Mix-inについて:
http://www.ogis-ri.co.jp/otc/hiroba/technical/MixJuice/index.html
結局、Mix-Juiceでやっているのは、(いわゆる)クラス置換である。Aというクラスにごにょごにょ追加して(実際は派生させている)それをAと置換してしまう。元のAはA'とでも名づける。これだけのことである。この置換のためのpatchを、モジュールと呼んでいる。モジュールは、namespaceのように名前空間にあると考えられる。まあ、C++やJavaに当然必要な機能だろう。たとえば、visitorパターンでプログラムを書くときに、この機能が無いと元のクラスに手を入れることが出来ないので、他人のクラスに対してはvisitorは書けないのだが、Mix-Juiceではそれができる。

まあ、処理が局所集中しないというのは、それは長所には違いないのだが、ただ、モジュールが分散的になりすぎる。専用のエディタがないと管理しきれないのではないかと思う。

余談:Mix-Juiceでは、この差分モジュール機構の評価のためにテストコードのために1万行程度の大きなプログラムを書いて、それを成果としているそうなのだが、はっきり言って1万行程度では表面化しない問題が多すぎる気がする。yaneSDK3rdですら、30万行弱ある。せめて百万行は書かないと良し悪しを評価しきれないと思う。

☆ アスペクト指向プログラミング
http://aosd.net/
アスペクト指向プログラミングは、Mix-Juiceともやや内容が重複するので、これ以上は述べない。

あと、総合的なトピックになるが、

☆ オブジェクトの広場
http://www.ogis-ri.co.jp/otc/hiroba/
・バックナンバー
http://www.ogis-ri.co.jp/otc/hiroba/backNumber2003.html
・オブジェクト広場の歩きかた
http://www.ogis-ri.co.jp/otc/hiroba/HowToWalk/HowToWalk.html
あたりも軽く読んでおくと良いかも知れない。
まあ、言語開発関係で、主に話題にあがりそうなのはそのくらいだろう。