8

どうすればjavajre依存関係を取り除き、ネイティブコードを生成して、コンパイルされたコードをアプリケーションとして配信できるのでしょうか。

それでそれは可能ですか?

PS私はgcjコンパイラについて知っていますが、それは何をしているのですか?

4

4 に答える 4

3

コンパイルされたバイトコードは、引き続きJava仮想マシンに依存します。JITは、JVMコンテナの外部で「意味のある」コードを作成することはできません。はい、結果はターゲットプラットフォームの有効な命令の束です。ただし、実際のスタック、ヒープ、およびガベージコレクターが必要です(必要なビルディングブロックをいくつか挙げるだけです)。

于 2011-02-15T09:02:44.073 に答える
1

Excelsiorには、非常に優れたJava2Nativeコンパイラがあります。私はそれを使いたいのですが、残念ながら私たちのプロジェクトはこのコンパイラでコンパイルするのに8時間かかります。結果として得られるアプリの速度は印象的な考えです。

于 2011-02-15T09:04:46.657 に答える
1

理論的には、ある言語のインタプリタを使用して、その言語でネイティブコードを生成するコンパイラに変換することができます。これは、二村射影と呼ばれる一連の方程式に関連しています。高レベルのアイデアは、基本的に、コンパイラーの定義方法を「ごまかす」ことです。ある言語のLIにインタプリタI(p)があり、言語Lで書かれたプログラムpが与えられると、そのプログラムを解釈するとします。ここで、インタプリタIがマシンコードで直接表されていると仮定します。さらにmix、マシンコードプログラムとそのプログラムへの入力シーケンスが与えられると、入力が指定された入力に固定された初期プログラムである新しいマシンコードプログラムを生成するというプログラムがあるとします。たとえば、このC++プログラムをコンパイルした場合:

#include <iostream>
using namespace std;

int main() {
    string message;
    cin >> message;
    cout << message << endl;
}

そしてmix、プログラムを入力「Hello」とミックスするために使用すると、常に「Hello」というメッセージを出力するプログラムが得られます。言い換えれば、私がこのプログラムを書いたかのようになります。

#include <iostream>
using namespace std;

int main() {
    cout << "Hello" << endl;
}

このプログラムを作成することは可能であることがわかりました。これを行うには、たとえば、マシンコードを調べ、コンソールから入力を読み取ろうとするすべての場所を調べ、ハードコードされた文字列から読み取る代わりに関数を呼び出すコードに置き換えます。

mixここで、インタプリタIといくつかのプログラムpを入力としてこのプログラムを実行するとどうなるかを考えてみましょう。その結果、入力pで実行しているプログラムと同等のマシンコードプログラムになります。つまり、プログラムでインタープリターを実行した場合に何が起こるかをシミュレートするマシンコードプログラムを作成しました。これは、プログラムpを実行するマシンコードプログラムです。

もちろん、この構造は完全に実用的ではありません。私の知る限り、誰も書いていませんmix。もしそうなら、インタプリタをコンパイラに変えて作ったプログラムは、まったく最適化されていないので、ひどく非効率的です。

JVMのJITを使用してJavaプログラムの生のマシンコードを生成できるかどうかについての最初の質問については、ソースコードを調べていないのでわかりませんが、強く疑っています。マシンコードには、ほぼ確実に、特定のタスク(たとえば、ガベージコレクション、クラスのロードなど)のためにJVMにコールバックするフックが含まれているため、生成されたコードはスタンドアロン環境では機能しません。しかし、これを試してみるのは本当にクールなアイデアであり、この答えがその背後にある理論に光を当てることを願っています!

于 2011-02-15T09:17:55.550 に答える
0

この質問は、「Windowsを削除して、オペレーティングシステムなしでWindowsプログラムをベアメタルで実行できるようにすることはできますか?」に似ていることに注意してください。

Javaプログラムは、JREが提供するものであるクラスの大規模なセットがすぐに利用可能であり、コンパイラーまたはエミュレーターも提供する必要があることを期待しています。

ただし、実行できるのは、アプリケーションに独自のJREを持ち込むことができるランチャーを確認することです。これはJREのプラットフォームでのみ機能しますが、プラットフォーム固有であることをすでに望んでいます。いくつか存在します-それを行う方法について、StackOverflowにすでにある多くの質問を参照することをお勧めします。

于 2011-02-15T09:18:51.380 に答える