1 Introduction

Vmgen は、 効率的なインタープリターを作成するためのツールです。 これは、 単純な仮想マシンの記述を受け取り、 さまざまな方法で仮想マシン・コードを処理する(特に、 それを実行する)ための効率的な C 言語のコードを生成します。 その結果得られるインタープリターの実行効率は、 最適化コンパイラーによって生成されるマシンコードの10分の1以内に収まるのが普通です。

Vmgen がサポートするインタープリター設計戦略は、 インタープリターを以下の 2 つの部分に分割することです:

このような分割は通常、 モジュール性と効率性のためにインタープリターで使用されます。 仮想マシン・コードは通常、 load-and-go コンパイラーのように、 フロント・エンドとメモリ内の仮想マシン・インタープリターの間で受け渡されます。 これにより、 コードをファイルに書き込んで再度読み取るという複雑さと時間のコストが回避されます。

「仮想マシン」(VM) は、 実際のマシン・コードと同様に、 メモリ内で相互に続く「VM 命令」のシーケンスとしてプログラムを表します。 制御フローは、 実際のマシンと同様に、 VM 分岐命令を通じて発生します。

このセットアップでは、 Vmgen は、 仮想マシン命令の簡単な記述(see Input File Format)から仮想マシン命令を処理するほとんどのコードを生成できます。 特に以下のようなものです:

VM instruction execution
VM code generation

フロント・エンドで役立ちます。

VM code decompiler

フロント・エンドのデバッグに役立ちます。

VM code tracing

フロント・エンドと VM インタープリターのデバッグに役立ちます。 あなたは、 通常は、 ユーザーのプログラムをソース・レベルでデバッグするための他の手段を提供するでしょう。

VM code profiling

スーパー命令(superinstructions)を使用して VM インタープリターを最適化するのに役立ちます(see VM profiler)。

VM 命令を処理しないインタープリター・システムのパーツを作成するには、 他のツール(例: bison)を使用するか、 手動でコーディングする必要があります。

Vmgen は、さまざまな最適化を通じて効率的なインタープリターをサポートします。 特に

その結果、Vmgen ベースのインタープリターは、 小規模なベンチマークでは、 最適化された C 言語コンパイラーからのネイティブ・コードよりも 1 桁ほど遅いだけです。 ランタイム・システムでより多くの時間を費やす大規模なベンチマークでは、 多くの場合、 速度低下は少なくなります(たとえば、 Vmgen で生成された JVM インタープリターの速度の低下は、 大規模なベンチマークの場合、 測定した最高​​の JVM JIT コンパイラーと比べてわずか 2 から 3 分の 1 です。 他のいくつかの JIT と、 私たちが調べた他のすべてのインタープリターは、 私たちのインタープリターよりも遅かったです)。

VM は通常、 スタック・シン(VM 命令間のデータを受け渡しをスタック上で行う)として設計されており、 Vmgen はそのような設計を特に適切にサポートします。 ただし、 Vmgen を使用して レジスター型 VM (see Register Machines) を実装することもでき、 それでも Vmgen が提供する利点のほとんどを活用できます。

今現在では実装されていない命令記述(instruction descriptions)には多くの潜在的な用途がありうるものと思います。 私達は機能のリクエストは受け付けており、 誰かがリクエストした場合は新しい機能を検討します。 そのため、 上記の機能リストはすべてを網羅したものではありません。