10

C ソース コードを高パフォーマンスの Java バイトコードにコンパイルする方法を探しています。NestedVMの使用に成功しましたが、現在取り組んでいるプロジェクトではパフォーマンスへの影響は許容できません。また、この問題を狙ったさまざまなオープン ソース プロジェクトや、いくつかの商用製品も見てきました。 このSOの質問は、Java以外のソースをJavaソースに変換する一般的な問題を扱っていますが、CからJavaバイトコードに移行したいだけです。

C ソース コードを高パフォーマンスの純粋な Java バイトコードにコンパイルする最良の方法は何ですか?

4

4 に答える 4

9

Cibylの作者である私は、ここで偏見を持っているかもしれません。とにかく、公理的 C コンパイラによって生成された Java バイトコードを見てきましたが、効率的ではありません。NestedVM と Cibyl はどちらも、MIPS バイナリをコンパイルし、バイナリを Java バイトコードに変換することで機能します。これは驚くほど効率的ですが、主な問題は 8 バイトと 16 バイトの値のメモリ アクセスです (これは複数の手順で行う必要があります)。

NestedVM と Cibyl のパフォーマンス特性はわずかに異なります。Cibyl は通常、整数の多いワークロードで高速ですが、NestedVM は float と double をより適切に処理します。これは、NestedVM が MIPS FPU 命令を変換する一方で、Cibyl が GCC ソフト フロート サポートを使用するためです (ただし、「実際の」Java バイトコード浮動小数点命令を使用します)。

Cibyl は J2ME 環境をより対象としていますが、他のプラットフォームでも確実に使用できます。私の推測では、Axiomatic C コンパイラを使用するよりも、それらのいずれかを使用した方がうまくいくと思います。

于 2009-09-22T13:35:37.027 に答える
4

それはまさにあなたが求めたものではありませんが、CibylはコンパイルされたC プログラムを JVM バイトコードに変換します。これは NestedVM (あなたが言及した) と同じ考え方ですが、独立した実装であるため、タスクがより高速になる可能性があります。

于 2009-01-20T01:37:26.693 に答える
3

一部のプロジェクトがこれを試みたと思いますが、何がアクセスできるかについてかなり厳しい制限なしにポインターを処理する方法はありません (基本的に、ポインターは配列インデックスに変換され、メモリの代わりに配列が割り当てられる必要があります)。

ポインターにあまり依存していない C を使用していて、それを JVM に入れたい場合は、それを Java に変換するだけで十分です。これは非常に簡単で、パフォーマンスもそれほど悪くないはずです。C は、ほとんどの領域で Java を約 2 倍上回っていますが、一部の領域ではさらに劣っており、いくつかの領域では Java が実際に C を上回っています (ヒープ メモリ管理など)。 100 倍高速であるため、その観点からは、それらの違いはほとんど意味がありません。

于 2009-01-20T01:39:17.640 に答える
1

C2Jソフトウェアを試す.......

c と入力して、Google で Java トランスレータに変換します。ダウンロードするためのリンクが表示されます。

于 2009-11-12T08:45:32.423 に答える