※この記事は、JSX Advent Calendar 2013の一部です。
今日は12月24日、クリスマス・イヴです。それにちなんで、JSXがいかにして生まれたのか、というお話をしましょう。
元々は、2012年2月17日にさかのぼります。私は翔泳社開催の「Developers Summit 2012」の講演が終了し、登壇者の皆様と控え室で歓談しながら10周年コラボパーティの開場を待っておりました。そこでJenkinsの生みの親である川口耕介さんとお話をする機会がありまして、もう付き合いが20年近くになるんですかね、まあ会うたびにお互いに歯に衣を着せないで相手を容赦なくディスるんです。
で、そのとき私は川口さんに「お前まだJavaScriptなんて書いてんの?型がない言語を使うとか正気か?(意訳)」というツッコミを受けまして、もう完敗だったわけです…。
というわけでその場(控え室)で川口さんと、どうすればJavaScriptで型付きの言語が使えるか、という議論になりました。方法は3つあり、一つはVMを作る方法、Dart形式ですね。もう一つは言語のTranslator形式、そして最後はJSへのDecompilerを作る形式、Emscripten形式です。
VMを作る方法は、実行スピードの点でアウトでした。Dartのように、VMをChromeに内蔵して…という選択肢が取れればいいのかもしれませんが、それでも全てのブラウザで動かすことは政治的な観点からもまず不可能でしょう。最近のDart⇔JavaScript Converterの出来はかなりよいですが、やはり速度的なデメリットは間違いなくあります。
Translator形式は、議論の時はGWTを想定しておりました。GWTはJava風言語からJavaScriptへの変換ですが、せっかくJava風なのにJARが使えないので過去の資産を利用できない問題がありました。例えばGWTは当時Threadが使えないなどの制約があり、Javaである必要性はそこまで高くないしね、という話をしていました。
そして最後、decompiler形式です。これが私達の議論の解でした。Emscriptenはllvmからのdecompilerなので、出力のコードがハード寄りになっている特長があり、JavaScriptで普通に利用するのは難しかろうという風に考えておりましたが、JavaのByte CodeからJavaScriptにdecompileするやり方であればかなり綺麗な(オーバーヘッドの少ない)JavaScriptが得られるだろう、という結論です。Javaで書いて、それをJavaScriptにdecompileするソリューションを作れば何とかなるね、という風な話をしていました。
ここまでが金曜日、devsumi2012の最終日のお話です。
さて、自分はその結論を、翌日の土曜日の朝9時に社内SNSに書きました。そうしたら @kazuho さんがキャッチし、SNS上で3時間ほどチャット状態で議論が発熱しました。簡単に要約すると、decompiler形式だと
- VMの特性に引っ張られて性能が落ちる(たとえばJavaの場合は必ずThreadを用意しなくてはいけない、など)
- アノテーション等の独自拡張ができなくなったりと今後の拡張性が縛られてしまう
- GroovyなどJVM依存の他言語を動かすメリットはある(が、大規模では使わないだろう)
という話があり、結論としてはソーストランスレーター形式の方が大規模では有用であろう、というものでした。この結論は、特にDeNA内ではJavaScriptの速度は大変重要であり、これをわずかでも犠牲にするミドルウェアは社内では使われないだろう、という観点によるところが大きかったです。
そして、翌々日の月曜日の昼に @kazuho さんがその議論を踏まえたJSXの企画書をプレゼンにまとめて上長に報告されていました。私も一緒に出席しないかと誘われたんですが「昼飯を食いたいのでパスします」というひどい断り方をしたのを良く覚えています。そしてそのプレゼンがその日のうちに承認され、GOサインが出ました。devsumiの3日後、2012年2月20日にJSX開発のプロジェクトがスタートしたのです。
それから大体3ヵ月後の2012年5月31日にJSXの最初のバージョンが発表されたのは、皆さんご存知の通りだと思います。JSXは今もなお社内で投資が続けられており、社内外にて着実に使われつつあるプロジェクトになりつつあります。
デブサミの控え室で議論に付き合ってくださった川口さんには感謝しています。私は当初から今に至るまで、主に仕様と機能追加の方向性でこのプロジェクトに関わっております。自分としては相当長い期間コミットしていますし、今後も少なくとも数年はコミットを続け、引き続きJSXをよりよくしていこうと思っています。