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から由来しているということも、経験者ならばたやすく理解できるようになります。
より抽象化のできる環境というのは、とても高い生産性を秘めているため、関数型言語を学ぶことで、これまで見えていなかったモノが、見えてくる可能性は十分にあるでしょう。