2012-01-05 5 views
3

Javaが組み立てられるかどうか疑問に思っていましたが、私の読んだところでコンパイラがJava仮想マシン上で実行されるバイトコードを作成していました。 JVMはバイトコードを解釈して実行しますか?Javaのバイトコードを解釈するもの

これは私が混乱している理由です。今日の講義では、「コンパイラは高水準言語を使用してアセンブリ言語を作成し、アセンブリ言語を使用して実行可能な機械語(バイナリ)を作成する」と教授は述べています。だから、Javaがバイトコードをコンパイルすると、どのように実行できるのですか?

+0

http://en.wikipedia.org/wiki/Java_bytecode – galchen

+0

JVMは、バイトコードを解釈して実行し、および/またはプロセッサハードウェアによる直接実行のためにバイトコードを機械語にコンパイルします。 –

+0

異なる言語... Javaは仮想マシンで実行されますが、C++で開発されたネイティブアプリケーションはバイナリにコンパイルされ、実際のマシンで実行されます。 – 0909EM

答えて

3

バイトコードをJVMのマシンと考えてください。 (コンパイラはアセンブルする必要のあるアセンブリコードを生成する必要はありませんが、そのように書ける方がはるかに簡単です)。

+0

私は混乱しています。 Javaのバイトコードは、オブジェクトコードよりもマシンコードに近いと言えるでしょうか? 「コンパイラは高水準の言語を取り、アセンブリ言語を作成し、アセンブラはアセンブリ言語を使用し、実行可能な機械語(バイナリ)を作成します」ということは、コンパイラがマシンを作成する可能性があるためコードを直接? –

+0

@ quest4knoledge - 中間ステップとしてアセンブリ言語を生成するコンパイラはほとんどありません。ほとんどの場合、機械命令(「再配置可能」形式ではありますが)に直接移動します。コンパイラは非常にしばしば、最終的な機械命令を作成するためにある意味でコンパイルしてから「組み立てる」「中間表現」(またはいくつか)を持っていますが、これらのIRはかなりの程度まで古典的アセンブリ言語に似ていません。 –

+0

"マシンコード"と "オブジェクトコード"は、同じものを意味するためによく使われる2つの用語です(間違いなく、ここでは誰かが間違った区別をしています)。 –

0

簡単な説明では、JVMはJavaバイトコードをマシン固有のコードに変換します。生成されたマシン固有のコードは、マシンによって実行されます。

Javaコンパイラは、JAVAをByteCodeに変換します。 JVMは、実行時にByteCodeをアセンブリ(マシン固有のコード)に変換します。マシンはアセンブリを実行します。

+0

JVMは、最初はバイトコードをマシンコードに変換しません。当初はそれが解釈され、 "ホット"コードだけがJITCを通じて実行され、マシンコードが生成されます。 –

+0

プログラムがアセンブリで記述されている場合は、アセンブラを実行してから実行する必要がありますか?オブジェクトコードはアセンブリコードと同じですか? –

+0

@ quest4knoledge - 実際には、Javaバイトコード用のアセンブラがあります(標準Javaをコンパイルして実行するときには使用されませんが、ハッカーやシステムテストの方にとってはより使いやすいです)。また、「オブジェクトコード」とは、異なる人々と異なることを意味します.1つの解釈は、「機械命令」と同じになります。わずかに異なる解釈は、「オブジェクトコード」は、「オブジェクトプログラム」ファイル内にあるマシン命令の再配置可能で可能なバインド可能な表現を指すことである。 –

9

C言語で使用されるような標準的なコンパイラ設定があり、Javaとは大きく異なります。

標準のCコンパイラは(いくつかの内部フェーズを介して)「マシン命令」にコンパイルします。これらの命令はx86プロセッサなどで直接理解されます。

一方、Javaコンパイラは、「バイトコード」と呼ばれることがあるものをコンパイルします。これらはマシン命令ですが、仮想マシンの場合はJava仮想マシンです。したがって、JVMはバイトコードを「実際の」マシンのように解釈し、マシン命令を処理します。 (主な利点は、バイトコードにコンパイルされたプログラムが JVMで実行され、x86システム、IBM RISCボックス、またはAndroidのARMプロセッサであるかどうかに関係なく、JVMがある限りです。コードが実行されます。)

(歴史的に)。Javaへの同様の「仮想マシン」の数、より多くの成功したものの一つであるUCSD Pascalの「P-コード」システムがありました

しかし、それを取得しますより複雑に -

"バイトコード"の解釈はかなり遅く、非効率的であるため、大部分のJava実装では、バイトコードを「実際の」マシン命令に変換するスキームがあります。場合によっては、これは別のコンパイルステップで静的に行われますが、アプリケーションの実行中にバイトコードの一部を機械命令に変換する「ジャストインタイムコンパイラ」(JITC)を使用するのが最も一般的です。ハードウェアマシンの命令に変換することによってどのコードセグメントが最も利益を受けるかを決定する複雑なスキームで、これらは非常に精巧になります。しかし、Javaコードをコンパイルしなくても、特定のタイプのプロセッサをターゲットにすることなく、何が起きているのかを意識する必要はなく、ほとんどの場合、彼らは魔法を使用します。ただ、明確ノート

1

: Javaで「バイトコード」と呼ばれるそれはあなたのオリジナルの説明には何かということですが、「実行可能な機械語(バイナリ)を作成します」

だから、Javaの実行方法への答えbytecode is: 通常のx86コードを実行する場合は、それを処理するためにCPUを構築するのと同じ方法で、Javaバイトコードを処理できるプロセッサを構築します。

Javasバイナリマシン言語は、x86やpowerpcなどの他のcpusのバイナリ命令フォーマットと実際には違いはありません。そして、javaバイトコードを直接実行できるcpusが存在します。 (これは通常のIntel/AmdのCPUになります)。

他の例:通常のIntel CPU上でpowerpcコードをどのように実行しますか?実行時にpowerpcバイナリコードをx86コードに変換するソフトウェアをビルドします。 Javaの場合はそれほど違いはありません。したがって、x86のCPU上でJavaコードを実行するには、javaバイナリコード(別名バイトコード)をx86バイナリコードに変換するプログラムが必要です。これがjvm *の動作です。また、Java命令を一度に1つずつ解釈するか、一度に大量の命令を変換することによって(コールされたジット)、これを行います。 jvmがどのように変換を処理するかは、使用するjvm実装とその設定に依存します(さまざまな方法で翻訳を実装するjava jvmsの複数の独立した実装があります)。

しかし、Javaを少し違うものにするものがあります。 x86のような他のバイナリ命令フォーマットとは異なり、javaは実際にはCPU上で直接実行するように設計された新しいものでした。バイナリ形式は、x86やpowerpcなどの「通常の」CPU用のバイナリコードに簡単に変換できるように設計されています。

*実際には、jvmはjavaバイナリコードをプロセッサ依存コードに変換するだけです。また、Javaプログラムのメモリー割り振りを処理し、Javaプログラムとユーザー操作システム間の通信を処理します。これは、ユーザー操作システムとプラットフォームの詳細から独立したJavaプログラムを作成するために行われます。

関連する問題