「バイトコード プログラムは通常、一度に 1 つずつ命令を解析することによって実行されます。この種のバイトコード インタープリターは非常に移植性があります。動的トランスレーターまたは「ジャストインタイム」(JIT) コンパイラーと呼ばれる一部のシステムは、バイトコードを機械語に変換します。実行時に必要に応じて: これにより、仮想マシンは移植できなくなります。」
この段落に関する質問は次のとおりです。バイトコードが処理された後、解析された命令と機械語 (または機械コード) の違いは何ですか?
「バイトコード プログラムは通常、一度に 1 つずつ命令を解析することによって実行されます。この種のバイトコード インタープリターは非常に移植性があります。動的トランスレーターまたは「ジャストインタイム」(JIT) コンパイラーと呼ばれる一部のシステムは、バイトコードを機械語に変換します。実行時に必要に応じて: これにより、仮想マシンは移植できなくなります。」
この段落に関する質問は次のとおりです。バイトコードが処理された後、解析された命令と機械語 (または機械コード) の違いは何ですか?
JIT は、バイト コード インタープリターとは異なります。
次の C 関数を検討してください。
int sum() {
return 5 + 6;
}
これは直接マシンコードにコンパイルされます。たとえば、x86 プロセッサと ARM プロセッサの正確な命令は異なります。
基本的なバイトコード インタープリターを作成すると、次のようになります。
for(;;) {
switch(*currentInstruction++) {
case OP_PUSHINT:
*stack++ = nextInt(currentInstruction);
break;
case OP_ADD:
--stack;
stack[-1].add(*stack);
break;
case OP_RETURN:
return stack[-1];
}
}
これにより、次の一連の命令を解釈できます。
OP_PUSHINT (5)
OP_PUSHINT (6)
OP_ADD
OP_RETURN
x86 または ARM の両方でバイト コード インタープリターをコンパイルした場合、インタープリターをさらに書き換えることなく、同じバイト コードを実行できます。
JIT コンパイラーを作成した場合、サポートされているプロセッサーごとにプロセッサー固有の命令 (マシン・コード) を発行する必要がありますが、バイトコード・インタープリターは C++ コンパイラーに依存してプロセッサー固有の命令を発行します。
違いはありません - JIT コンパイラはまさにそのために行われます - ハードウェア上で実行されるマシン コードを生成します。