非 JIT VM としては十分なパフォーマンスを発揮する仮想マシンを C で作成しましたが、何か新しいことを学び、パフォーマンスを向上させたいと考えています。私の現在の実装では、スイッチを使用して VM バイトコードから命令に変換し、ジャンプ テーブルにコンパイルします。私が言ったように、それが何であるかについてはまともなパフォーマンスですが、JITコンパイラでしか克服できない障壁にぶつかりました.
少し前に自己変更コードについて同様の質問をしましたが、適切な質問をしていないことに気付きました。
したがって、私の目標は、この C 仮想マシン用の JIT コンパイラを作成することであり、x86 アセンブリで実行したいと考えています。(アセンブラとして NASM を使用しています) これを行う方法がよくわかりません。私はアセンブリに慣れており、自己変更コードの例をいくつか調べましたが、コード生成の方法はまだわかりません。
これまでの主なブロックは、引数を使用して命令を実行可能なメモリにコピーすることです。NASM で特定の行にラベルを付け、静的引数を使用してそのアドレスから行全体をコピーできることは承知していますが、これはあまり動的ではなく、JIT コンパイラでは機能しません。バイトコードから命令を解釈し、それを実行可能メモリにコピーし、最初の引数を解釈してメモリにコピーし、次に 2 番目の引数を解釈してメモリにコピーできる必要があります。
GNU lightning や LLVM など、この作業を容易にするいくつかのライブラリについて知らされています。ただし、外部リソースを使用する前に、これがどのように機能するかを理解するために、最初にこれを手動で記述したいと思います。
このタスクを開始するために、このコミュニティが提供できるリソースや例はありますか? 「add」や「mov」などの 2 つまたは 3 つの命令を使用して実行可能コードを生成し、引数をメモリ内で動的に生成する単純な例は、驚くべきことです。