4

「バイトコード プログラムは通常、一度に 1 つずつ命令を解析することによって実行されます。この種のバイトコード インタープリターは非常に移植性があります。動的トランスレーターまたは「ジャストインタイム」(JIT) コンパイラーと呼ばれる一部のシステムは、バイトコードを機械語に変換します。実行時に必要に応じて: これにより、仮想マシンは移植できなくなります。」

この段落に関する質問は次のとおりです。バイトコードが処理された後、解析された命令と機械語 (または機械コード) の違いは何ですか?

4

4 に答える 4

7

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++ コンパイラーに依存してプロセッサー固有の命令を発行します。

于 2009-05-19T09:24:53.930 に答える
1

違いはありません - JIT コンパイラはまさにそのために行われます - ハードウェア上で実行されるマシン コードを生成します。

于 2009-05-19T09:11:13.503 に答える