LLVMを介してC ++アプリケーションからJavaへのポートを作成することは実行可能ですか


9

LLVMを使用してC ++アプリケーションをJavaバイトコードに移植することは、どの程度実行可能ですか(おそらくLLJVM)。

現在のところ、プロセスはC ++で記述されていますが、新しいクライアントでは、明らかにネイティブコードがない(JNIがない)Java仮想マシンを使用して、マルチプラットフォームでプログラムを実行できるようにする必要があります。アイデアは、生成されたjarを取得して別のシステム(Linux、Win、32ビット-64ビット)にコピーできるようにすることであり、動作するはずです。

周りを見回すと、C ++をLLVM IRコードにコンパイルしてから、そのコードをJavaバイトコードにコンパイルできるように見えます。生成されたコードが読み取り可能である必要はありません。

私はemscriptenを使用して同様のもので少しテストしました。これはC ++コードを取り、それをJavaScriptにコンパイルします。結果は有効なJSですが、完全に読み取ることができません(アサンブラーのように見えます)。

  • この技術を使用して、C ++からJavaバイトコードへのアプリケーションの移植を行った人はいますか?
  • どのような問題に直面する可能性がありますか?
  • 量産コードに対する有効なアプローチはありますか?

いくつかのコメントの後で私のポイントをより明確にするために、おそらくポートが十分に使用されていない可能性があります。結果として、読み取り可能なソースコードは期待できません.javaバイトコードだけなので、今後開発される「ポート」ではありません。ターゲットのプラットフォームは、ネイティブのアッサンブラーではなく、Java JVMでなければなりません。

注:現在、いくつかの非標準C ++およびクローズソースライブラリがあることを承知しています。この非標準コードおよびすべてのクローズソースライブラリを削除し、無料のLibreオープンソースソフトウェアを使用する予定です。したがって、すべてのコードが標準C ++コードであると仮定しましょうコンパイル時に利用可能なすべてのコード。

注2:移植可能なC ++コードを記述して、それを目的のターゲットプラットフォームにコンパイルするオプションではありません。コンパイルされたプログラムはマルチプラットフォームでなければならず、したがってJVMを使用します。

注3:現在、Pythonや他の言語ベースに適用される同様のソリューションについては検討していませんが、それについても聞きたいと思います。これにより、ターゲットの実行可能ファイルはjavaバイトコードである必要がありますが、C ++を有効なpythonコンパイル済みコードにコンパイルするオプションがある場合は、それらについても聞きたいと思います。


Pythonに関する最後の文の意味がわかりませんが、Jythonはまったく同じです。PythonVMの代わりにJVMを使用し、そのシナリオで使用します。プログラマーがPythonを使用する場合、JVMにデプロイする必要があります。
ハビエル

何行のコードについて話しているのですか?それを書き換えるのはあなたの時間の価値があるかもしれませんが、それは簡単な決定ではありません。また、コードがポインター演算を行う場合、JVMで作業するときにそれがどのように処理されるか知りたいと思います。
Levi Morrison

1
楽しいはずのデバッグO_o
Daniel Gratzer 2013年

@LeviMorrison。まあコードは非常に広範囲です(通信、ユーティリティ関数のさまざまなライブラリ依存関係)が、コンパイル時にすべてのコードを利用できると想定されています。また、別のクライアントが必要としない場合でも、ネイティブバイナリを生成します。
ハビエル氏

@jozefg。ポインタの計算と目的のデバッグについては、デバッグできるとは思いません。たとえば、Emscriptenも同じことを行いますが、ターゲット言語はJavascriptです。プログラムカウンターのヒープおよびビット単位の演算として大きなバイト配列で終わり、オブジェクトや文字列などのないバイトで演算を行うだけです。Javaバイトコードのassamblearと同様の結果が期待されますが、デバッグできないと想定できます。
ハビエル氏

回答:


11

これがうまくいくかどうかは本当に疑わしい。コードをJavaバイトコードに変換できる場合がありますが、ライブラリの呼び出しを魔法のようにJavaランタイムとライブラリの同等の呼び出しに変換することはできません。同等のJavaランタイムコールさえないかもしれません!独自のライブラリをすべて削除しても、C ++標準ライブラリのままです。

これを具体的にするには、C ++プログラムにfprintf()への呼び出しが含まれている場合があります。その関数はC標準ライブラリに実装されており、C ++プログラムがそれを呼び出すことは完全に合法です。LLVMからLLJVMへの変換プログラムは、fprintf()と同等の結果を生成し、それらを置き換えるJavaランタイムコールのシーケンスを魔法のように理解することはおそらくないでしょう。バイトコード。

C ++からJavaへの変換を実行するツールいくつかありますが、変換するのは少数の単純なランタイムライブラリ呼び出しだけです。残りは理解するためにあなたに任されています。


私はあなたのポイントを理解していますが、私が理解している限り、emscriptenはJavascriptであるターゲットと同様のことを行いますが、私が誤解していなかった場合、emscriptenはあなたが指摘したことを回避するためにカスタム標準ライブラリを提供します(SDLライブラリを介したwebGLのマッピングさえも) )。しかし、私はJavaに相当するものを見つけることができません(LLJVMは放棄されているようです)。私はllvmバイトコードをプラットフォームに依存しないビルドとして提案することを考えています(もちろん、プラットフォームに応じて、APIまたはデータによるコンパイルブランチはありません。使用aprまたは類似)
Javier Mr

3
lljvmは、一部はJVMバイトコードにコンパイルされたCとして、一部はJavaクラスとして、Cランタイムライブラリを提供します。それはかなり完全なlibcです。libstdc ++に相当するものを作成する必要があります。また、lljvmバックエンドは、現時点では実際にはC ++を実際にはサポートしていません。最近のllvmビルドで動作するようにlljvmを修正しようとしています。llvm APIとツールはリリース間で大きく変化し続けるので、それは遅いです。あなたはここに沿って進むことができます、それは現在ほとんど使用可能な形になっています。github.com/hyc/lljvm/tree/llvm3.3
hyc
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.