Lispとハッカー
正直言うと、Lispは10年くらい前に一度一通りなめただけで、「なんでこんな使いづらい言語を有り難がる人がいるんだろう」と思って放置していました。
こんな僕は当然、ハッカーを名乗る資格も語る資格もないのですが、最近Lispをもう一度勉強しようといろいろな本を読んでいます。
そのきっかけはこの本
Lispハッカーとして著名なポール・グレアムの本で、彼はLispを使って実際にWebサイトを作り、Yahooに買収され、Yahoo Storeになるなど、実際にLispで商業的成功を収めたという、珍しい人です。
ハッカーと画家、ブログの抜粋らしく、前半は退屈な部分も多いのですが、後半になるとぐんぐん面白くなります。
いかにして彼が世間と戦ってきたか。ライバルが一年かけて作った実装を一日で追加できたか。その武器はLispなんだと。
全ての高級言語はLispに向かっているのだと。
実際、最近話題に登るような言語、JavaScriptやRubyの特徴とされるいくつかの機能は、確かにLispがもともと持っているようなものが多いです。
僕が個人的に面白いと想ったのは、Lispは開発されたのではなく「発見されたのだ」という表現。
Lispはもともとプログラム言語としてではなく、ラムダ算法の計算モデルを論文で表現するために発明されたもので、考案者のジョン・マッカーシー自身もこれで実用的なプログラムが書かれることを想定していなかったといいます。
そもそも僕がなぜLispに興味が持てなかったのか、いま思い出しましたが、記号ばかりでなにが書いてあるのかわかりにくく、しかも方言が多くてライブラリに関するドキュメントも全て英文で、まあもちろん、一般的に動作する処理系が高校時代に手元になかったのも原因ですが、要するにそのとき最も興味のあったゲーム開発、とりわけプレステで動くゲーム開発に全く使える見込みが無かったというのが原因でした。だいたい、LISPで書いたコードがどうやってマシン語になるのか解りにくかった。それもこれも、これは人間の側からみたプログラムで、機械の側から見たプログラムではなかったのが原因だと思われます。
機械の側から見ると、マシン語をどんどん抽象化していくのが発展の方向性です。
だから、純粋な機械語を英略語(ニーモニック)に直訳してアセンブリ言語、数値計算をやりやすくしてFORTRAN、もっと解りやすくしてPascal、BASIC、それをさらに抽象化してC言語、それにオブジェクト指向っぽい機能を付け足してC++、メモリ管理を抽象化してJava・・・というように発展してきました。
マシン語大好きッコとしては、C++ですら許せなかった時期があったくらいですから、Javaに移行しようというのも随分勇気がいることでした。
そもそもなぜマシン語大好きッコになったかと言えば、BASICで書いたプログラムがあまりに遅かったため、当時の非力なハードを限界まで酷使しようと思えば、当然、マシン語の力に頼る必要があったからです。要するに3Dのゲームが作りたかった。
当時の僕は3Dのゲームが作れない言語なんか全部オモチャにしか見えなくて、そのための最短距離をずっと探していました。別にマシン語が使いたかったというわけでもなく、それが最短だった。LISPでも原理的には同じことができたはずですが、道のりが遠すぎたのでしょう。
現在はLispの方言の一つといわれるSchemeの実装のひとつ、GaucheでOpenGLのライブラリなどが公開されているので、その気になればLispで3Dゲームを実装することができます。
C言語野郎のまま家庭用ゲーム機のプログラマになって、それが生業になってしまったので、もうナチュラル・ボーン・マシン語人間。マシンの都合でしか物事を考えられない身体に。
ところがLISPは違う。まるで逆。
数学上の概念からスタートして、人間がどうやって思考をまとめてアルゴリズムの形にするか。人間から出発した「思考のまとめ方」をどんどんトップダウンしていったのがLISPの実装。だから機械語と完全に一対一で対応しないのです。
学生時代も、UnixよりもDOSで作業することの方が圧倒的に多かったので、EMACS-LISPの恩恵を受けることもなく、大学の授業もマジメにでていなかったのでそもそもUNIX環境を日常的に使うこともなかったため、せっかく面白い言語を学ぶ機会をみすみす手放していたのでした。大学はやはりマジメに通っておくべきだった。
三十路になって改めてLispを眺めてみると、これほど美しい言語はないかもしれない、と評価が180度変わりました。
まあこれは、もう、とにかくC言語大好き、マシン語大好きッ子だった自分が、PHPみたいな疑似言語を生業にするまでに丸くなったことの副作用かもしれません。
要するに社長になってみて初めて、「手早く書けた方が効率が良い」という当たり前のことに気づきました。
それまでは「相手よりも一枚でも多くの三角形を描画する」とか、「競争相手よりも一マイクロ秒でも早くHTMLを返す」とか、そういうことに血道を上げていたので、とにかくオーバーヘッドになりうるものは全て切り捨てていたわけで。
しかし実際に社長になってビジネスというものを根底から見直してみると、そもそも、相手より数秒処理が速いことは、経営効率を何ら向上させないのです。
待ち行列問題を考えてみても、サーバが二倍の速度で動作するよりもサーバを二倍の数に増やした方が結果的に多くのリクエストを処理できます。特にいまのサーバマシンはCPUパワーよりもバス幅やメモリ・ストレージアクセスの方がボトルネックなので、CPU時間をどれだけ節約してもバス待ちでサーバが仮眠状態になる時間が延びるだけです。
そうしたら短く簡単に書けるプログラムを沢山書いた方が良い。今のプログラムを2倍高速化する間に、マシンが2倍速くなって1/2のコストになっている可能性の方が高い、すなわちそれは4倍の効率化が自動的に行われるということです。
ということに今頃気づいて、近年はPHPやRuby、Pythonなども一通りかじってみたのですが、導入の簡単さではやはりPHPに軍配が上がってしまいました。最もダメそうな言語だけど、最も手軽だったからコレでいいやと思ってしまったのですね。実際、プログラムは最も早く完成します。javaなら「よーしやるか」と気合いをいれるまでの時間も含めて1日かかりそうな仕事が、PHPなら1時間で終わる。これならPHP使いますよね。
しかしPHPを使い込んでくると、「やっぱりこの言語はダメなんじゃないか」という思いもまた強くなってくるのです。
なにしろライブラリの名前に一貫性がない。
PHP3とPHP4とPHP5の間にろくな互換性も確保されていない。
PHP3で書いたコードをクライアントから引き継ぐと、もうぐちゃぐちゃでそのままではPHP4では絶対に動作しませんから。これは結構致命的です。
ではポストPHPとなると、候補はPerl、Python、Rubyのどれかとなりそうな予感がして、一通り調べたのですが、PHPよりも見た目の開発速度が上がるような気がする言語が凄く少なかったのです。
学習時間も考慮すると、どの言語も学習に時間が掛かります。この点、PHPは本当にアッという間にくだらないプログラムを書く程度には覚えられるので、誰かが書いたコードを見て修正するのがとても簡単。もちろん、それはコードがごく短い場合に限定されるのですが。
さらに、以前ここでも書いたように、PHP以外の言語を選択するとなると、今のところ趣味の問題として処理されそうなことがあまりにも多いわけです。例外はPerlくらいかな。mixiも使ってます、というのは言い訳としてでかい。
しかしPerlに移行するんならPHPとあまり変わらない気もしたり。
PHPの醜さはとにかく行き当たりばったりで発展してきたように見える、その増築構造にあるような気がして、では増築に最も耐性のある言語はなんですか、という話になったとき、もしかしてそれはLISPか?と思ったわけです。
たとえばLISPの場合、言語構造がこれ以上ないくらいにシンプルです。
覚えることも実は極端に少ない。
ただしいくつかひどい専門用語があって、たとえばcarとかcdrとかなぜその名前なのか、どうしてそうなっちゃってるのかわからないものが予約語だったり、tという、そのまんまな、いかにも変数に使ってしまいそうな文字がtrueを意味する予約後だったり、nullとnilという、似て非なる予約語(しかも他の言語とは意味が違う)が出てきたりと、「わざとやってるのか?」と思うくらい紛らわしい予約語もいくつかありますが、慣れてしまえば忘れてしまえるくらいにシンプル。
むしろtrueをtrueと書かずにtと書けることの喜びの方が大きいかもしれません。
また、LISPはANSIで定義された標準言語で、PHPのように会社の都合によって変わったり、PythonやRubyのように作者に万一のことがあればそれ以上発展するのが難しい言語とも違います。
まあなによりLISPは「スクリプト言語」ではない、本物のプログラミング言語です。LISP自体の大部分がLISP自身によって書かれています。そのうえ、やりたければマシン語にコンパイルも出来ます。ただ、それはLISPをLISPらしくないやり方で使う愚かな方法と呼ばれるかもしれませんが。
ボール・グレアムは「ハッカーと画家」の中で、「百年後の言語」という章を用意して、それを夢想してみようと語りかけます。
機械の都合ではなく、人間の創造力で発展させ、継続的に使える言語。
グレアムの主張によれば、言語にはそもそも優劣があるハズで、そもそも優劣がなければマシン語またはアセンブリ言語とPHPなどの汎用言語は等価ということになってしまう。実際にはそうではないから言語の優劣があるのだと。
時代時代で言語の流行が変わるのは、要するに、後の時代になった方が「より優れた言語」が生まれていくからだと。
その中でLISPは、FORTRANの次に生まれた高級言語でありながら、FORTRANとともに現在でも実用的に利用されている極めて珍しい言語です。
それがWebの時代にも通用するものだということを、グレアムは自らがViaweb(後にYahooに買収されてYahoo Store)というキラーサービスを開発して証明してみせました。
ではなぜLISPがマイナーなのかというと、単に「難しそう」に見えるからではないでしょうか。
カッコが多すぎて解りにくい。
普通のテキストエディタで書いたらかなり厳しい。
ところがEMACSのLISPモードで書くと、ビックリするくらい綺麗に書けます。
ほとんど迷いません。
EclipseにもLISP環境が最近リリースされたのですが(CUSP
)、これもEMACSとひけをとらない操作性です。
まあ今後どんな言語をメインにするか検討するのも重要なことなので、まずはこのLISPをもう一度覚えてみようか、と真っ先に購入したのが同じくグレアム著の「ANSI CommonLisp スタンダードテキスト」
なんでこの本をもっと早く読まなかったんだろう。
その言語を本当に愛している人が本当に解った上で解説する本って素晴らしいです。
言語の本というと、その言語の考案者が書くのがバイブル化するのが通例ですが、それだとどうしても他の言語との差異を強調するに留まり、「なぜその機能が便利なのか」「どのくらい便利なのか」ということについてはあまり強調されません。
もちろん、それはその言語を作った人があまりに思い入れたっぷりにそういうことを書くと、教科書としてはちょっとアレなので、ある意味で抑圧されて書いているのだと思います。
けど、グレアムはいろいろ差し引いて見ても心の底からLISP信者。LISPが他のプログラムよりなぜ素晴らしくて面白いのか、二ページ目で早くも解説しています。
Amazonの評価は決して初心者向けではない、みたいなものでしたが、LISP初心者の僕としては最初の出だしだけで引きつけられました。
言語解説の"スタンダードテキスト"としては出色の面白さではないでしょうか。
LISPの強力な機能。そしてグレアム自身が「オブジェクト指向なんか凌駕する」と呼ぶLISPの強力な再利用のための仕組みについて、ジェットコースターのように進みます。
この本、久しぶりに読んで得をしたと思える名著です。
LISPでWebサービスを作りたければ、いまはGauche+Kahuaなどの国産処理系やCLISPにはFastCGIパッケージが含まれているなど、いくつか選択肢がありますし、画像処理より記号処理に近いWebサービスにはもしかするともってこいかもしれません。
Kahuaを使うと、他の言語ではなかなか実現の難しい継続ベース(と言う言葉も最近知った)のWebプログラムもごく自然にできます。それにしてもKahuaはLeopardでうまくコンパイルできないので、なんとかして欲しいところです。










コメント 0