JavaScript 実装、始め…るかも…

by syoyo

JavaScript の実装をしようかな… と思っています.

理由

現状 Maya などの 3D CG のパッケージなどでは拡張用のスクリプト環境として Python が使われるようになっています.

将来を見据えると 3D CG パッケージもどんどん web 化していき、拡張用スクリプティング環境は JS などの web 言語と統一していくことが見込まれます.それに使う言語が統一されていればユーザにとっても学ぶことが少なくていいでしょうし.
(将来のグラフィックス言語は関数型、とは別に、もう少し現実的にあり得る方向性として)

また、3C CG 向けに限らずとも、拡張用スクリプト言語は動的言語(or 動的型付けな DSL)というのが主流になっていくと思っている.

そのとき、JS もしくは動的言語の実装系が非力では困る(すでに Python でも CG 系の演算処理を行うには非力である).

動的言語でも、パフォーマンスを考慮して実装を行い静的言語とほぼ competitive であることを示すことができれば、
CG パッケージの JS 化移行という可能性も十分あり得るようにある.

なぜ動的言語(スクリプト言語)の中でも JS にするか、というのはやはりすでにユーザが多いし参考になる既存の処理系が多いからにつきる.

実装の方向性

通常の JS 実装系とはかなり方向性が異なる.

– 数値計算のパフォーマンスに特化(web 用のたとえば文字列操作、正規表現、DOM 操作に特化ではない). 組み込み用演算スクリプティング環境という位置づけ.
– コンパイルに時間はかけてよいことにする.メモリもいっぱい使ってよい. AOT(Ahead of time)なコンパイルをする.
– LLVM をバックエンドにつかう. 可能な限り静的に最適化されたコードを吐く.
– 完全な実装まではやらない. Prof of concept ができればよしとする.
– JS の仕様バージョンは現在の ecmascript3(ecma-262). ecmascript4 はなんかキャンセルになったみたいだし.

やることの利点

– 動的言語実装のノウハウがつく
– JS ならば他にすでに多くの実装やサンプルがあるので、それらをリファレンスとして検証に使える
– スクリプト言語(動的型付け言語)でも、実行速度に特化して実装を最適化すればどこまでパフォーマンスを出せるかを確かめることができる(SIMD 命令の利用、メモリ最適化を考慮するなど).

最適化の方向性

C に比べて xx 倍しか遅くない! C と同等! V8 より xx 倍早い! というあいまいな比較はしない.
実行したいプログラムの理論値を求め、それと現状の最適化実装のパフォーマンスとの乖離率で最適化の度合いを測る.
(理論値以上の性能は出ないわけですから)

期間

まあレンダラ作成の片手間に、ということなので、いつ終わるかは不明です. 終わらないで途中で辞めるかもしれません.

手始めに

JS および動的言語の実装ってどうすればいいんだろう…
というわけで、手始めに既存の JS 実装を調べてみます.

– リファレンス実装 www.ecmascript.org
ECMAScript4 のリファレンス実装.
コードを眺めてみます…


うわっ、SML/NJ ですか. OCaml は分かるのでなんとなく読めるけど…
しかしなぜに SML/NJ なのだろう. Appel の影響か!?
まあ C++ でも困るけど…
ecmascript4 の実装なので、3.1 に移行することになった今、多くの(?)実装の部分がいらない子になるんだろうなぁ…

– Tamarin
Tamarin(-tracing) は正確には入力としてコンパイル済みの ABC を受け取ってインタプリタ(+JIT)する実行環境.

ABC へのコンパイルは Flex SDK で見つかる.
JS -> ABC へのコンパイラは Java でかかれている.
こいつはなんだかもうでかすぎて読む気がしない.

– V8
C++ なのと、デザインドキュメントがあまりないので、やはりあまり読む and 参考になる気がしない.

– SpiderMonkey
C なのがいいね!構成がすっきりしていて、コメントもあるので読みやすい.

– Narcissus
http://mxr.mozilla.org/mozilla/source/js/narcissus/

JS で書かれた JS エンジン.
全部で 3,000 行くらいととてもコンパクト.
ひとまず実装上の参考にするにはこれが一番ですね.

まとめ

というわけで、既存 JS 実装で読んで参考になるのは Narcissus, SpiderMoneky かな.
それ以外は無理にソース解読するより言語仕様書を読んで理解したほうが早そうだ.

Advertisements