私はJavaの依存関係を取り除いてネイティブコードを生成し、アプリケーションとしてコンパイルされたコードをどのように提供できるのでしょうか?理論的に言えば、openJDK JITを入手し、Javaコードをネイティブにコンパイルできますか?
それは可能ですか?
P.S.私はgcjコンパイラについて知っているそれは何をしているのですか?
私はJavaの依存関係を取り除いてネイティブコードを生成し、アプリケーションとしてコンパイルされたコードをどのように提供できるのでしょうか?理論的に言えば、openJDK JITを入手し、Javaコードをネイティブにコンパイルできますか?
それは可能ですか?
P.S.私はgcjコンパイラについて知っているそれは何をしているのですか?
Excelsiorは非常に優れたJava2Nativeコンパイラを備えています。私はそれを使いたいですが、残念ながら私たちのプロジェクトはこのコンパイラでコンパイルするのに8時間かかります。アプリのスピードは印象的です。
コンパイルされたバイトコードは、引き続きJava仮想マシンに依存します。 JITは、JVMコンテナの外部で「意味をなさない」コードを作成することはできません。はい。その結果、ターゲットプラットフォームに対して一連の有効な指示が出されます。しかし、実際のスタック、ヒープ、ガベージコレクタが必要です(必要なビルディングブロックをいくつか指定するだけです)。
理論的には、言語に対して任意のインタープリタを使用し、その言語でネイティブコードを生成するコンパイラに変換することは可能です。これは、Futamura projectionsと呼ばれる一連の式に関連しています。高水準のアイデアは基本的に、コンパイラをどのように定義するかを「不正にする」ことです。いくつかの言語Lについて、言語Lで書かれたプログラムpが与えられた場合、そのプログラムを解釈する通訳I(p)があるとします。さて、私はインタプリタIがマシンコードで直接表現されていると仮定します。さらに、私はmix
というプログラムを持っているとします。マシンコードプログラムとそのプログラムへの入力シーケンスを与えられた入力は、指定された入力に固定された初期プログラムである新しいマシンコードプログラムを生成します。例えば、私はこのC++プログラムでコンパイルした場合:
#include <iostream>
using namespace std;
int main() {
string message;
cin >> message;
cout << message << endl;
}
をし、入力してプログラムを混合するためにmix
を使用し、「こんにちは、」私は常にメッセージ「こんにちは」をプリントアウトし、プログラムを取得したいです。言い換えれば、それは私がこのプログラムを書いていたかのように次のようになります。それは結局のところ
#include <iostream>
using namespace std;
int main() {
cout << "Hello" << endl;
}
それは、このプログラムを構築することが可能だという。たとえば、マシンコードを見て、コンソールから入力を読み取ろうとするすべての場所を見てから、関数を呼び出す代わりにハードコーディングされた文字列を読み込むコードで置き換えることで、これを行うことができます。
ここで、このmix
プログラムを実行して、インタープリタIといくつかのプログラムpを入力として実行するとどうなるかを考えてみましょう。それから、結果は、入力pで実行しているプログラムと同等のマシンコードプログラムになります。言い換えれば、プログラム上でインタプリタを実行する場合に起こることをシミュレートするマシンコードプログラムを構築しました。これは、プログラムpを実行するマシンコードプログラムです。
もちろん、この構成は完全に実用的ではありません。私の知る限りでは、誰もmix
と書いていません。そうした場合、インタプリタをコンパイラに変換して作成したプログラムは、最適化されていないため非効率的です。
JVMのJITを使用してJavaプログラム用の生のマシンコードを生成できるかどうかについての最初の質問については、私はソースコードを見ていないので確信が持てませんが、それ。マシンコードには、特定のタスク(ガベージコレクション、クラスローディングなど)のためにJVMにコールバックするフックが含まれているため、生成されたコードはスタンドアロン環境では動作しません。しかし、これをやろうとするのは本当にクールなアイデアです。私はこの答えがその背景にある理論に光を当ててくれることを願っています!
Downvoter-あなたは何がこの答えに間違っているとコメントできますか? – templatetypedef
この質問は、「Windowsを削除して、Windowsのプログラムをオペレーティングシステムなしでベアメタルで実行できるかどうか」と似ていますのでご注意ください。
Javaプログラムでは、JREが提供するクラスと、コンパイラまたはエミュレータに用意されているクラスが多数用意されています。
はですが、自分のアプリケーションで自分のJREを持ってくることができるランチャーを見ることができます。これはJREのプラットフォームでのみ機能しますが、プラットフォーム固有のものです。いくつか存在する - 私はあなたがそれを行う方法について既にStack Overflowにある多くの質問を見ることをお勧めします。
Class.forName()の構造を使用する必要がありますか? –
コンパイルされたコードを配信することができ、正しいバージョンのJavaがインストールされているシステムで実行されます。どんな言語でこれをやっても、いくつかのOS /ソフトウェアがインストールされていると仮定します。 –
Javaランタイムは、プリコンパイルされたクラスへの短絡によってネイティブコードのClass.forName()を処理できますが、もちろんプリコンパイルされていないクラスのJITまたはインタープリタも含める必要があります(動的プロキシ、サードパーティプラグインなど) –