プログラミングについてのWiki。

binsummer2012

夏休みバイナリ入門 第1日目

実際にやる内容についてまとめていきます。

基本方針

  • 一方的に解説を進めない。
  • 要所要所で進捗を確認して、スタッフがアドバイスする。

説明 (13:00〜14:00)

準備
  • JDKの動作確認(パソコン持参者のみ)
  • Hello Worldのコンパイル
class Hello {
    public static void main(String[] args) {
        System.out.println("hello");
    }
}
  • Hello Worldの実行
  • Hello.classをjavapで分析
バイトコード
いきなりバイナリを読み始めないで、javapの出力のバイトコードから始める。
  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つずつ見ていく。

classファイルの解析
http://7shi.hateblo.jp/entry/2012/06/19/075814
スタックマシン
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        

ソースとの対応を示しながら、動きを説明。

Wiki内検索

Menu

ここは自由に編集できるエリアです。

管理人/副管理人のみ編集できます