4

反復フラクタル システムをレンダリングするプログラムに取り組んでいます。誰かが独自の反復プロセスを定義し、そのコードを効率的に実行できるようにコンパイルできる機能を追加したかったのです。

現在、これを行う方法がわかりません。これを行う方法を学ぶために何を読むべきかについてのヒントが欲しいです。

主なプログラムは C++ で書かれており、私は C++ に精通しています。実際、ほとんどのシナリオを考えると、目標を達成するアセンブリ コードに変換する方法はわかっていますが、それをマシン コードに変換するための追加の手順を実行する方法はわかりません。可能であれば、多くのゲーム システム エミュレーターの動作と同じように、コードを動的にコンパイルしたいと考えています。

私が何を求めているのか不明な場合は、明確にするために教えてください。

ありがとう!

4

8 に答える 8

3

画面に表示するピクセルを生成しているため、動的シェーダー コンパイルで HLSL を使用することを検討しましたか? これにより、まさにこの種のもののために設計された SIMD ハードウェアと、DirectX に組み込まれた動的コンパイラーにアクセスできるようになります。

于 2009-09-18T02:17:42.437 に答える
3

動的拡張機能を C (C++ ではなく) で記述できる場合は、Tiny C Compilerが役立つことがあります。LGPL の下で利用でき、Windows および Linux と互換性があり、プリプロセッサ、コンパイラ、リンカ、およびアセンブラ用の ~100kb の小さな実行可能ファイル (またはライブラリ) であり、すべて非常に高速です。もちろん、これの欠点は、GCC で得られる最適化と比較できないことです。もう1つの潜在的な欠点は、それがX86のみのAFAIKであることです。

アセンブリを作成することにした場合、TCC はそれを処理できます。ドキュメントには、ガスのような構文をサポートし、X86 オペコードをサポートしていると書かれています。

TCC は ANSI C も完全にサポートしており、C99 にほぼ完全に準拠しています。

そうは言っても、TCC を実行可能ファイルとしてアプリケーションに含めるか、libtcc を使用することができます (libtcc のオンライン ドキュメントはあまり多くありませんが、ソース パッケージで入手できます)。どちらの方法でも、tcc を使用して動的または共有ライブラリ、または実行可能ファイルを生成できます。動的ライブラリ ルートを使用する場合は、(または任意の) 関数をライブラリに配置し、関数Renderを呼び出して、最終的にユーザーが設計したレンダリングを実行します。または、スタンドアロンの実行可能ファイルとそれを作成し、スタンドアロンのとを介してすべての通信を行うこともできます。dlopenLoadLibraryRenderpopenstdinstdout

于 2009-09-18T02:04:14.270 に答える
3

一部の CPU エミュレーターは、マシン コードをバイト コードであるかのように扱い、Java であるかのように JIT コンパイルを行います。これは非常に効率的ですが、開発者は、エミュレーターが実行される各 CPU およびエミュレートされる各 CPU に対して、コンパイラーのバージョンを作成する必要があることを意味します。

これは通常、x86 でのみ動作することを意味し、別のものを使用したい人にとっては煩わしいものです。

また、それを LLVM または Java バイト コードまたは .Net CIL に変換してからコンパイルすることもできますが、これも機能します。

あなたの場合、そのようなことが最善の方法であるかどうかはわかりません。動的ライブラリを使用してこれを行うと思います。「プラグイン」を含むことになっているディレクトリを作成し、ユーザーが自分でコンパイルできるようにします。プログラムにディレクトリをスキャンさせ、見つかった各 DLL または .so をロードさせます。

このようにすると、コード コンパイラの記述に費やす時間が減り、実際に作業を行う時間が増えます。

于 2009-09-18T00:06:50.357 に答える
2

LLVMは、やりたいことを実行できるはずです。オブジェクト指向の方法でコンパイルしたいプログラムの記述を作成し、実行時にそのプログラム記述をネイティブ マシン コードにコンパイルできます。

于 2009-09-18T00:03:25.243 に答える
1

Nanojitは、あなたが望むもののかなり良い例です。中間言語から機械語を生成します。これは C++ であり、小型でクロスプラットフォームです。あまり広範囲に使用したわけではありませんが、デモのためだけにいじって楽しんでいました。

于 2009-09-18T02:08:12.500 に答える
0

コードをファイルに吐き出し、動的にロードされるライブラリとしてコンパイルしてから、ロードして呼び出します。

于 2009-09-18T07:50:27.090 に答える
0

GPU ベースのソリューションを使用できない理由はありますか? これは1つを叫んでいるようです。

于 2009-09-18T08:06:09.523 に答える