クエリ・プログラミングというプログラミングパラダイムの話
僕の知らないパラダイム
プログラミングパラダイムは考え方の型だ。多くのパラダイムが創り出されるにつれて、プログラミングの可能性が広がってきた。つまり、昔出来なかったこと、難しかったことが、ずっと簡単にできるようになってきた。
出来ないことはもっと増えた。簡単にできることが増えるほど、人間のやりたいことは増える。巨大な問題群は互いに複雑にからみ合い、把握しがたくなる。
例えばウェブで情報を探す時、昔だったら、リンクを辿っていけば、目当ての情報に辿り着いた。情報が増えると、ディレクトリー型検索サービスを使って探すようになった。今では当然みんなググっている。(それはGoogleじゃないかもしれない。)
この例えを、プログラミングに当てはめたらどうなるだろうか? 今日のプログラミング言語は、モジュール化されていて、大抵のオブジェクトにはディレクトリー構造の名前が付いている。すると、将来は「ググるように書く」ようなプログラミング方法も出てくるのではないか?
問い合わせプログラミング
「出てくるのではないか?」と書いたけれども、既に似たようなものはある。「ググる」という操作、つまり問い合わせは、データベースでは当たり前で、データベースに対して問い合わせして、取得したデータに一括処理を行う。
jQueryや.NET FrameworkのLINQは、データベースに対して問い合わせするように、DOMや配列といったデータに対して問い合わせて、処理できる。これはクールだ。
jQueryはDOMに対して問い合わせるし、LINQはもっと色々なデータに対して問い合わせできるけれども、いっそのこと全部のデータ構造を問い合わせ可能にすればいい。何でも問い合わせ可能なプログラミングということで、これを仮にクエリ・プログラミングと呼ぼう。
なんでもクローリング
Googleは、あらゆる物を検索可能にしようとしていて、いつでもウェブに対してクローリングを行なっている。だったら、プログラムで扱うデータも全部クローリングしたらどうだろう?
クエリ・プログラミングにはクローラが存在していて、すべてのデータ構造を検索可能な形にし、問い合わせに素早く答える機構が存在する。
もちろん効率の問題があるから本当に全部を検索可能にするわけには行かないだろうけれども、最初は部分的に検索可能にするところから始めればいいし、相応の利益があれば効率は後から付いてくるはずだ。
ジャーゴンの多いプログラミング・名無しの森のプログラミング
プログラミングをするときには、沢山の識別子が出てくる。識別子は不可欠だが、悩みの種でもある。
識別子は恣意的に付けられるから、プログラムに識別子を使うと、プログラムの働きは識別子の定義に依存することになる。プログラムを読む人は、新しい識別子が出てくるたびに定義を読みにいかないといけない。
識別子を少なくすると、分かりやすくなる。Perlの代名詞変数も、ポイントフリースタイルも、そういう意味があるのだと思う。複雑な作業では、識別子を使ったほうが分かりやすいこともあると思うけれども。
クエリ・プログラミングでは、識別子は少なくなる。データは問い合わせ可能なので、使いたいデータを問い合わせて取ってくればいい。データは識別子という「固有名詞」ではなくて、用途に合わせて「一般名詞」と「形容詞」で問い合わせて参照するから、プログラムとデータは疎結合になり、再利用性は高くなるだろう。
問う言葉
jQueryはDOMに対してCSSセレクターで問い合わせする。クエリ・プログラミングで使う問い合わせ言語は色々考えられる。柔軟な方法でデータを指定できる言語があると良いだろう。関数やライブラリなども問い合わせ可能な言語を考えられるだろうか?
ガーベジコレクション問題
クエリ・プログラミングは、ヒープのデータに対して問い合わせをしてデータを取得する。データには識別子、つまりポインターが無いから、ポインターが捨てられる時というものも無い。だから、ガーベジコレクションはポインターに頼らずに、不要なデータを判別して捨てなければならないから、何か別の方法を考える必要がある。データに寿命の設定を義務付けて、寿命切れのデータは捨てるようにするとか。