Javaをネイティブコードにコンパイルできますか?


82

JVMを必要とせずにJavaからスタンドアロン(またはライブラリ)マシンコードにコンパイルする方法はありますか?


3
「コンパイル」は、(「コンパイル」ではなく)探している単語です。
TJ Crowder 2010年

7
速度に関心がある場合は、HotSpot(SunのJVM)がサポートしていないプラットフォームを探しているのでない限り、気にしないでください。HotSpotは、実行パスの「ホットスポット」(頻繁に実行されるもの)が表示される場合は常に、バイトコードをネイティブコードにコンパイルします。これは非常に優れています。しかし、JVMを必要としないようにしたい場合は、そうです、Jamesが指摘したgcjを見てください。
TJ Crowder 2010年

3
さらに別の理由は、Javaデコンパイラーに対する保護です。HotSpotとネイティブコンパイラ(vs JRockit vs IBM vs GCC vs Visual C ++ vs hand-writing-CPU-instructions-in-hex)のパフォーマンスは、アプリケーションに依存するため、YMMVです。
ドミトリーレスコフ2010年

1
JServerAcceleratorと呼ばれるOracleデータベースに関するOracleによる興味深い開発が1つ見つかりました。また、バイトコードではなくCコードにコンパイルすることにより、何らかの方法でプラットフォームに依存するように設計されています。 docs.oracle.com/cd/A87860_01/doc/java.817/a83727/jtools5.htm
超新星

6
この質問がモデレーターによって閉じられた理由がわかりません。それは私には完全に明らかなようです。彼らがそれを理解していないなら、おそらく問題は彼らにあります。
isapir 2016

回答:


40

以前はGCCの一部であったGCJというツールがありましたが、削除されました。現在、GCCサイト内のすべてのリンクは、GCJ以外の同等のリンクにリダイレクトされます。

注意:コメントはすべて、GCJを使用してJavaをネイティブコードにコンパイルできるという私の元の回答を参照しています。


2
ええ、gcjは最もよく知られているものです。@ isola009:ネイティブコードにコンパイルするときは、Javaがデフォルトで通常持っているライブラリのサブセット(おそらく劇的に小さいサブセット)を使用する可能性があることに注意してください。Gnuは、すべてのアカウントでかなり優れていますが、現在のJDKよりもかなり遅れています。
TJ Crowder 2010年

これは、1.2以降のすべてのJDKSに大きく遅れをとっています。Javaの代わりにGNUクラスパスを誤って実行している人々に多くのサポートの問題が発生しました。それらはすべて、アンインストールしてSunJDKを使用することで例外なく解決されました。
user207421 2010年

Excelsior JETには、Java SE 6標準ライブラリのライセンス実装が含まれており、公式コンプライアンステスト(JCK)に合格しています。現在は6u18レベルであり、次のバージョンは6u20をサポートする予定です。
ドミトリーレスコフ2010年

27

はい!

オラクルは、ネイティブイメージをサポートするGraalVmに取り組んできました。ここをチェックしてください:https//www.graalvm.org/

ネイティブイメージ GraalVMSDKのネイティブイメージ機能は、Javaアプリケーションの起動時間を改善し、フットプリントを小さくするのに役立ちます。事実上、JVM(任意のプラットフォーム)で実行されるバイトコードを、特定のOS /プラットフォームのネイティブコードに変換します。これがパフォーマンスの源です。優れたパフォーマンスを実現するために、積極的な事前(AOT)最適化を使用しています。

続きを見る:


悲しいことに、でもこのプロジェクトは、生産のために安定していないとSwingのAPIを使用すると、まだサポートされていない/バギーです:github.com/oracle/graal/issues/1327
BullyWiiPlaza

「GraalVM19.0リリース:「GraalVMはようやく成熟し、本番環境で使用できるようになりました」。もちろん、バグやまだ完全ではない機能がいくつかあります。しかし、Twitterは本番システムで使用しているため、最初のリリースには同意しません。主張。
RobAu20年

私の個人的な経験では、Windowsおもちゃのプログラムだけで機能しますが、より高度なものや、を使用する場合GUIはまだ十分ではありません。TwitterおそらくLinux何も使用せずに使用しますGUIが、私がコミュニティのものを試しただけで、おそらく商用バージョンも使用しています。いくつかのユースケースでは機能するかもしれWindowsませんが、Javaデスクトップアプリケーションはそれらの1つではないため、プロジェクトは少しがっかりします。Excelsior JETこれを確実に行うことができましたが、現在は廃止されています。
BullyWiiPlaza


10

はい、JVMのJITはまさにそれを行います。

実際、実行時のコードの使用方法に基づいて特定のプラットフォーム用に最適化されたコードを生成できるため、事前にコードをコンパイルするよりも高速なコードを生成できます。

バイトコードを動的にロードして実行できるため、非常に高い割合がネイティブコードにコンパイルされている場合でも、JVMは常に関与します。


18
はい、あなたはJITがそれを行い、それを非常にうまく行っているということは正しいです。これは、スタンドアロンの実行可能ファイルを作成しませんが、その後、OPは....そのことについて尋ねていなかった
ビル・K

2
プラットフォーム固有の最適化を実行できるのはJITだけだとおっしゃっているようです。バイトコードを発送するときはいつでも可能だと思います。ARTは、インストール時にバイトコードをネイティブコードにコンパイルしますが、JITではありません。ピーター、これについて何かコメントはありますか?
Janus Troelsen 2015

2
OPは、スタンドアロンで、あらゆる種類のJITを排除していると述べています。JITはその場でネイティブコードを生成しますが、スタンドアロンになることはありません。
StormByte 2017

1
@KurtFitzner JITコンパイラが何をするかについて、あなたは非常に異なる考えを持っていると思います。それは、解釈が関与しないネイティブコードにコンパイルされます。
PeterLawrey18年

2
JITコンパイラーは、ネイティブAOTコンパイラー/リンカーほど深い最適化を行うことができるとは思いません。完全な最適化を使用してコンパイルおよびリンクすると、コンピューターがひざまずくはずです。そうでない場合、コンパイラーは最適化するために最善の努力をしていません。
ヨハン・ブール

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.