Webに生まれてWebを席巻するプログラミング言語・JavaScript

坂田さんの前回記事「JavaScript runs on GeneCode Server.」は、ジーンコードとJavaScriptの関係を述べたものでした。その前回記事の、次の一節を敷衍したいと思います。

我々をApacheからJavaScriptをコールするという技術的困難に挑戦させたものは、JavaScriptこそがクライアントやサーバーの枠を超えた未来のメジャー言語になるだろうという予測があるからです。

内容:

  1. 10日間で急造されたプログラミング言語
  2. 超高速な処理系達
  3. Web言語の共通ターゲット言語としてのJavaScript

10日間で急造されたプログラミング言語

めまぐるしく変化すると思われているITの世界において、プログラミング言語は、驚くほどに寿命の長いものです。いまだ現役のFortranをバッカスが考案したのは1954年ですし、関数型言語の嚆矢Lispは、マッカーシーにより1956年に着想されたものです。当然に進化・変化はあるものの、半世紀以上に渡って使われ続けているのです。

それら古参のプログラミング言語に比べれば、1995年に生まれたJavaScriptはまだまだ若い言語といえます。しかも、登場からしばらくはブラウザのオマケのような扱いで、開発言語として見直されたのは、2005年頃「Googleマップ」などによりAjax技術が注目されてからでしょう。

筆者(檜山)も、JavaScriptを意識したのは世間のAjaxブームに触発されての事でした。2005年のブログ記事を読み返すと、当時の感覚がよみがえります。

JavaScriptは、ネットスケープコミュニケーションズの技術者だったブレンダン・アイクによって作られたプログラミング言語です。極めて短期間で設計と実装がされたようです。

W3Cサイトの”A Short History of JavaScript“によれば、

JavaScript, not to be confused with Java, was created in 10 days in May 1995 by Brendan Eich, then working at Netscape and now of Mozilla.


JavaScript(Javaと混同しないでください)は、当時ネットスケープに勤務していた(現在はMozillaコーポレーション)ブレンダン・アイクによって1995年5月、10日間で作成されたものです。

なんと10日間で設計(実装も? まさか??)されたようです。どんな優秀な技術者でも、10日間でマトモなプログラミング言語を設計するのは無理でしょう。そうです、JavaScriptはちょっとマトモじゃないのです。非常に厳しい時間的プレッシャーのなかで、余分な機能は削り落とされ、短期間で実装可能なメカニズムが採用されました。今となってみれば、それがJavaScriptにさまざまなメリットを(そして少しの災難を)もたらしたのです。

超高速な処理系達

かつては、プログラミング言語は低水準なほど速いと思われていました。人間にとって分かりやすく書きやすいスクリプト言語は、速度/効率を犠牲にしているのだ、というわけです。しかし、最近の言語処理技術の発展により「低水準だから速く、高水準だから遅い」という常識は覆されました。むしろ、高水準なプログラミング言語のほうがより速くなるケースもあります。

C言語のような(高水準言語のなかでは)低水準なプログラミング言語は、古典的なメモリーモデルや実行モデルを想定して設計されています。この想定は言語の根幹に関わるので、そうそう変更はできません。これが足かせとなって、最近のハードウェアに向けた最適化がやりにくい事態も起きます。一方、JavaScriptのような高水準スクリプト言語は、ハードウェアに対するモデルを持たない(より抽象度の高いモデルを持つ)ので、最新の賢いコンパイラが、その能力を存分に発揮する余地があります。「低水準だから遅く、高水準だから速い」と逆転させるのは余りに短絡的ですが、「高水準言語だって十分に速くなる」とは言ってもいいでしょう。

実際、Chromeブラウザに搭載されたV8エンジンのパフォーマンスは目を見張るものがあります。V8エンジンはサーバーサイドJavaScriptプラットフォームnode.jsでも採用されています。そして、ジーンコードのJavaScriptエンジンもまたV8です。V8エンジンは優秀なのですが、V8一択だと競争原理が働かないので好ましくないでしょう。大丈夫! 他のブラウザベンダーもJavaScriptエンジンに力を入れています。

FirefoxブラウザのJavaScriptエンジンは、SpiderMonkeyと呼ばれていました。Firefox 3.5あたりから、言語処理技術の発展に合わせてJavaScriptエンジン(言語処理系コンポネント)の名称も変えているようですが、*Monkey(ナントカお猿さん) というネーミングパターンを守っていますね :-) 最新版は OdinMonkey。asm.js(アセンブリJS)という、コンパイルターゲット言語を設定して最適化を頑張っています。

