信頼度ランク
| S | 公式ソース確認済み |
| A | 成功実績多数・失敗例少数 |
| B | 賛否両論 |
| C | 動作未確認・セキュリティリスク高 |
| Z | 個人所感 |
Google JSIR:MLIRベースのJavaScript中間表現がJSツールチェーンを変える可能性
GoogleがMLIR上に構築したJavaScript中間表現JSIRをオープンソース化。Hermesバイトコード逆コンパイルと難読化解除に本番利用し、LLVM標準化も提案している。
一言結論
JSIRはJavaScriptのソース・AST・IRの可逆変換を実現するMLIRベースの中間表現で、Googleの本番システムで稼働中だが、LLVM標準化はRFC段階であり採用の可否は未確定だ。
コンパイラ設計における「中間表現(IR: Intermediate Representation)」は、ソースコードを最適化・変換するための橋渡し役だ。LLVMがC/C++/Rustの共通IRとして広く普及したように、Googleが提案する JSIR はJavaScriptの世界に同様の標準を作ろうとする試みだ。
JSIRが解決しようとする問題
現在のJavaScript解析ツールチェーンは断片化している。
- バンドラー(webpack, esbuild)、リンター(ESLint)、型チェッカー(TypeScript, Flow)はそれぞれ独自のAST形式を持つ
- ツール間でのAST共有やコード変換には手動のシリアライズ・デシリアライズが必要
- JSのコード解析(セキュリティスキャン、難読化解除、バイトコードからのソース復元)は各実装が独自に行っている
JSIRは「JavaScriptを扱う全ツールが共通で使えるIR」を定義することで、この断片化を解消することを目指す。
技術的な特徴
JSIRの核心は MLIR(Multi-Level Intermediate Representation) 上に構築されていることだ。MLIRはLLVMプロジェクトのサブプロジェクトで、複数レベルの抽象化を扱う汎用コンパイラインフラだ。
ソース情報の完全保持
JSIRはASTの全情報を保持するため、以下の変換が可逆になる。
JavaScript ソースコード
↕ (lossless)
AST
↕ (lossless)
JSIR
多くの既存IRが「最適化を優先してソース情報を捨てる」のと対照的に、JSIRはソース情報を保持したまま解析と変換を行う。これにより、IRから人間が読めるJavaScriptへの逆変換(デコンパイル)が現実的になる。
制御フロー構造の保持
MLIRのリージョン機能を使ってif/for/while等の制御フロー構造をIRレベルで表現する。バイトコードのような低レベルIRへの落とし込みを避けることで、ソース構造を維持したまま解析できる。
データフロー解析への対応
静的解析(型推論、セキュリティ解析、コード最適化)に必要なデータフロー情報を標準的な形式で提供する。
Googleでの本番利用実績
JSIRはRFCの提案書ではなく、Googleが既に本番環境で使用しているツールだ。
Hermesバイトコードの逆コンパイル:Facebookが開発したReact Native向けJSエンジン Hermes が出力するバイトコードを、JSIRを経由してJavaScriptソースコードへ変換する。デバッグや難読化されたReact Nativeアプリの解析に実用されている。
JavaScriptの難読化解除:セキュリティ目的でのJavaScript難読化解除にも使用されており、こちらもGoogleの本番システムで動いている。
本番利用の実績があることで、「設計上は動く」ではなく「実際の複雑なJSコードで動作確認済み」という信頼性がある。
LLVM標準化への提案
GoogleのコンパイラエンジニアZhixun TanはLLVMディスカッションフォーラムに**RFC(Request for Comments)**を提出し、JSIRをMLIRの一部としてアップストリームに取り込む可能性を打診している。
現在の状況:
Google internal → GitHub公開(google/jsir)
提案している状態:
google/jsir → MLIR upstream(公式サポート)
承認されればLLVMコミュニティがJSIRをオフィシャルにメンテナンスし、他のJavaScript処理ツールが共通基盤として採用できる状態を目指すものだ。
開発者への実際の影響
現時点でJSIRが直接影響するのは、JavaScriptのツール開発者・セキュリティ研究者・コンパイラエンジニアが主だ。
将来的に標準化が進めば:
- ESLintやBabelなどのツールがJSIRベースのAST共有インフラを持てる
- バンドラーの最適化パスをMLIR上で実装・共有できる
- JavaScriptのセキュリティ解析ツールが共通IRを使える
ただし、これはあくまで提案段階だ。LLVMコミュニティがRFCを承認し、主要なJSツールエコシステムが採用を決めるまでには相応の時間がかかる。
注意点
- 現状はGoogleの内部ツールとして動作しており、パブリックAPIは安定していない
- LLVM標準化はRFC段階のため、否決・大幅変更の可能性がある
- Webブラウザエンジン(V8、SpiderMonkey)への採用は現時点では視野外
- reliability を B としているのは、標準化の行方が未確定なため
まとめ
JSIRは「既に動いている本番ツール」をオープンソース化し、標準化を狙う戦略的な動きだ。JavaScriptのコンパイラ・ツールチェーン分野でMLIRが標準インフラとなれば、エコシステム全体の効率が向上する。提案段階のため動向注視が必要だが、LLVMコミュニティでの議論は始まっており、JavaScriptツールに関わるエンジニアが把握しておく価値はある。