Javaコンパイラ(javac
)、仮想マシン(JVM)、java
スターターはどの言語で書かれていますか?
9 に答える
質問の正確な言い回しは少し誤解を招きます。複数のJVMベンダー(jrockitは1つ、IBMは別)と複数のコンパイラーが存在するため、 「JVM」や「コンパイラー」ではありません。
Sun JVMはで記述されて
C
いますが、そうである必要はありません。マシン上で実行されるJVMはプラットフォームに依存する実行可能ファイルであるため、元々は任意の言語で記述されている可能性があります。たとえば、元のIBMJVMはSmalltalkで記述されていましたJavaライブラリ(など、多くの場合Java APIと呼ばれ
java.lang
ます)はそれ自体がJavaで記述されていますが、としてマークされたメソッドはまたはで記述されています。java.util
native
C
C++
Sunが提供するJavaコンパイラもJavaで書かれていると思います。(繰り返しになりますが、そこには複数のコンパイラがあります)
最初のJavaコンパイラはSunMicrosystemsによって開発され、C++のいくつかのライブラリを使用してCで記述されました。現在、JavaコンパイラはJavaで記述されていますが、JREはCで記述されています。
JavaコンパイラがJavaでどのように記述されたかは次のように想像できます。
JavaコンパイラはJavaプログラムとして記述され、Cで記述されたJavaコンパイラ(最初のJavaコンパイラ)でコンパイルされます。したがって、新しくコンパイルされたJavaコンパイラ(Javaで記述)を使用して、Javaプログラムをコンパイルできます。
コンパイラはJavaで記述され、ランタイムはANSICで記述されています。
実際、OracleJVMはCではなくC++で記述されています。
ここでHotSpotJVMコードを見てください:http://openjdk.java.net/groups/hotspot/
原則としてほとんど何でも、通常はC
このリンクはあなたの質問に答えるはずです
コンパイラは現在Javaで記述されているようですが、ランタイムはANSICで記述されています。
- JavaがSunMicrosystemによって導入されたとき、JavaコンパイラはC++のいくつかのライブラリを使用してCで記述されていました。
- コンパイラー設計にはブートストラップと呼ばれる概念があるため、主にコンパイラー開発で使用されます。ブートストラップ法は、コンパイル対象のソースプログラミング言語でコンパイラー(またはアセンブラー)を作成するプロセスです。これは、セルフホスティングコンパイラを作成するために使用されます。新しいプログラミング言語用のコンパイラの開発は、最初に既存の言語で開発され、次に新しい言語で書き直され、それ自体でコンパイルされました。 そのため、今日、JavaコンパイラはJava自体で記述されています。
- Java仮想マシン: Java仮想マシンは抽象マシンです。実際のコンピューティングマシンのように、それは命令セットを持ち、実行時のさまざまなメモリ領域を操作します。通常、JVMはバイトコードをマシンコードに解釈します。
(詳細については、次のリンクを確認できます:https ://docs.oracle.com/javase/specs/jvms/se7/html/ )
研究目的で広く使用されているセルフホスティングJVMであるJikesRVMは、Javaで記述されています。これは、人々がデスクトップで実行するものではありませんが、「言語の一般的な力を誇示しましょう」という私のリストの上位にあります。
Sunが提供するiircであるHotspotJVMについて話しているとすると、C++で記述されています。Javaのさまざまな仮想マシンの詳細については、このリンクを確認してください。 javacは、ほとんどのJavaコンパイラと同様に、Javaで記述されています。