エンジニアのソフトウェア的愛情

または私は如何にして心配するのを止めてプログラムを・愛する・ようになったか

「手続き的」と「宣言的」のはざまで

lis.py → lis.rb → lis.hs …ときたので、当然のように lis.cpp に挑戦している最中。
現在いささか苦戦中なので、C++のコードをポストするまでのあいだに気がついたことを、めも。


Haskellで書いたとき、関数を評価するコードではまったことはすでに書きましたが、苦戦したのがもう一カ所。入力されたプログラムをパースするところ。具体的にはread_fromread_from'read_listの各関数のところ。ここだけやたらと手続き的になっています。少なくともそう感じながら書いていました。同時のここは、関数型言語でよく使われる再帰呼び出しをともなうコードにもなっています。慣れている人でしたらどうということはないのかもしれませんが、このふたつの折り合いをつけるのに苦戦してしまいました(repl関数も手続き的かつ再帰呼び出しですが、これは一連の手続きを順に踏んだあとに最初に戻るだけなので、難しさはありませんでした)。


Rubyは(Pythonも)その点がとても柔軟で、基本は手続き型なのに宣言的に書くこともできてしまいます。tokenizeメソッドは見た目も宣言的。read_fromメソッドはとても手続き的。
evalメソッドは見た目は手続きっぽいけれども、実のところ宣言的。なのでHaskelleval関数に書き直したときも、はまってしまった関数の評価を除いては、ほぼそのままHaskellに持っていくことができました。


で。C++で書こうとしたときにぶつかったのが、すべて手続きで書かないとならないというところ。たぶん、先に書いたRubyHaskellのコードを忘れて書いたならもっと楽に書けたのかもしれません。そこをあえて翻訳してみて、この壁が以外と大きいことにあらためて気付かされました。簡単に言うと…

「全部手続きで書くのがこんなにめんどくさいとは思わなかった」


ずいぶん経ちましたが以前にも「C++を使ってる場合じゃない」と書いたことがありました。C++C++で適切な分野がありますし、重宝されている言語だと思いますし、わたし個人的にも好きですし。
でもやっぱり。生産性や簡便なコードを書けることを考えると、もっと積極的に宣言的な記述ができる言語を活用していかないと、ユーザが求めているものを求めているうちに提供することはますます難しくなっていくように思えてなりません。


一方、プログラマの立場として。手続き型の言語でプログラミングを学んできた場合、宣言型の言語を改めて習得することの難しさはどのぐらいのものなのでしょう。
これもまたどこかで訊いて回ってみたい気がします。