Vmgen を使用する場合、 このセクションを理解する必要はおそらくありませんが、 役立つ場合もあります。 ここでスキップして、 あとでディスパッチ方法に関する記述がわかりにくい場合にこのセクションを読むといいでしょう。
1 つの VM 命令を実行した後、 VM インタープリターは次の VM 命令にディスパッチ(dispatch;切り替え作業)する必要があります(Vmgen はディスパッチ・ルーチン「NEXT」を呼び出します)。 Vmgen は 2 つのディスパッチ方法をサポートしています:
この方法では、 VM インタープリターに巨大な switch
ステートメントが含まれており、 VM 命令ごとに 1 つの
case
があります。 VM 命令のオペコードは、 VM コード内の整数(enum
によって生成されるなどする)によって表され、 ディスパッチは、 次のオペコードをロードし、 switch
して、 適切な
case
で続行することによって行います。 VM 命令の実行後、 VM インタープリタはディスパッチ・コードに戻ります。
このメソッドは、 VM 命令を実行するためのマシン・コード断片の開始アドレスによって VM 命令オペコードを表します。 ディスパッチ(切り替え作業)は、 このアドレスのロードと、 そこへのジャンプと VM 命令ポインターのインクリメントで構成されます。 通常、 スレッド化コードのディスパッチ・コードは、 VM 命令を実行するコードに直接追加されます。 スレッド化コードは ANSI C では実装できませんが、 GNU C の label-as-values 拡張機能を使用して実装できます(see Labels as Values in GNU C Manual)。
インタープリターやベンチマークやマシンによっては、 スレッド化コードはスイッチ・ディスパッチより 2 倍早くなることがあります。