7

私は概念実証用の JIT コンパイラを C で書いています。現在、アセンブリ コードの文字列を生成しています。C のインライン アセンブリ機能は、コンパイル時に認識される文字列リテラルのみを処理するため、実行時に生成されたコードを実行するために使用することはできません。

実行時に生成されたマシン コードを実行するために mmap() を使用することについて読んだことがありますが、可能であればマシン コードを操作したくありません。

誰かが解決策を知っていますか? 私はそれをファイルに書き込んで、そのファイルでアセンブラとリンカを呼び出すことを考えましたが、それは面倒で遅くなります。

4

2 に答える 2

3

最終的に「JIT」になるには、マシンコードを生成することを意味する時間に敏感である必要があると思います。実行するマシン コードと検証するアセンブリ コードの両方を生成するデバッグ コードを挿入し、アセンブラを実行して、アセンブリ言語のマシン コードと直接生成したマシン コードを比較し、それを使用してマシン コードをデバッグ/検証します (可能であれば、アセンブラーは、あなたが望んでいたことではなく、独自のことをしたい場合があります)。

于 2013-08-13T18:44:48.930 に答える
2

私が行ったことは、C/C++/Fortran コードを生成し、その場でコンパイルし、DLL にリンクし、DLL を動的にロードすることです。これらのすべてに、せいぜい数秒かかります。ASM を生成することを除いて、同じことができます。結果のコードの速度に加えて、生成している言語のコード (およびランタイム ライブラリ) の柔軟性が必要な場合、これは非常に効果的な手法です。

于 2013-08-13T18:50:22.947 に答える