node.jsとは何か(3)

今日はnode.jsで採用しているCommonJSの話である。
CommonJSの説明だけだとあっという間に終わってしまうのでJavaScriptの歴史を混ぜ込んだら期せずして長くなってしまった。

さて、1995年に発表されたJavaScriptは開発当初「Mocha」と呼ばれ、次に「LiveScript」となり(実際Netscape Navigatorの2.0のアルファ版ではではこの名前だった)、最後にようやくJavaScriptになる(Navigatorの2.0B3から)という変遷をたどった。このJavaScriptという名前っていうのはJavaというコンパイル言語を補完するスクリプト言語にしたいという考えがあったからという話もあるんだけど、そのころ開発元のNetscapeはSunとの業務提携を発表しており、ちょうどそのころJavaが世に出てNetscapeブラウザ上でクールなJavaアプレットが動くんだぜなんて発表されて世間が沸いていたもんだからマーケティング上、Javaの冠をかぶせてその人気にあやからせてもらおうとNetscape側が思っていたとしても全然おかしくない。むしろそちらのほうが自然に感じる。

で、1996年にMicrosoftJavaScript互換の言語を作るんだけど商標問題を避けるため、JavaScriptという名前を自社製品で使うことができなかったので結局JScriptという「心中お察しください」的な名前を使うことになる。

その後Netscape社はJavaScriptの地位を確固たるものにしようとしてその後ECMAという機関に標準化を依頼し、仕様が決まるのは1997年の6月のこと。結果としてECMAScriptという名前で標準化されたんだ。この4カ月後の10月にはMicrosoft陣営はInternet Explorerの4.0にてこのECMA-262 1st editionに準拠したと宣言する。ま、名前はそのまま変わらずJScriptなんだけどね。ただ、その仕様をもとにブラウザ間でのスクリプト動作の互換性が向上することとなる。

このころ大変だったのはそれを使うユーザ側。なんせJavaJavaScriptJScriptなんてあるもんだから、そりゃまあ混乱するのは目に見えていた。
本屋に行けば JavaJavaScript の本がごっちゃになってるし、採用担当の面接官もJavaScriptができるっていうのを勝手にJavaできるって勘違いするし、ただでさえバグの多い実装がバグの多いブラウザに乗っかってるせいで、セキュリティ関連の問題がぶわっと噴出するしね。だからJavaScriptを動作しないように設定していた人も多いんじゃなかろうか。このような黎明期の混乱のおかげで不幸なことに「トンデモ言語」的なイメージがJavaScriptに定着してしまうことになるんだ。

この後、1999年にIE5でActiveXとしてまず実装され、その後Mozilla系ブラウザやサファリでも実装されたXMLHttpRequestの登場がJavaScriptの転機を担う。ま、このへんからは説明もいらないと思うんだけど、そのXMLHttpRequestを利用した技術が2005年にAjaxと名づけられ、Google Mapでその技術が採用されるや否や爆発的な人気を獲得する。その後も続々とこの技術を利用するライブラリやフレームワークが開発され、現在ではWebアプリケーションを作成する上で欠かすことのできない言語となっているってわけだ。


で、話をECMAScriptのところまで戻すよ。
いわゆるJavaScriptベースと言われる言語の結構な割合が ECMA-262 3rd Edition をもとにしている。ActionScriptもその一つだ。

仕様書は下のリンクからダウンロード可能だ。
http://www.ecma-international.org/publications/standards/Ecma-262-arch.htm

この仕様書を見れば分かる通り、仕様ではいわゆる文法的なものが規定されており、さらにはクラスベースじゃなくってプロトタイプベースのオブジェクト指向言語なんだよーってこと程度しか書かれていない。この規定範囲の小ささが後になってCommonJS設立の動機の一因となるんだけどひとまず置いておこう。
それとここで ActionScriptってクラスベースじゃんよーって思った人もいるかもしれないがASでクラス使えるようになったのは2.0からだ。ちなみにその辺のActionScriptオブジェクト指向サポートの変遷については以下の資料が詳しい。
http://www.adobe.com/livedocs/flex/3_jp/html/help.html?content=04_OO_Programming_12.html


さあ今日ようやくここでnode.jsに関連する話になるんだけど、じゃあnode.jsで採用されているV8ってどうなのか?V8のサイトを覗いてみれば分かる通り ECMA-262 3rd Edition に基づいているよって記述がある。でもその上にGoogleオープンソースJavaScriptエンジンって記述もある。

これを分かりやすく言いかえると
JavaScriptECMAScriptの方言である。
とするならばJavaScriptの実装(ここで言うとV8)はECMAScriptに準拠する。
ってことだね。


で、CommonJSの話。

node.js 以前にもさまざまな Server Side JavaScript の実装があったのはご存じの通り。RhinoSpiderMonkeyのようになかなかポータブルなものからAptana Jaxerのように巨大なヤツ(というか全部入りのフレームワークだもんな)、V8でもv8-cgiっていう、V8をウェブアプリ書くのに使えるようにって試みもあった。そんな中、とあるエンジニアが乱立するServer Side JavaScriptの独自進化を憂い、サーバーサイドのJSには何が共通して必要とされるのかを考え、2009年1月末に自分の意見をブログで公開して議論の場となるメーリングリストを設けた。

これがCommonJSの始まりである。

以下がそのブログ
http://www.blueskyonmars.com/2009/01/29/what-server-side-javascript-needs/
ちなみに著者であるKevin DangoorはPythonウェブアプリケーションフレームワークTurbogearsやPaver、JS界隈でいうとDojoやBespinなんかを開発してきたエンジニアで現在はJSの本丸(?)、Mozillaで働いているという経歴の持ち主だ。

で、CommonJSが解決しようとした問題領域は

  • モジュール機構がない。
  • 標準ライブラリがない。
  • ウェブサーバーやデータベースとの標準的なインターフェースがない。
  • パッケージのマネジメントシステムがない。

といったことなど。要するにブラウザ以外でJavaScriptを利用する際に問題となる領域の解決を目指しているんだよね。

で、CommonJSで策定済み、もしくは策定中の仕様の一覧は以下のページにまとめられている。
http://www.commonjs.org/specs/

このうち、node.js が準拠しているのは現在のところ Module 1.0とUnit Testing 1.0のみだ。
http://wiki.commonjs.org/wiki/Modules/1.0
http://wiki.commonjs.org/wiki/Unit_Testing/1.0

仕様を見てみれば分かる通り、その内容はごくわずか。
だからnode.jsはCommonJSに準拠して云々というくだりで何やら難しそうだなんて思う必要なんか全然ないからね。

内容の割に長くなってしまったけどnode.jsとCommonJSについての話はこれくらい。
次回はいよいよ実装の話に移っていくつもりである。