• ベストアンサー

JVM(Java仮想マシン)の動作原理を教えて下さい。

JVM(Java仮想マシン)の動作原理を教えて下さい。 Javaバイトコードとして定義される命令セットを見たところ、比較的単純な命令しかありません。 Swingライブラリのようにウィンドウ表示などの環境に依存するプログラムがバイトコードでどのように表現されているのか教えて下さい。 つまり、Swingライブラリを使う側のバイトコードではなく、Swingライブラリ側のバイトコードはどのようになっているのでしょうか? (Swingに限らず、環境に依存する部分のバイトコードの表現がどのようになっているかを知りたいのです。)

質問者が選んだベストアンサー

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

クラスファイルのレベルでは, ネイティブメソッドは「ネイティブフラグが立っている (従ってそのクラスファイルでは定義されていない)」メソッドでしかありません. なので, メソッドを呼び出すどの命令によってもネイティブメソッドを呼び出すことができるはず.

noname#116448
質問者

お礼

わかりました。ありがとうございます!

その他の回答 (2)

  • salsberry
  • ベストアンサー率69% (495/711)
回答No.3

invokeinterface, invokespecial, invokestatic, invokevirtualのいずれもネイティブメソッドを呼べます。 ANo.2の方が既に書いているとおり、メソッドを呼ぶ側では呼び先がネイティブメソッドなのか普通のJavaのメソッドなのかを区別しません。だから、メソッドを呼ぶためのバイトコードはネイティブメソッドを呼ぶ場合も普通のJavaのメソッドを呼ぶ場合も同じです。

noname#116448
質問者

お礼

わかりました。ありがとうございます!

  • salsberry
  • ベストアンサー率69% (495/711)
回答No.1

Javaにはネイティブメソッドというものがあって、CやC++で書かれた関数をJavaのプログラムから呼ぶことができます。 グラフィクスでもファイルアクセスでも、最終的にはネイティブメソッドを呼ぶことで環境依存部分を実装しています。

noname#116448
質問者

補足

ネイティブメソッド自体は機械語に翻訳されるのでしょう。(C/C++で記述されれば、C/C++コンパイラでコンパイルされ、通常のオブジェクトが生成されるのでしょう。) そのネイティブメソッドを呼び出し(Java側)は、バイトコード上はどのように表現されるのでしょうか? 具体的なオペコードは何でしょうか? (invokevirtual, invokespecial, invokestatic,invokeinterfaceのいずれかですか?)

関連するQ&A