Wasabi
From The Joel on Software Translation Project
Joel Spolsky / 青木靖 訳
2006年9月1日 金曜
私がさっきFogBugz専用のWasabiというコンパイラがあると言ったのを冗談と思った人たちもいたようだ。
Wasabiは本当に実在している。FogBugzの顧客は、それを自分のサーバで動かしている。だからFogBugzは何十万という「野生の」Webサーバ上で動かせる必要があるのだ。プログラマが配備環境を完全にコントロールできるほとんどのWebアプリケーションとは、その点で違っている。私たちは箱から出してすぐに使えるプログラムを出荷する必要があり、これは最小公分母しか前提とできないことを意味する。
これはあまり普通のことではない。Web開発者の多くは、1つの顧客のために開発しているか、あるいは自分でホストするアプリケーションを開発している。そういうのは結構な身分だ。しかしFogBugzの顧客は自分の貴重なプロジェクトデータを誰か他人のサーバに置いておこうと思わない。だから私たちは彼ら自身のサーバにインストールされるソースコードを売る必要がある。
今日の配備サーバの多くで最小公分母と言えるのは、VBScript(Windows)、PHP4とPHP5(Unix)だ。サーバにこれ以上気の利いたものを要求するとしたら、テクニカルサポートのコストが劇的に増えることになるだろう。PHPはWindows版もあるが、プリインストールされてはいない。そして私はWindows版の顧客がPHPをインストールするのを助けるためにエンジニアの手を煩わせたくはない。.NETを使うこともできたが、そうするとUnix版の顧客にMonoをインストールしてやるエンジニアを雇わなければならなくなるだろう。それに.NETランタイムはWindowsサーバにおいても遍く行き渡っているわけではない。
私たちはプログラムをVBScriptやPHP4はもちろん、PHP5でも書きたくなかったし、3つのターゲットプラットフォームに何でも移植するようなことはなおさらしたくなかった。私たちにとって最善の解決法は、ターゲットプラットフォームへとコンパイルされるカスタム言語を使うことだ。
「ほげプログラマ」ではない私たちは、クロージャ、アクティブレコード、ラムダ、それにLINQのような埋め込みSQLを使いたい。だから私たちはWasabiにそのような機能を付け加えた。
FogBugzは何年も昔からあり、元々はVBScriptで書かれていたため、WasabiはVBScriptと100%後方互換性があるが、"""で複数行文字列を作れるとか、Dim a = 0と書けるというような自明な改良も行っている。
このようなコンパイラを作るのが、ドラゴンブックを読んだ才能ある人間にはたかだか2ヶ月くらいの仕事でしかないことを、多くの人は理解していない。このコンパイラにはコンパイルすべきプログラムが1つしかないため、ずっと簡単に書くことができるのだ。それは汎用的なコンパイラである必要はなく、たとえば数学ライブラリなどは必要とならない。
そして私たちは、この言語に必要と思う機能を簡単に追加できる・・・これはポール・グレアムがOn Lispで語っているのと同じパワーなのであり、自分のアプリケーション領域にふさわしい新しい言語機能を作り出すことができる。Lispの場合、これはマクロと呼ばれるメカニズムで実現されている。
Wasabiに新しいバックエンドを追加するのはすごく簡単だ。顧客のWindowsサーバ環境で.NETがもう少し普及するようになったら、CLRバックエンドを追加して、バイトコードの生成なんかをやろうと計画している。そうすればプログラムはずっと速くなるはずだ。
専用コンパイラのもうひとつ気の利いたところは、クライアント側(Webブラウザ)で何かやろうと思ったとき、コードをWasabiで一度書けば良く、それをブラウザ用にはJavaScriptにコンパイルし、サーバ用には同じ機能のVBScriptやPHPにコンパイルすることができることだ。たとえば、ブラウザ上のボタンクリックで込み入ったHTMLをサーバに戻ることなくレンダリングするというAjaxでやるような「プレビュー」機能を実現したいが、サーバでも同じ込み入ったHTMLのレンダリングができなければならないという場合でも、レンダリングのためのコードを別な言語で2度書く必要はなくなる。
しかしこれには大きな弱点もある。ドキュメンテーションが少なく、あまり整理もされていない。私たちはVBScriptと違う部分についてドキュメントを書いているだけで、言語全体についてのドキュメントはないからだ。Fog Creekに加わるプログラマは軌道に乗るまでに少し時間がかかることだろう。それに私たちの「編集 – コンパイル – テスト」ループは、ステップが1つ増えた分だけ遅くなる。
あなたは自分のコンパイラを書くべきなのだろうか? もしあなたのやっていることがメインストリームのものとは十分に異なっていて、その問題を解決できる適当な出来合いのテクノロジーがないのだとしたら、書いた方がいいかもしれない。あなたの対象とする領域でドメイン特化言語が有効である可能性は十分にある。たとえば納税申告書を作成するプログラムを書こうとするなら、たぶんフィールドが自動的に計算されるフォームを記述するのに最適化された言語を作りたくなるだろう。そうすれば、あとやらなきゃならないのは、その言語でそれぞれの申告書フォームを記述することだけだ。3Dゲームプログラムを書いているのなら、マップやレベルを記述するのに最適化された言語を作り、それを使ってそれぞれのレベルをデザインしたいと思うだろう。しかし出来合いで使えるものがあるのなら、どうあってもそれを使うべきだ。あなたがすっかりトラブルに見舞われ、その出来合いのツールが機能せず、それを修正することもできないというのでない限り。
(オリジナル: Wasabi)
