Integer Java Virtual Machine エミュレータ試作 作成者:森 考史 目次 1.Javaプログラムの実行 2.研究の目的と結果 3.IJVM(Integer Java Virtual Machine) 4.JVMについて 5.IJVMエミュレータの概要 6.まとめ Javaプログラムの実行 Javaプログラム コンパイル Classファイル Java VM Java VM Java VM Java VM Java VM Java VM MacOS Windows Linux Free BSD Solaris Solaris Power PC x86 SPARC JVM (Java Virtual Machine) ・ 命令セットが用意され、命令の実行時に様々な 記憶領域の操作が行われる。 Javaプログラム Classファイル JVM Class xx { public void xxx { ・・・・ ・・・・ ・・・・ } } CA FE BA BE 00 00 00 2E 2D 0A 00 0D 86 A0 07 00 87 1E 0A 00 88 00 20 0A 89 22 0A 00. ・・・・・・・・・・・・ ・・・・・・・・・・・・ Classファイルを 読み込み、 そこで指定された 操作を正しく 実行する。 目次 1. Javaプログラムの実行 2.研究の目的と結果 3.IJVM(Integer Java Virtual Machine) 4.JVMについて 5.IJVMエミュレータの概要 6.まとめ 研究の目的と結果 Javaの実行環境であるJVM(Java Virtual Machine) 本研究の成果物 をコストを少なく効果的に高速化させる ための材料を探すこと JVMのエミュレータを作る足がかりとして、 様々なアプリケーションにおいて JVMのサブセットである JVMの各命令の使用頻度や使用 1.JVMの各命令の使用頻度を取り、アプリケーション Integer Java Virtual Machine の性格によって差異が生まれるかどうかを調査する。 順序を調べることができるJVMの のエミュレータを作成した。 エミュレータを作る 2. JVMの各命令が使用される順序や組み合わせに 規則性がないかを調査する。 目次 1. Javaプログラムの実行 2.研究の目的と結果 3.IJVM(Integer Java Virtual Machine) 4.JVMについて 5.IJVMエミュレータの概要 6.まとめ Integer Java Virtual Machine Javaバイトコードの部分集合のためのアセンブラ およびインタープリタから成るもの。 命令 : 20種類 IJVMの命令セット オペコード ニーモニック 操作内容 0x10 BIPUSH byte_exp byte_expをオペランド・スタックへとプッシュする 0x59 DUP オペランド・スタックの先頭にある値がコピーさ れ、オペランド・スタックへとプッシュされる 0xA7 GOTO label 無条件分岐を行う 0x60 IADD オペランド・スタックから2つの値をポップして、 それらの合計をプッシュする 0x7E IAND オペランド・スタックから2つの値をポップして、 それらの論理積をプッシュする 0x99 IFEQ label 値をオペランド・スタックからポップし、それが 0なら分岐する 0x9B IFLT label 値をオペランド・スタックからポップし、それが 0未満なら分岐する 0x9F IF_ICMPEQ label 2つの値をオペランド・スタックからポップし、 それらが等しいならば分岐する IJVMの命令セット オペコード ニーモニック 操作内容 0x84 IINC varnum_exp, byte_exp 0x15 ILOAD vamum_exp vamum_expで示されたローカル変数を オペランド・スタックへとプッシュする 0xB6 INVOKEVIRTUAL クラスに基づくディスパッチを行い、 method インスタンス・メソッドを起動する 0x80 IOR オペランド・スタックから2つの値をポップして、 それらの論理和をプッシュする 0xAC IRETURN メソッドから int をリターンする 0x36 ISTORE varmum_exp 値をオペランド・スタックからポップし、それを varmum_expで示すローカル変数にセットする 0x64 ISUB オペランド・スタックから2つの値をポップして、 それらの差をプッシュする vamum_expで示されたローカル変数に、 byte_expをintへ符号拡張したものを加算する IJVMの命令セット オペコード ニーモニック 操作内容 0x13 LDC_W constant_exp constant_expで示される定数をオペランド・スタック へとプッシュする 0x00 NOP 何もしない 0x57 POP オペランド・スタックの先頭にある値をポップする 0x5F SWAP オペランド・スタックの先頭にある2つの値を交換 する 0xC4 WIDE 補助バイトを使用したローカル変数インデックスの 拡張をする 目次 1.Javaプログラムの実行 2.研究の目的と結果 3.IJVM (Integer Java Virtual Machine) (1)Classファイル 4.JVMについて (2)JVMの命令 5.IJVMエミュレータの概要 (3)JVMの構造 6.まとめ Classファイル Class ファイル マジックナンバー マイナーバージョン メジャーバージョン コンスタントプール アクセスフラグ this_class super_class インターフェース フィールド メソッド 属性リスト あるプログラムの Classファイルの一部 CA FE BA BE 00 00 00 2E 00 2D 0A 00 0D 00 1C 03 00 01 86 A0 07 00 1D 09 00 0C 00 1E 0A 00 0C 00 1F 0A 00 03 00 20 0A 00 0C 00 21 07 00 22 0A 00 08 00 1C 0A 00 08 00 23 0A 00 08 00 24 07 00 25 07 00 26 01 00 0D 63 6F 6E 73 74 61 6E 74 5F 70 6F 6F 6C 01 00 13 5B 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B 01 00 06 3C 69 6E 69 74 3E 01 00 03 28 29 56 01 00 04 43 6F 64 65 01 00 0F 4C 69 6E 65 4E Classファイル中のメソッド情報記述部分 メソッド1 メソッドの個数 (2バイト) アクセスフラグ(2バイト) メソッド1 メソッド名CPエントリ番号 (2バイト) ・ ・ ・ ディスクプリタCPエント番号 (2バイト) メソッドn JVMの命令が記述されて いるのはCode属性だけ 属性リスト メソッドの属性の種類 ・Code属性 ・Exceptions属性 ・Deprecated属性 ・Synthetic属性 目次 1. Javaプログラムの実行 2.研究の目的と結果 3.IJVM(Integer Java Virtual Machine) 4.JVMについて (1)Classファイル (2)JVMの命令 (3)JVMの構造 5.IJVMエミュレータの概要 6.まとめ JVMの命令 オペコード : 実行する操作を定義したもの(1バイト) オペランド : 操作が用いるデータ(引数) オペコードは約200種類 オペコード オペランドを 持たない命令 オペコード オペランド1 オペランド2 オペランド を持つ 命令 ・・・ Javaバイトコード : JVMの命令の集合によって記述されたもの Javaバイトコード の読み込み例 命令 オペコード オペランド iload 1 21 01 return B1 あるClassファイルのJavaバイトコード (16進表記) 21 01 B1 命令 引数 命令 iload 01 return do { オペコードの取得 ; if (オペランドが必要か?) { オペランドの取得 ; } } while (オペコードが残っているか?) ; 目次 1. Javaプログラムの実行 2.研究の目的と結果 3.IJVM(Integer Java Virtual Machine) 4.JVMについて (1)Classファイル (2)JVMの命令 (3) JVMの構造 5.IJVMエミュレータの概要 6.まとめ JVMの構造 Classファイル の取得先 CLASSPATH インターネット データサーバ メソッドエリア JVM システム クラスローダ ユーザ クラスローダ ユーザ クラスローダ クラス クラス クラス クラス クラス クラス クラス クラス クラス ス レ ッ ド Javaスタック ス レ ッ ド Javaスタック プログラム カウンタ プログラム カウンタ ヒープ インスタンス インスタンス インスタンス インスタンス インスタンス インスタンス インスタンス インスタンス インスタンス フレーム フレーム オペランド スタック オペランド スタック ローカル変数 ローカル変数 フレーム オペランド スタック ローカル変数 あるJavaのスレッド(スレッドAとする)がmethod1 というメソッドを実行した場合 スレッドA Javaスタック フレーム3 フレーム2 フレーム1 method1() { method2(); … } method2() { method3(); … } 先頭のフレームが作業中のフレーム (例)method1の 命令 バイトコードのある部分 命令 iload 1 istore 2 21 01 36 02 フレーム method1 ローカル変数配列 オペランドスタック 0 this a 1 a 2 ab 目次 1. Javaプログラムの実行 2.研究の目的と結果 3.IJVM(Integer Java Virtual Machine) 4.JVMについて (1)Classファイル (2)JVMの命令 (3) JVMの構造 5.IJVMエミュレータの概要 6.まとめ 5.IJVMエミュレータの概要 Classファイルを読み込み様々な情報を格納するプログラム 保存しておく情報 定数 フィールド インターフェース メソッド 配列に格納 メソッドの情報を受け取りJavaバイトコードを実行するプログラム フレームを可視化するプログラム 目次 1.Javaプログラムの実行 2.研究の目的と結果 3.JVMについて 4.IJVM(Integer Java Virtual Machine) 5.IJVMエミュレータの概要 6.まとめ 6.まとめ この研究で 作成したもの Integer Java Virtual Machine (命令20種類)のエミュレータ IJVMには存在しないJVMの命令を作成 Java Virtual Machine (命令約200種類)のエミュレータを作成 JVMの高速化のために、 様々なアプリケーションの実行時におけるJVMの 各命令の使用頻度及び使用順序の調査を行う。
© Copyright 2024 ExpyDoc