SafariブラウザはNitoroエンジン、IEブラウザ(IE9以降)はChakraエンジンを搭載しており、それぞれに処理系の改善を推進しています。OperaはV8に切り替えるようで、OperaオリジナルのJavaScriptエンジンCarakanは消え去る模様です。

いずれにしても、JavaScriptエンジンは、HTMLレンダリングエンジンと共にブラウザ・ウォーズの主戦場です。現在でも既に、我々はたいへん高速な処理系の恩恵にあずかっていますが、将来にはさらなる最適化が期待できるでしょう。「10日間で作成された」シンプルさが、高速化/最適化にプラスに作用しているのです。

Web言語の共通ターゲット言語としてのJavaScript

JavaVM(仮想マシン)は、当初Java言語のエンジン(実行環境)として登場しました。バイトコードの仕様が公開されていたために、Java以外の言語の実行にJavaVMを使う試みがなされました。今では、Scala, Groovy, Clojure, Jython, JRuby などがJavaVM上で実行できます。

現在のJavaScriptエンジンには、JavaVMのバイトコードのような共通仕様は存在しません。前節で触れたFirefoxのasm.jsは、JavaScriptのためのアセンブラ言語の位置付けですが、バイトコードのようなものではなくて、JavaScriptのサブセットと思っていいものです(数値の扱いなどに低水準の匂いがしますが)。

asm.jsの仕様を眺めると、筆者(檜山)はNekoVMとNeko言語(http://nekovm.org/)を思い起こします。NekoVMはNeko言語を走らせるためのランタイムエンジンですが、他の言語のコンパイルターゲットとしての用途も想定しています。実際、Nekoと同じ作者(Nicolas Cannasse氏)によるHaxe (ヘックスまたはエックス、http://haxe.org/)は、Nekoにコンパイルされます。Neko自体、人間が読み書きするのに十分に分かりやすい言語ですが、NekoVMの“機械語”でもあるのです。

NekoVM/Neko言語が登場した頃(2005年8月にバージョン1.0)から、自作言語のコンパイルターゲット/ランタイムエンジンとしてNekoはJavaVMより使いやいいのではないか、と注目していました。その後Nekoが大きくブレークしたわけではないのですが、Nekoより高水準のHaxeのほうは最近かなり注目されているようです。

HaxeはNekoにコンパイルされると書きましたが、JavaScriptにコンパイルすることもできます。つまり、複数のコンパイルターゲットを持ち、JavaScriptにコンパイルする場合は特にHaxe/JS (Haxe over JavaScript) と呼ぶようです。最近になって、JavaScriptにコンパイルする言語が続々と誕生しましたが、Haxeは2005年から既にJavaScriptをサポートしていたので、歴史と実績があります。昨今のブームの先駆けとして再評価されているのです。

最近登場したJavaScript上のより高水準な言語とは:

  1. CoffeeScript : http://coffeescript.org/
  2. Dart : http://www.dartlang.org/
  3. JSX : http://jsx.github.com/
  4. TypeScript : http://www.typescriptlang.org/
  5. Fantom : http://fantom.org/

などです。これらの言語はJavaScriptの実行環境(ブラウザやnode.js)をそのまま利用しながら、なにかしら固有の価値を付加・提供しています。JavaScriptをコンパイルターゲットとする言語の包括的なリストは次のサイトをご覧ください。リストの長さに驚かされるでょう。

これらの言語がJavaScriptに向けてコンパイルされることは何を意味するのでしょうか? — JavaVMのバイトコード/Neko言語やasm.jsなどではなくて、JavaScriptそのものがもはや“機械語”(あるいはアセンブラ言語)なのだ、と言えるのです。

JavaScriptに不満を感じたとき、なにか特定目的の言語(Domain Specific Language)が欲しくなったとき、我々はJavaScript上に自分の言語を構築することができます。その言語処理系の実装言語にもJavaScriptを選ぶことができます。今はそんな時代なのですね。

ここまで広大な守備範囲を持つリンガ・フランカ(Lingua franca、共通言語)は今までに存在しなかったものです。JavaScriptは、Webのスーパー・リンガ・フランカと呼べるでしょう。シンメトリックのジーンコードは、この言語的基盤の上に誕生し、その上で成長しようとしています。

JavaScript runs on GeneCode Server.」の最後の一文を引用してこの記事も閉めたいと思います。

ジーンコードの開発言語としてJavaScriptを選択したことが、現在と将来に渡ってユーザーに大きなアドバンテージをもたらすことを我々は信じています。

Page Top