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 |
|
|
|
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 |
|
8 |
|
|
12 |
|
|
|
|
お洒落な画像が今回無いので、ここで小休止でイラストコーナーとする

ジュード・ロウ
とりあえず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 |
|
A |
01 |
|
|
LineNumberTable |
|
B |
01 |
|
|
LocalVariableTable |
|
C |
01 |
|
|
This |
|
D |
01 |
|
|
Ltest/test; |
|
E |
01 |
|
|
|
|
F |
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 |
|
|
|
2 |
09 |
0015 |
0016 |
|
|
|
3 |
08 |
0017 |
|
|
|
|
4 |
0A |
0018 |
0019 |
|
|
|
5 |
07 |
001A |
|
Test/test |
|
|
6 |
07 |
001B |
|
Java/lang/Object |
|
|
13 |
0C |
0007 |
0008 |
|
|
|
14 |
07 |
001C |
|
Java/lang/System |
|
|
15 |
0C |
001D |
001E |
|
|
|
17 |
07 |
001F |
|
Java/io/PrintStream |
|
|
18 |
0C |
0020 |
0021 |
|
|
さらに整理するとこうだ
|
No |
tag |
Index |
|
|
|
|
1 |
0A |
0006 |
0014 |
|
|
|
2 |
09 |
0015 |
0016 |
|
|
|
3 |
08 |
0017 |
|
|
|
|
4 |
0A |
0018 |
0019 |
|
|
|
5 |
07 |
001A |
|
Test/test |
|
|
6 |
07 |
001B |
|
Java/lang/Object |
|
|
13 |
0C |
0007 |
0008 |
|
|
|
14 |
07 |
001C |
|
Java/lang/System |
|
|
15 |
0C |
001D |
001E |
|
|
|
17 |
07 |
001F |
|
Java/io/PrintStream |
|
|
18 |
0C |
0020 |
0021 |
|
|
ここでソースコードに戻ってみる
/*
* 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");
}
}
コンパイラ界では普通のことだが、コメントが省かれているのがわかるだろう。
なんとなく納得のいくところもあり、いかないところもある。というのはまだ調査が半分で終わっているからだ。

それじゃあ下のコンスタントプール以外の部分は何を司っているのか。恐らくこれがソースコードの本体になるのだろう。
というまともなつなぎをして次号へ。
円でエンエンエン 終わり

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