「バイトコード」の版間の差分

削除された内容 追加された内容
バイトコードの利点を整理 & 「スタックマシン vs レジスタマシン」を追加。
22行目:
=== 命令間でのオペランドの受け渡し ===
レジスタマシン型インタプリタでは番号で仮想レジスタを指定するが、多くの実機では実行時に物理レジスタを番号で参照することができないため、メモリ配列によって仮想レジスタが実装されている場合が多い。これに対しスタックマシン型インタプリタでは、ほとんどの命令のオペランドがスタックトップに決め打ちされ、参照すべき物理レジスタをコンパイル時に決定できるので、スタックトップ数個を物理レジスタで実装している。多くの実機ではレジスタ経由でのデータ受け渡しは1クロックでできるのに対し、メモリ経由でのデータ受け渡しは数クロックを要するので、直前の命令の結果を直後の命令が使う処理が連なった場合は、レジスタマシンは不利となる。
 
=== ソースコードからバイトコードへの変換 ===
[[ALGOL]]以来、多くのプログラミング言語は[[文脈自由文法]]で記述でき、スタックマシンと類似した[[プッシュダウン・オートマトン]]で構文解析できる。このため、スタックマシン向けのコード生成器ならば、構文解析器と一体化させて省メモリ・高速なものにできる。
 
レジスタマシン向けの場合、有限のレジスタを使い回す[[レジスタ割り付け]]を行う必要がある。ただし、インタプリタの仮想レジスタはメモリ配列で実装されている場合が多い。このため、メモリ配列の大きさが許す限り、実機では非現実的な膨大な数の仮想レジスタを実装でき、その場合、レジスタの使い回しを省いてレジスタ割り付けを単純化することができる。[[レジスタ・ウィンドウ]]も僅かなコストでレジスタ1本単位でスライドさせる柔軟なものが実装でき、スタックマシン向けと同様に構文解析器とコード生成器の一体化に役立つ。[http://d.hatena.ne.jp/hzkr/20080624]
 
== 使用例 ==