このページの本文へ

前へ 1 2 次へ

タイムインターメディアが「HOPプロジェクト」始動

注目ワード“高階プログラミング”って何だ?

2008年08月05日 21時24分更新

文● 吉川大郎/企画報道編集部

  • この記事をはてなブックマークに追加
  • 本文印刷

「言語としての敷居は低い」

――編集部 高階プログラミングを技術者が修得する際のハードルはなんですか?

 視点を変えなくてはいけませんね。おおよそのイメージは沸くのかもしれませんが、多分、従来のオブジェクトオリエンテッドな手法を使っている人は、今までの話を聞いて、「高階プログラミングは難しいことでもなんでもない」と思っているのではないかと思います。ただ、やり始めると、「何か違う」という違和感を持つはずです。想像の範囲を超えている部分があって、やりにくい部分も出てくる。自分たちがやってきたことを、高階プログラミングの世界ではどうやるんだ? という疑問が出てきてしまうと思っています。高階プログラミングとオブジェクトオリエンテッドなプログラミングは、延長線上にないのです。そこに気が付いたとたんに、「難しい」と思ったり、逆に「必要なのか?」 と思ったりするのではないかと思います。

Lisp系の言語や関数型言語は異端視されているところもあって、シンタックスが()だらけでヘンとか、誤解もありました。ただ、「いままでにない表現力や抽象力がある」と分かれば、シンタックスがヘンというのは、その表現力の源であることが理解できるようになります。

 プログラマの皆さんには、今までのスキルが使えないという誤解があるかもしれません。しかし、Kahuaという、Gaucheを使ったフレームワークがあるのですが、それを開発したときには、Scheme使いと言われたのは、1人だけでした。Gaucheを書いた川合さん(Scheme Arts, L.L.C. 川合史朗氏)しかいなかったのです。私はHaskellのプログラマでしたし、他のメンバーもPython、Perl、Ruby、Javaのプログラマでした。皆、慣れない言語というもどかしさ最初ははあったと思いますが、Kahuaはそういう、他の言語を使っていた人たちが、Gaucheで作ったものなのです。

 「言語としての敷居は低い」。HaskellやLispはそういうものだと思って使えば、覚えることは少ないのです。なぜかというと、抽象度が高いからです。細かいことは考えなくて良いのです。優秀なプログラマほど、考えられるレンジが広いから細かいところが気になるとは思います。もちろん、LispやHaskellも、非常に細かいところも出来ます。しかし「そこは考えなくてもいい」という考え方に慣れるのが必要になります。また、いわゆるデータ……数字や、データ構造があるデータをプログラミングするのではなくて、プリミティブは考えますが、それをどう組み合わせるか? という考え方なので、そこもシフトが必要になります。

関数は素子

――編集部 高階プログラミングを広めていくために何が必要だと思いますか?

山下氏 「Haskellプログラミングの楽しみ方講座」を2週に一回やっています。少しだけ紹介すると、論理回路を構成するような問題を高階プログラミングでどのように扱うか? といったお話をしています。

ここでポイントなのは、関数を素子だと思うことです。従来のやり方では入力されたデータの変化を追うのでANDやOR、NOTといった論理素子の配置を想像しなかったのですが、高階プログラミングを考えれば楽に想像できます。

山下氏がHaskellプログラミングの楽しみ方講座で使った論理回路の図版(左)とそのコード(右)。ANDやORといった“素子”を並列に組み合わせることで、新しい関数を記述している

 私はよく言うのですが、高階プログラミングは、“傲慢なプログラミング手法”とも言えます。欲しいモノを手に入れたら“こうなっているはずだ”という、考え方としては、「コレを入れたらコレが出てくるはず」というものなのです。

 出来るだけ正確に自分が思っている事を表現しようという場合は、関数プログラミングが向いています。入力にしか依存せず、出力しか相手にしない。「こういう入力があればこういう出力が返ってくるはず」という傲慢なプログラミングなのです。

 もちろん、新しい言語を覚えるのは面倒だという話もありますが、それはどんな言語でも一緒です。新しい言語を覚えるのはたいへんそうに見えますが、LispやHaskellが覚えるのが難しい言語なら、人に勧めませんし、私も使っていません。

 「メモリは今どーなっている?」とか、「アロケーションしたか?」とか、オブジェクトのライフサイクルや、オブジェクトがいつ状態を変えたかを気にしなければいけないのでは大変です。計算をオブジェクトの生成や変更の順序ではなく、また制御構造ではなくて「値」のみで考えるので,シンタックスは簡単になります。Schemeなら'('と')'とスペースだけという極端さです。

 考え方をちょっと変えるだけでよくて、その考え方をサポートしている言語を使ってみると、なんだ簡単じゃん! ということになるのです。JavaでもRubyでも、出てきたときに新しく覚えてプログラミングした人がいました。そういう人たちにとって、新しい高階プログラミングという考え方を示していくことはできると思っています。

 実行速度に関しても、今までは、記号処理などの演算が高価だった時代もあって、遅くて使えないと思っていたし、出来るとも思っていなかったから、プログラムでできるとは思わなかった。実行速度は全てにおいて優先しなければいけないものでした。しかし今時そんなことは言わない。そうでなかったらRubyやPerlを使うわけはないのです。

 もっとも、何年か前から世界的にLispと言い出したのは、ポール・グレアムというひとの存在が大きくて、彼のプロモーションというか、アジテーションがみんなの注目を浴びたということもあります。「全てのプログラミング言語は、結局は50年前に生まれたLispに向かってゆっくり進化している」というのが、彼の弁です。

 「EDSL(Embeded Domain Specific Language)=特定問題領域言語」というものがあります。ある特定分野に特化した言語という意味ですが、汎用プログラミング言語でそれを作ってしまえということは、Lispが昔からやっていたし、関数プログラミングはそれしかやっていないとも言えます。そういう考え方が、みんなの口に上ってきた。それは、ある意味必然でしょう。

面白いから使う

 もっと言ってしまうと、こういうプログラミング言語を使うのが面白いのです。ならば仕事で使えれば嬉しい。高階プログラミングの言語を使った場合、システムの保守はどうするのか? といった問題がネックになってきますが、そもそも保守というものは新人がやったり片手間でやれるものではありません。しかし現実には、新人プログラマが行っていたりします。ならば、そういう作業が簡単にできる言語を使ってもいいのではないかと、個人的には考えます。マイナーではあるけれども、強力な言語を使ったほうがいいのではないか? ということです。

 高階プログラミングを使うお手伝いをする体制を整えます。また、Kahuaなどによってキラーアプリが出てくる土壌を増やしていきたいという思いもあります。高階プログラミングという言葉が、バズワードでもなんでもいい。それでも良いからまずは注目してもらいたいですね。「実際に使いたいけど、コンサルして」と言われたら、実行できる体制を作るので、やってみてください。

前へ 1 2 次へ

カテゴリートップへ