binsummer2012
- JDKの動作確認(パソコン持参者のみ)
- Hello Worldのコンパイル
class Hello { public static void main(String[] args) { System.out.println("hello"); } }
- Hello Worldの実行
- Hello.classをjavapで分析
いきなりバイナリを読み始めないで、javapの出力のバイトコードから始める。
Codeの部分だけを見ていく。
バイトコードの命令は以下の構成になっている。
※ 打ち合わせで「この構成はスタックマシンで・・・」という説明をしようという話になった。しかし参加者のレベルはまちまちなので、この段階では命令を流すだけにして、スタックマシンの説明は必要に応じてすれば良いのではないかと思い始めた。スタックマシンについては後で章を設ける。
#2がjava/lang/System.out(コロンの後は型)、#3が"hello"、#4がjava/io/PrintStream.println(コロンの後は型)を示している。
※ ここでの#はナンバーと読み、No.と同じ意味。
これらの番号はjavapの出力のConstant poolを指している。
public static void main(java.lang.String[]); flags: ACC_PUBLIC, ACC_STATIC Code: stack=2, locals=1, args_size=1 0: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream; 3: ldc #3 // String hello 5: invokevirtual #4 // Method java/io/PrintStream.println:(Ljava/lang/String;)V 8: return LineNumberTable: line 3: 0 line 4: 8
Codeの部分だけを見ていく。
System.out.println("hello");
0: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream; 3: ldc #3 // String hello 5: invokevirtual #4 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
バイトコードの命令は以下の構成になっている。
※ 打ち合わせで「この構成はスタックマシンで・・・」という説明をしようという話になった。しかし参加者のレベルはまちまちなので、この段階では命令を流すだけにして、スタックマシンの説明は必要に応じてすれば良いのではないかと思い始めた。スタックマシンについては後で章を設ける。
#2がjava/lang/System.out(コロンの後は型)、#3が"hello"、#4がjava/io/PrintStream.println(コロンの後は型)を示している。
※ ここでの#はナンバーと読み、No.と同じ意味。
これらの番号はjavapの出力のConstant poolを指している。
#2 = Fieldref #16.#17 // java/lang/System.out:Ljava/io/PrintStream; #3 = String #18 // hello #4 = Methodref #19.#20 // java/io/PrintStream.println:(Ljava/lang/String;)V本題から外れるので、#16等は追わないで、ここで止める。
1+2とか1+2*3を引き合いに出しながら説明
バイトコード
ソースとの対応を示しながら、動きを説明。
class Hello { public static void main(String[] args) { int a = 2; int b = 3; int c = a + b; System.out.println(c); } }
バイトコード
Code: stack=2, locals=4, args_size=1 0: iconst_2 1: istore_1 2: iconst_3 3: istore_2 4: iload_1 5: iload_2 6: iadd 7: istore_3 8: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream; 11: iload_3 12: invokevirtual #3 // Method java/io/PrintStream.println:(I)V 15: return
ソースとの対応を示しながら、動きを説明。
最新コメント