Joel Spolsky氏の「Can Your Programming language Do This?(君のプログラミング言語で、これ、できる?)」読了

Joel Spolsky氏の「Can Your Programming language Do This?(君のプログラミング言語で、これ、できる?)」を読みました。

様々なプログラミング言語にはそれぞれ特徴があり、ある言語でできることが、他の言語では書けなかったり、もしくは非常に汚いソースコードになってしまうことがあります。

今使っているプログラミング言語が、もしももっとスマートに書けたとしたら、それは本当に素晴らしいことですよね。

これから書くスクリプトは、javascriptで表現されていたものですが、この言語を知らずとも理解できる問題ですので、話を続けてみたいと思います。

alert("get the lobster");
PutInPot("lobster");
PutInPot("water");

alert("get the chicken");
BoomBoom("chicken");
BoomBoom("coconut");

もしも、上のソースコードが下のように、関数を変数のように渡すことができたら、同じような作業を一括でこなせますよね。
これならばC言語でも、関数ポインタを利用すればできそうです。

function Cook( i1, i2, f )
{
    alert("get the " + i1);
    f(i1);
    f(i2);
}

Cook( "lobster", "water", PutInPot );
Cook( "chicken", "coconut", BoomBoom );

また、いっそのこと、PutInPotとBoomBoomという関数もインラインで書けたなら、下のような感じになりますよね。

Cook( "lobster", 
      "water", 
      function(x) { alert("pot " + x); }  );
Cook( "chicken", 
      "coconut", 
      function(x) { alert("boom " + x); } );

こうなってしまうと、あらかじめ関数を宣言しておかなければいけないC言語では、無理な書き方になってしまいます。
無名関数の存在するプログラミング言語でないと、こういう書き方は難しいです。

「こう書けたら良いと思わない?」という発想のもとにソースコードを徐々に変えていきましたが、どうしても自分の使っている言語では、このような書き方ができません。

このような問題こそが、そのプログラミング言語の限界を表しているのでしょう。

そしてこの問題は、書き方だけの問題のみならず、その言語ができる機能をせばめていく問題へと発展します。

さきほどの無名関数が使えないばかりに、ある機能を実装することが非常に困難になる可能性もあります。

そして、このような便利な機能があることを知らないがために、より優れた発想をすることができないこともありえます。

関数型言語を知らない場合、mapとreduceがいかに並列処理に向いている関数なのか、どれだけ大規模な情報を効率良く処理できるのかも、知りうることはできないのです。

Googleの技術であるMapReduceは、関数型言語のmapとreduceから由来しているということも、経験者ならばたやすく理解できるようになります。

より抽象化のできる環境というのは、とても高い生産性を秘めているため、関数型言語を学ぶことで、これまで見えていなかったモノが、見えてくる可能性は十分にあるでしょう。