なぜCプログラミングは重要か

やることがあるので、現実逃避のために、適当に書いておくことにする。いや、なんか、昇格するんだったら、3000文字の文章を書かないといけないとか。明日までに。いや、なんか、面倒だわ。


言語の力とライブラリの力を分けて考えよう、とかの話。多分。


おとといはqsortを書いたんだけど、qsortといえば、Haskellだ。Haskellといえば、「クイックソートを書くための言語」であることは、僕の中で有名な話だ。
http://web.yl.is.s.u-tokyo.ac.jp/~ganat/memo/aboutHaskell.htmlによると、

qsort []     = []
qsort (x:xs) = qsort elts_lt_x ++ [x] ++ qsort elts_greq_x
                 where
                   elts_lt_x   = [y | y <- xs, y < x]
                   elts_greq_x = [y | y <- xs, y >= x]

これぐらいになって、それが、短く、読みやすいから、HaskellはCよりもイイよね。っていう話になっている。


が、しかし、だまされて(?)はいけない。実に、ここで、C側はわざとにわかりにくいコードで書いてあることは明らかだ。ここで、CがHaskellと対等な比較をするためには、こういうコードで比較してやらないといけないはずだ。
さらに言うなら、このコード、コメントで「ここまでが、…」の部分より、上の部分の処理は、コメント中でも書いたとおり、Haskellの色々な演算子によって呼び出される暗黙のライブラリとして含まれてるといってもいいだろう。(いや、よくないけど)
つまり、単純に、クイックソートアルゴリズムだけならば、Cでも、

static struct node *
qsort_list( struct node *src )
{
    int headval;
    struct node *head, *less, *greater;
    if ( src == NULL )
        return NULL;

    headval = src->val;
    head = new_node(headval,NULL);

    less = qsort_list(filter_int(src->chain,lt,headval)); /* 小さいほう */
    greater = qsort_list(filter_int(src->chain,gt,headval)); /* 大きいほう */

    return append( less, append(head,greater) );
}

このぐらいにまで書けるわけだ。
リストをくっつけていく方法によるソートは、Cで書くのが不可能なわけではない。だが、それをやらないで、配列のソートというわかりにくい方法でわざと書いて、「Cはわかりにくい」というレッテルを貼るのはひっじょーに、よろしくないと思う。


Haskellクイックソートが短く書けるのはともかく、「わかりやすく書ける」という点において、重要なのは、「Haskellが純粋関数型言語だから」ではなく、「リスト用の演算子とライブラリが揃ってたから」だ。Cでも、リスト用のよくできたライブラリさえあれば、同じようにわかりやすく書けるのだ。ここらへんを見誤ると、状況にあった言語を選ばないといけないときに、選択を誤る可能性がでてくる。言語を比較するときは、常に、「それが、言語の力によるものなのか、ライブラリの力によるものなのか」を、まあ、なんか、アレしないといけない。


例えば、このクイックソートの場合、どこらへんが言語の力によるものなのかを考える。
まず、一番重要なのが、Haskellのほうは整数以外もソートできるという点だ、と思う、多分。Cのほうでも、無理矢理、voidポインタを駆使すれば、型多相なソートが書けないわけではないけど、その場合は、型チェックを捨てないといけない。こういうのは、まさに、「言語の力」と、呼ぶべき点だろう。
あと、この場合だと、演算子を定義できるのもHaskellの良い点だろう。やっぱ++のほうが見易いような気がする。


GCは…どっちかというと、ライブラリ力のほうになるような気が。(だんだん自信が無くなってきたらしい)
遅延評価があるから、最後までソートしないかもしれない…のかどうかはわかんない。


まあいい。まあいいんだ。しかし、この話にはそもそも問題があった。なんと、現実の問題において、「言語の力が勝敗を分ける」なんてことはまずまずありえないのだ。イっちゃってるプログラマほど、脳内の色々評価優先順位が

言語力 >> ライブラリ力 >>>>>>> (越えられない壁) >>> その他雑多な問題

とかなってしまいがちだけど、実際の問題なんて、

人 > 金 >>> その他雑多な問題 >>>>>> (越えられない壁) >>>>>>> ライブラリ力  >>> あとオマケ

なんていうようなもんなんだよ。Ha-Ha-Ha-。
いや、しかし、頭では「現実の問題では言語力は一番どうでもいい」ていうのがわかってるのに、どうして、こう、言語の美しさエレガントさ強力さに一番心が揺さぶられるのだろうか。それは、まあ、アれダよ。アレ。使えない技術者はこう、なんか、アレなんだよ。大体こういう風に「技術ではなんともならない問題のほうが多い」とか言ってるときは会社やめたくなってるときなんで、気にしないで、ここまで2521文字。まあ、なかなか頑張ったほうだね。これからこれよりもちょっと多い量のテキストを無理矢理捻出しないといけないわけだ。もう寝る。寝ちゃだめだよ。