バイトコード
仮想的な機械のための命令列。 実機の機械語ではなく、 仮想マシンが解釈する。
a + b * 2
↓ バイトコード(スタックマシン)
LOAD a
LOAD b
CONST 2
MUL
ADDなぜ挟むのか#
| 理由 | 内容 |
|---|---|
| 移植性 | VM さえあればどの環境でも動く |
| コンパクト | ソースより小さく、機械語より抽象的 |
| 解析済み | 実行のたびに構文解析しなくてよい |
| 検証可能 | 実行前に安全性を検査できる(JVM) |
| JIT の入力 | ホットな部分を機械語に変換する起点 |
スタックマシンとレジスタマシン#
| スタック | レジスタ | |
|---|---|---|
| 例 | JVM、CPython、WASM | Lua、Dalvik |
| 命令 | オペランドを暗黙にスタックから取る | 明示的に指定 |
| 命令の大きさ | 小さい | 大きい |
| 命令数 | 多い | 少ない |
| 生成の容易さ | 簡単(AST を後行順に辿るだけ) | やや複雑 |
スタックマシンが多いのは生成が単純だから。 レジスタマシンはディスパッチ回数が減るぶん速い傾向がある。
WebAssembly#
ブラウザで動く低レベルなバイトコード。
- スタックマシン
- 静的に検証可能な型付き設計
- サンドボックス内で実行される
- C、C++、Rust からコンパイルできる
JavaScript より予測可能な性能が得られるため、 計算量の多い処理をブラウザで動かす用途に使われる。 近年はブラウザ外(サーバ、プラグイン機構)でも採用が進んでいる。
参考文献#
- Robert Nystrom. Crafting Interpreters. Genever Benning, 2021.(全文公開) https://craftinginterpreters.com/
- Tim Lindholm et al. The Java Virtual Machine Specification, Java SE 21 Edition. https://docs.oracle.com/javase/specs/jvms/se21/html/
- Andreas Haas et al. Bringing the Web up to Speed with WebAssembly. PLDI, 2017. https://doi.org/10.1145/3062341.3062363