Javaをマシンコードにコンパイルすることは可能ですか?(バイトコードではありません)


32

Javaをマシンコードに直接コンパイルできますか?

私はこれをしたいので、どのプラットフォームで使用されているかを制御できますが、C、C ++などは知りません

回答:


36

と思われるJava用のGNUコンパイラは Javaバイトコードまたはマシン・コードのいずれかにJavaソースコードを変換することができます。既存のJavaバイトコードをマシンコードに変換することもできます。ただし、最後のニュースは2009年のものであるため、それがどの程度最新であり、Java言語の最新機能を処理できるかどうかはわかりません。


1
Javaバイトコードが2009年以降変更されていない場合、開発者がソフトウェアに「Hey!I'm still here」フラグを振らなくても、これは引き続き機能するはずです。
ロバートハーベイ

@RobertHarvey Java 7はいくつかの新しい言語の概念を導入したと思うので、ソースファイルをマシンコードに変換するのに失敗する可能性があります。これらの新機能でバイトコードも変更された場合、同様に失敗します
トーマスオーエンズ

1
Excelsior JETはまだアクティブ(商用)のようです。Fujitsu TowerJがありましたが、それは10年前に亡くなったようで、当時はかなり無意味でした。
トムホーティン-タックライン

私はJava 6を使用しているので、私の場合はJava 7は問題ありません
ラッセル

1
GCJのWebサイトは、Java 1.5さえも完全にはサポートしていなかったと言っています。このスレッドを参照してください:stackoverflow.com/a/4040404/1257384
GregT

13

OPに直接直接回答するわけではありませんが、おそらく興味深い話です。Javaは3つのモードで実行できます。

  1. 混合(デフォルト)-解釈済みコードとマシンコンパイル済みコードの組み合わせ(マシンコンパイル済み==実行時にJITによりコンパイル済み)
  2. -Xint解釈- -フラグバイトコードのみ
  3. -Xcompコンパイル- -機械コンパイルフラグは、

1
@MartjinこれはHotSpot用ですか?-XcompJDK 7のドキュメントまたはHotSpotオプションのドキュメントで見つけることができなかったため、偶然にも参照があります。
エダロルゾ

2
これは意図的に隠されたオプションですyes :-)。さまざまなopenjdk(openjdk.java.net)メーリングリストがあり、この種の情報を収集したり、ソースコードを読んだりできます:
Martijn Verburg

私のテストによれば、-Xcompのパフォーマンスは、場合によっては2倍低下することに注意してください。
ダニエルレミア14

まあ、そうだろう。JITが実行されていない場合、ジャストインタイムの最適化は困難です。持つことができます!=持つことになります。
candied_orange

うーんので、これらはオプションjavacですか?-Xcompを使用すると、デフォルトで単一のバイナリファイルが出力されますか?
アレクサンダーミルズ

7

System.getProperty(“ os.name”)を使用してオペレーティングシステムを検出する方が良い場合があります。これにより、複数のOSをサポートすることを選択できますが、他のOSは除外します。


これをだまされたりゲームにかけられたりする方法はありますか?
FrustratedWithFormsDesigner

@Frustrated、おそらく、しかし、彼の意図は、彼がテストしていないオペレーティングシステムを公式にサポートすることを控えることだと思っていました。それ以外の場合は、本質的に無料になる移植性を意図的に無効にすることは意味がありません。
カールビーレフェルト

また、OSに依存しない方法でプログラムを特定のハードウェアに結び付けたいと思うこともあります。
FrustratedWithFormsDesigner

JVMの特別な引数を使用して、「os.name」システムプロパティを強制できますjava -Dos.name=MacOS
SkyDan

2

GraalVMを使用すると、プログラムを事前にネイティブ実行可能ファイルにコンパイルできます。ネイティブイメージ機能を見てみましょう。

関連質問:「Javaをネイティブコードにコンパイルできますか?」 https://stackoverflow.com/questions/2991799/can-i-compile-java-to-native-code/50555050#50555050


PS GCJはもう保守されていません。
出典:「gcjの削除」http://tromey.com/blog/?p=911

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