33個とったよ

 

とるかとられるか、そういう世界。青で括ってあるのがコンスタントテーブルのタグで、これがせめて33個本当にあるかどうか数えてくれ。

01は文字UTF8テーブルで、私が書いたABCDEFGとか、はたまたクラス名とか、メソッド名などが列挙されている。JAVAは外部の命令をクラスローダーが読み込んで実行される、ローダーが命令を読み込むときに名前(シンボル)が必要になる、男のシンボルはシンボルロックだが、JAVAのシンボルはこのUTF8で書き込まれた文字列だ。なんと豊穣で、優雅な言語だJAVAは。JAVAの優雅さの一端を垣間見た気になり岡は部屋で一人なみだするのであつたとよ。

 

とりあえずこれを表におこしてみた

 

No

tag

 

 

1

0A

 

 

2

09

 

 

3

08

 

 

4

0A

 

 

5

07

 

 

6

07

 

 

7

01

 

<init>

8

01

 

()V

9

01

 

Code

10

01

 

LineNumberTable

11

01

 

LocalVariableTable

12

01

 

This

13

01

 

Ltest/test;

14

01

 

Main

15

01

 

([Ljava/lang/String;)V

16

01

 

Args

17

01

 

[Ljava/lang/String;

18

01

 

SourceFile

19

0C

 

 

20

07

 

 

21

0C

 

 

22

01

 

test.java

23

07

 

 

24

0C

 

 

25

01

 

ABCDEFG

26

01

 

test/test

27

01

 

java/lang/Object

28

01

 

java/lang/System

29

01

 

Out

30

01

 

Ljava/io/PrintStream;

31

01

 

java/io/PrintStream

32

01

 

Println

33

01

 

(Ljava/lang/String;)V

 

01=UTF8以外のタグで07(4つ)・08(1つ)・09(1つ)・0A(二つ).0C(二つ)があるのが分かる。

 

Constant Type

Value

CONSTANT_Class

7

CONSTANT_Fieldref

9

CONSTANT_Methodref

10

CONSTANT_String

8

CONSTANT_NameAndType

12

CONSTANT_Utf8

1

 

 

 

お洒落な画像が今回無いので、ここで小休止でイラストコーナーとする

 

ジュード・ロウ

 

とりあえず07からいってみよう

 

    CONSTANT_Class_info {
        u1 tag;
        u2 name_index;
    }
Tagはいいとしてこのname_indexは何か

今となっては中井美紀ほどの語学力を得た俺は、さらに説明を読むことにした。

とモノローグしたところで、タイトルロール・・・

 

「えんでー」

 

エンエンエーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーん(キャシャーーーーンのように)

ポリマー(真)

 

name_index

The value of the name_index item must be a valid index into the constant_pool table. The constant_pool entry at that index must be a CONSTANT_Utf8_info (§4.4.7) structure representing a valid fully qualified class or interface name (§2.8.1) encoded in internal form (§4.2).

 

たぶんこのインデックスは上から何番目かということだと思われる。

他の構造も見てみた
09
    CONSTANT_Fieldref_info {
        u1 tag;
        u2 class_index;
        u2 name_and_type_index;
    }

0A
    CONSTANT_Methodref_info {
        u1 tag;
        u2 class_index;
        u2 name_and_type_index;
    }

0C

    CONSTANT_NameAndType_info {
         u1 tag;
         u2 name_index;
         u2 descriptor_index;
    }

08

    CONSTANT_String_info {
        u1 tag;
        u2 string_index;
    }
番号をひっぱってきてみた

No

tag

Index

 

 

1

0A

0006

0014

 

2

09

0015

0016

 

3

08

0017

 

 

4

0A

0018

0019

 

5

07

001A

 

 

6

07

001B

 

 

7

01

 

 

<init>

8

01

 

 

()V

9

01

 

 

Code

01

 

 

LineNumberTable

01

 

 

LocalVariableTable

01

 

 

This

01

 

 

Ltest/test;

01

 

 

Main

01

 

 

([Ljava/lang/String;)V

10

01

 

 

Args

11

01

 

 

[Ljava/lang/String;

12

01

 

 

SourceFile

13

0C

0007

0008

 

14

07

001C

 

 

15

0C

001D

001E

 

16

01

 

 

test.java

17

07

001F

 

 

18

0C

0020

0021

 

19

01

 

 

ABCDEFG

1A

01

 

 

test/test

1B

01

 

 

java/lang/Object

1C

01

 

 

java/lang/System

1D

01

 

 

Out

1E

01

 

 

Ljava/io/PrintStream;

1F

01

 

 

java/io/PrintStream

20

01

 

 

Println

21

01

 

 

(Ljava/lang/String;)V

どういう事がそれぞれ書いてあるというとこうだ

No

tag

Index

 

 

 

1

0A

0006

0014

 class_index 07tag  name_and_type_index 07tag呼び出し

CONSTANT_Methodref_info

2

09

0015

0016

 class_index 0Ctag  name_and_type_index test.java

CONSTANT_Fieldref_inf

3

08

0017

 

 string_inde 07tag呼び出し

 CONSTANT_String_info

4

0A

0018

0019

 class_index 07tag name_and_type_index 0Ctag呼び出し

CONSTANT_Methodref_info

5

07

001A

 

 Test/test

 CONSTANT_Class_info

6

07

001B

 

 Java/lang/Object

 CONSTANT_Class_info

13

0C

0007

0008

 name_index <init> descriptor_index ()V

CONSTANT_NameAndType_info

14

07

001C

 

 Java/lang/System

 CONSTANT_Class_info

15

0C

001D

001E

 name_index LOut. descriptor_index Ljava/io/PrintStream

CONSTANT_NameAndType_info

17

07

001F

 

 Java/io/PrintStream

 CONSTANT_Class_info

18

0C

0020

0021

 name_index Println. descriptor_index (Ljava/lang/String)

CONSTANT_NameAndType_info

さらに整理するとこうだ

No

tag

Index

 

 

 

1

0A

0006

0014

 class_index java/lang/Object  name_and_type_index <init> ()V

CONSTANT_Methodref_info

2

09

0015

0016

 class_index Lout LJava/io/Printstream  name_and_type_index test.java

CONSTANT_Fieldref_inf

3

08

0017

 

 string_index java/io/printstream

 CONSTANT_String_info

4

0A

0018

0019

 class_index java/io/printstream name_and_type_index “ABCDEFG”

CONSTANT_Methodref_info

5

07

001A

 

 Test/test

 CONSTANT_Class_info

6

07

001B

 

 Java/lang/Object

 CONSTANT_Class_info

13

0C

0007

0008

 name_index <init> descriptor_index ()V

CONSTANT_NameAndType_info

14

07

001C

 

 Java/lang/System

 CONSTANT_Class_info

15

0C

001D

001E

 name_index LOut. descriptor_index Ljava/io/PrintStream

CONSTANT_NameAndType_info

17

07

001F

 

 Java/io/PrintStream

 CONSTANT_Class_info

18

0C

0020

0021

 name_index Println. descriptor_index (Ljava/lang/String)

CONSTANT_NameAndType_info

 

ここでソースコードに戻ってみる

 

/*

 * test.java

 *

 * Created on 2004/04/28, 9:15

 */

 

package test;

 

/**

 *

 * @author  okamino

 */

public class test {

   

    /** Creates a new instance of test */

    public test() {

    }

   

    /**

     * @param args the command line arguments

     */

    public static void main(String[] args) {

        System.out.println("ABCDEFG");

    }

   

}

 

コンパイラ界では普通のことだが、コメントが省かれているのがわかるだろう。

なんとなく納得のいくところもあり、いかないところもある。というのはまだ調査が半分で終わっているからだ。

 

それじゃあ下のコンスタントプール以外の部分は何を司っているのか。恐らくこれがソースコードの本体になるのだろう。

というまともなつなぎをして次号へ。

 

円でエンエンエン 終わり

ジュード・ロウ(バキューン)