二日前に Google が Chrome というウェブブラウザを発表しました。Windows 版しか公開されていないので、Mac ユーザの私は実際の製品に触れる機会がまだありません。個々の機能の多くは既存のブラウザのものを寄せ集めたものの、それがとてもうまい具合に寄せ集められているという噂には少しわくわくします。
今日の話題に選んだ V8 は Chrome に内蔵されている JavaScript のエンジンです。ここ数年、JavaScript の利用は進み、それにつれて徐々に JavaScript エンジンの性能は向上しています。でも、Google V8 によって、ようやく最新のプログラミング言語実装理論がスクリプト言語に応用されたことになります。これによって、JavaScript は核の部分で10倍程度の高速化が達成されます。
これはこれで大変なことなのですが、このようなシステムの登場は、今後のコンピュータシステムのあり方を大きく変えることになるでしょう。
みなさんは本格的なウェブアプリケーションを使っていますか?従来、わたしたちはソフトウェアをパソコンにインストールして使ってきています。ウェブアプリケーションは、ソフトウェアはウェブ上にあるため、ブラウザさえあればアプリケーションを実行することができます。
ウェブフォームもウェブアプリケーションの一種なのですが、ぼくがここで書いているのは、もう少し複雑な動作をするものです。よく知られた代表例は、[[Google が出している無料のオフィススイート:http://docs.google.com/%5D%5D(Google Document)や Apple の MobileMe のサービスです。Google Docs は Microsoft オフィスを、MobileMe は Mac OS X のメール、カレンダー、住所録などをウェブ上に実現したものです。
Google Docs の場合、Microsoft オフィスに比べると機能は少し簡素化されています。それでも、始めこれを利用したときは、Excel の複雑な機能がそこそこ便利に実現されていることに驚きました。そうはいっても、動きは少しもっさりとしていることから、それがウェブ上で動いていることを意識せざるを得ませんでした。
JavaScript は、Google Docs の機能をブラウザの上で動作させているプログラミング言語なのですが、その実装は Java や C++ に比べるとひどく遅いものでした。((それも、二日前までのこと。))
**スクリプト言語の高速化
一般にスクリプト言語は遅いといっていいでしょう。代表的なスクリプト言語には、スクリプト言語のさきがけとなった Perl に続いた、Python、PHP、日本人が開発した Ruby などがあります。そして、忘れてはならないのが JavaScript。これらのプログラミング言語は、プログラミングの初心者でも簡単に学ぶことができて、プログラムの開発効率が C++ や Java に比べて飛躍的に高いと言われています。反面、実行速度については C++ の 10 倍以上も遅いようです。
スクリプト言語の実行速度を向上させる努力も継続的になされ、年々、わずかずつ高速化が達成されています。ただ、技術的にはなかなか難しい面があります。スクリプト言語の高速化における困難は、個人的にはきちんとした言語仕様がないことではないかと思います。伝統的なプログラミング言語では、その仕様は文脈自由文法にしたあって定義され、それに対して構造的に意味が定められています。スクリプト言語には、そのような定義がないのです。ですので、すでにあるスクリプト言語の実装自体が言語の定義のようなものとなっています。これは高速化を図っても、その高速化が正しいのかどうかを判断するための拠り所がないということになります。
JavaScript もスクリプト言語に分類されていて、これまで処理性能はさほど高くありませんでした。ただ JavaScript の場合は事情が少し異なります。というのも、JavaScript には ECMA Script という立派な言語仕様があるからです。ですので、論理的に考えれば JavaScript を高速に実行するための言語処理系を設計することができたはずです。ところが、V8 が発表されるまで、あまり効率的な処理系が出てこなかったのには理由があります。
それは JavaScript の言語仕様が許す非常に高い柔軟性によるものです。JavaScript は雛形に定義を追加する形でプログラムを構成するやり方です。一方、普通のプログラミング言語では、プログラムの構成をあまり自由に変更することはできません。この言語仕様は 1980 年代後半に研究された SELF というプログラミング言語に強く影響を受けたものと思われます。
SELF の研究では、極めて動的な挙動を許すプログラミング言語を効率的に実行することが課題となっていました。このために、高効率なゴミ集め、inlining cache、動的なコンパイラ、動的プロファイリング、逆最適化などの革新的な実装技術が提案されました。
ただ、研究の最前線における実装技術が実際に身近に現れるまでに10年を要したということなんですね。
**JavaScriptの性能が10倍になると? (1)
V8の登場で JavaScript の核の性能が 10 倍になるとしたら、どうなるでしょう?ひとつの予想としては「スクリプトは遅い」という常識が崩れることになります。つまり、JavaScript が速く動作するんだから、Perl も PHP も Python も Ruby も速く動作させなくてはならないという圧力がかかることでしょう。
でも、すでに述べたように、それは無理な相談です。きちんとした言語仕様がないのですから。ということは、とるべき道はあまりありません。まずは、きちんとした言語仕様を作り直し、それにあわせた言語処理系を作ることです。このためには、V8 の先進的な技術を作り込む必要があるのでかなり大変です。もうひとつは、スクリプト言語を JavaScript に変換して V8 で実行するという手もあるかもしれません。それでも、V8 の性能を引き出すには、言語仕様の振れる部分を固める必要があるでしょう。そして、もうひとつの手段は?スクリプト言語の開発を止め、JavaScript に任せてしまうことです。V8 の登場により、数年以内にいくつかのスクリプト言語は淘汰されるかもしれません。
**JavaScript の性能が 10 倍になると? (2)
これまでの JavaScript の資産の性能が 10 倍になります。そうなんですが、それは何を意味するのでしょう?Google Docs の性能が 10 倍になります。それは誠に結構なことですが、それだけ?
JavaScript の性能が 10 倍になれば、これまで JavaScript で実装することに現実性がなかった機能も JavaScript で実装されるようになるでしょう。たとえば、Google Spreadsheet((Google 版の Excel))には、Excel がサポートするすべての統計分析機能が搭載されることでしょう。Google Document の編集機能は Word に比べるとおそまつなものですが、これもずっと完成度が高いものとなることでしょう。
これは従来パソコンにインストールして使っていたソフトウェアの多くがウェブアプリケーションとして実装できるようになることを意味しています。
ウェブアプリケーションには従来型のアプリケーションに比べて少なくとも二つの利点があります。
:バグの修正|ソフトウェアにバグが見つかった場合、従来型のソフトウェアの場合、修正版をインストールし直さなくてはなりません。怠け者はすぐには修正版をインストールしてくれないから、このやりかたでは世の中に同じソフトウェアの複数のバージョンが同時に存在するためにソフトウェアの開発はかなり複雑になります。
~一方、ウェブアプリケーションにバグが出た場合、ソフトウェア開発者はサーバで動いているウェブアプリケーションを修正するだけで全世界のユーザの問題を除去することができます。
:データの共有|わたしは日常的な表計算にはExcelを使っています。でも、もし他の人と共有する目的で表計算データを作成するときにはGoogle Spreadsheetを使います。ウェブアプリケーションのもうひとつのメリットは、それがインターネットで動作しているために、自然とデータをインターネットに保存して、それをほかの人と簡単に共有できることです。たとえば、なにかの会議をセットアップするときなどは、時間割のような表の参加可能な時間枠に各自の名前を書いてもらうことにしてもらいます。表の雛形ができたら、その表の URL を参加予定者に送ります。あとは、みんなが記入してくれるのを待つだけです。
**JavaScript の性能が 10 倍になると? (3)
自分が使っているソフトウェアが全部ウェブアプリケーションになって、さらに自分の文書がすべてインターネットに保存されているとしましょう。なんかおかしくないですか?
そう、Microsoftオフィスはいらなくなる。。。いやいや、もっと大きなことがあるでしょ?
そう、自分の大事なパソコンはなんのためにあるんでしょう?そう、ウェブブラウザとその上で動くウェブアプリケーションを動作させるためです。それってどういうこと?オペレーティングシステムがいらなくなるということです。だって、唯一のアプリケーションがウェブブラウザなのだから、オペレーティングシステムなんかいらないです。スイッチをいれたとたんにウェブブラウザが動けばいいんです。もう、Vista も Leopard もいらなくなります。
そういえば、Java がでたときも Java OS というものが提案されたけれども、当時みんなが思い描いた形での Java OS は出ませんでした。それなのに、どうして JavaScript が 10 倍高速化されるとオペレーティングシステムが消えるのか?どうしてでしょう?
*Further readings
– [[V8 design elements:http://code.google.com/apis/v8/design.html%5D%5D
– [[Google V8 JavaScript Engine Embedder’s Guide:http://code.google.com/apis/v8/embed.html%5D%5D
~V8 を組込もうとしている C++ プログラマ向けのガイド。V8 の FFI が解説されているのでソースの解読に役に立つはず
– [[Chrome and V8 by Dave Griswold:http://groups.google.com/group/strongtalk-general/browse_thread/thread/40eb8f405fbd3041%5D%5D
Lively Kernelみたいなものありますから、開発環境もエンドユーザー向けスクリプティング環境も自前でもてますからね。
Lively Kernel については、昨日、友人に教えてもらったばかりです。JavaScript で動く Squeak like な環境ですね。
えらいきちんと書かれた文章だね。どっかに投稿するの?「コンピュータソフトウェア」、とか。まだあんのかな?
Lively Kernelってびっくり。SelfのMorph (Morphic?) が採用されているとは面白い。Selfは革新的言語だったからなぁ。
http://research.sun.com/projects/lively/
ずいぶん、おだてるね。コンピュータソフトウェアは日本ソフトウェア科学会の学会誌として今でも健在だよ。もう一般書店での市販はしていないけれども。
これからは Lively Kernel だけでなく、いろんなソフトがウェブアプリとして登場するよ。すごいといえば、Adobe の Photoshop Express もすごいじゃない。あれは Adobe Air だけど。
Photoshop Expressは使ったことないけど、紹介記事を見る限り、すごそうだ。ま~、GoogleがPicasaを無料公開したりしているから、Adobeもカジュアル・ユーザが離れるのを防ぐのに必死、ということなんだろうね。
なるほどね。そういうことですか。ソフトウェアの金になるマーケットが縮小しなければいいけれど。