バイトコード

バイトコード

執筆済 コンピュータ言語処理系

仮想的な機械のための命令列。 実機の機械語ではなく、 仮想マシンが解釈する。

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 より予測可能な性能が得られるため、 計算量の多い処理をブラウザで動かす用途に使われる。 近年はブラウザ外(サーバ、プラグイン機構)でも採用が進んでいる。

参考文献#

ノート一覧を閉じる