Closed dmikurube closed 1 year ago
その他参考文献など (時系列はぐちゃぐちゃです)
こういう背景があるので、「方式の説明はほどほどに、話題になったエンジンの固有名詞 (*Monkey とか) と、当時のベンチマークの紹介程度に留めておいたほうがいいような気はしますね」と提案した次第です。
ちなみに上の中に一つ JavaScriptCore
(JSC) の話が入っています。 WebKit と組み合わせて (Chrome ではなく) Safari で使われている JS エンジンですね。
Firefox v.s. Chrome の話に集中した結果 JSC が忘れられている点にちょっと悲しみがあったので、よければ混ぜてあげてくださいw
詳細なご指摘ありがとうございます。 又聞きの情報を記憶していたり、過去に読んだ記事の内容を自分の中で誤った形で解釈していたりしていたことを今さら認識し、恥じ入っております。
JavaScriptCoreの動向に触れていなかったのは、筆者がWindowsユーザーで若干縁遠かったからですが、性能面ではV8に勝るとも劣らないことを思うと、触れないのはアンフェアでした。
それぞれの技術の発表時期と実際のリリース時期を改めて調べた所、
2008.08 MozillaがTraceMonkeyについて記事を公開 2008.09 Chrome初版リリース、AppleがSFXでの劇的な改善について記事を公開 2009.06 TraceMonkeyが有効となったFirefox 3.5、SFXが有効となったSafari 4.0がリリース
という時系列だったので、「Mozillaが次世代のすごい技術(と、今より物を知らなかった当時の自分は受けとった)という感じで公表して、リリース版に降りてくるのを待っていたら、Chromeが今使える物として出してきた。FirefoxもSafariも正式リリースで追いついたのはほぼ1年後だった。その時のFirefoxは色々あって期待したほど速くはなっていなかった」という経緯で、「Chromeはとにかく速かった」というイメージが自分の中に定着したようです。 この事を踏まえて、Safariの動向にも触れつつ説明を整理してみました。 https://github.com/piroor/moezilla-memorial-photobook/blob/main/article.md#javascript%E9%AB%98%E9%80%9F%E5%8C%96%E6%99%82%E4%BB%A3%E3%81%AE%E5%88%B0%E6%9D%A5
ありがとうございます。かなりよくなったように思います。
ただやはり少し気になるのが、以下の2点でしょうか。
その上で、キーになりそうな点、記事に書いても納得感のありそうな点は、以下のような感じでしょうか。
こんな感じでしょうか。
再度のレビューありがとうございます。 「Mozillaの当時の発表で発表されたのがTracing JITだった」のに対し、本稿では「コンパイラ業界的には、実際にはTracing JITではなくMethod JITが既に知られていた」という事実が先に説明されていなかったことが、混乱の元だったと理解しました。
自分の主観的にはやはり、「Mozillaの技術記事で知ってワクワク→製品投入ではV8に先を越されてショック」という順番で物事が起こったのが強く記憶に残っていて、この順番で本文を書きたい気持ちが強かったので、JITの各方式の詳細は注釈の方に移動するようにしました。 (詳細については全く触れない選択を取るべきなのかもしれませんが、こういう詳細が技術的には面白い話題だと思うので、残してしまいました。)
V8だけが今も突出して高性能というわけではない、という認識は自分もありますが、最後の結びがV8の勝利となっているので、今もそうだという印象を残す文章になっているというご指摘にも納得いくため、この点は注釈とコラムで釘を刺すようにしてみました。
重箱の隅をつつくような指摘だったかもですが、ご対応ありがとうございます!
注釈含め、間違っているというような記述はなくなったかなと思います。 (人によってはもしかしたら用語使いなどに異論はあるかもですが…)
私はそのころ Chrome の方の中の人だったので、 Firefox の詳細や歴史、中の人に近い視点は、とてもおもしろく拝読させていただきました。
再三のご確認ありがとうございます!
このあたりの話については、怪しい理解のまま時間が経過して、「なんだかよく分からないけどこういう事らしい?」だったのが「こういう事だ」に自分の中で変化してしまっていたのかもしれない、と今さらながら思いました。 新しい物事に触れた時に、怪しい理解のままに留めるのは危険だということを、時間を空けて触れたことで実感した次第です。
このあたり https://twitter.com/dmikurube/status/1631476823883386881 の会話から、とりあえずわかる範囲で書き起こしてみます。そのあたりの詳細まで踏み込む「文案」として書きくだせるほどには、私も { 知らない | 覚えていない } ので、指摘という範囲に留まりますが…。
"Baseline JIT"
まず "Baseline JIT" という用語・表現とその説明についてですが、この "Baseline" というのは「個別の判断を行わずにほどほどの最適化度合いでとにかく幅広くコンパイルしてしまう『Baseline 方式』」という「特定の方式」のことではないと思います。
「その後の実行時情報を使った実行時最適化をかけ始める前に、読み込んだ直後に実行時情報なしでとりあえずかけるコンパイル」「その後の実行時最適化をかける前の、その処理系の最適化プロセスにおける、文字通りの "baseline"」というような意味合いでしょうか。
「×× 方式」という表現を使うなら、たとえば「V8 のバージョン x.y はその Baseline (JIT) として ×× 方式を採用している」というような使い方になると思います。
もっとも、実行時情報がない以上は、あまり多種多様な方式があるわけではなさそうですが。とはいえ "V8 is replacing its baseline JIT with an interpreter" みたいな表現をされた例もあります ↓
https://www.reddit.com/r/javascript/comments/3ggjai/v8_is_replacing_its_baseline_jit_with_an/
その "Baseline" の後に、しばらく実行を経たあとで行われるような「実行寺情報を使った実行時最適化をともなう JIT コンパイル」一般のことは、あまり特定の定まった用語がある認識はないですが、だいたい "optimizing JIT compile" とか、日本語なら「(実行時) 最適化 JIT コンパイル」とか呼ばれているものと思います。
"Tracing (Trace) JIT"
記事中で "Baseline JIT" と対比する形で "Trace (Tracing) JIT" の説明として述べられている「インタープリタでの実行を監視して統計情報を収集し、特に高い頻度で実行される箇所を選択的に高い最適化度合いでコンパイルする」というのは、どちらかといえば "Tracing JIT" ではなく、上の「実行時最適化 JIT コンパイル」の一般的な説明に当たります。
では "Tracing JIT" はなにかといえば、この「最適化 JIT コンパイル」の中の「一方式」です。
(ちょっと間違いを含みそうな説明ですがすごく大雑把に言うと) それまで最適化 JIT コンパイルといえば、メソッド単位の実行回数などを見てメソッド単位でコンパイルする "Method JIT" が主でした。 "Tracing JIT" は Method JIT のようなメソッド境界にこだわらず、コードが実際に実行されたパス (trace) に沿ってコンパイルする方式のことです。
Method JIT も Tracing JIT も、どちらも「インタープリタでの実行を監視して統計情報を収集し、特に高い頻度で実行される箇所を選択的に高い最適化度合いでコンパイルする」方式なので、これを Tracing JIT の説明として当てはめるのは適切ではないと思います。
V8 は実際どうだったのか
という話になると、特に時系列をともなう歴史においては、正直よく覚えていません。最初期の V8 は「Baseline JIT コンパイラである "full-codegen" しか持たない (実行時最適化 JIT コンパイルはしない)」方式だったような気もしますが、少なくともその後に (それでも今からすればだいぶ昔に) 入った Crankshaft は「実行時最適化 JIT コンパイラ」の一種ですね。大枠としては Method JIT に分類されるんじゃなかったかと思います。
https://blog.chromium.org/2010/12/new-crankshaft-for-v8.html
で、上の Tracing JIT の説明を読むとわかると思うのですが Method JIT と Tracing JIT はそんなにきっちり切り分けられるものでもありません。「基本線は Method JIT なんだけどちょっと Tracing JIT 的な要素も取り入れている」ようなものもありますし、すでに近年はそんな感じが主流じゃないかな、と思います。
とはいえ、最初に Tracing JIT を搭載した Firefox とその論文なんかが出たころは、まだ Tracing JIT は、提案はされていても研究レベルが主だったように思います。 Firefox が Tracing JIT の実用レベル・大規模な初期の適用例だったこともあって、コンパイラ業界でも、たしかにわりと衝撃的に驚きを持って迎えられていたような記憶があります。
Tracing JIT はダメだったのか
みたいな話になると、いまだに結論は出ていないし、部分的な要素としてはすでに各種のエンジンに入っていたりもするので、なんとも言えないんじゃないでしょうか。
JIT コンパイル技術が初期に発展したのは特に Java VM においてで、特にサーバサイドにおいてのことでした。サーバサイドでは一般にプロセスが長寿命になりがちなので、リソースを JIT コンパイルに割く意義が大きかったという背景があったと考えられます。
ブラウザの文脈になると、一つのページを開いている時間はサーバプロセスに比べれば短くなりがちなので、あまりコストを割かずにほどほどの最適化で済ませたほうがいいね、みたいな背景はあるかもしれません。そのあたりは論文なんかもいろいろあさらないと、最近の議論もわからないなあ、と思います。