Java public class Add int addint a int
Javaとアセンブラの違い public class Add{ int add(int a, int b){ return a+b; } } • 結構長くなる. • メソッド等の対応はそ のまま. • 暗黙定義のコンストラク タなどが補完されている . . class public Add. super java/lang/Object. method public <init>()V. limit stack 1. limit locals 1 aload_0 invokespecial java/lang/Object/<init>()V return. end method add(II)I. limit stack 2. limit locals 3 iload_1 iload_2 iadd ireturn. end method 3
アセンブラとクラスファイル. class public Add. super java/lang/Object. method public <init>()V. limit stack 1. limit locals 1 aload_0 invokespecial java/lang/Object/<init>()V return. end method add(II)I. limit stack 2. limit locals 3 iload_1 iload_2 iadd ireturn. end method な,何が何やら? (236 Byteあります.) CA 00 00 3 C 03 6 F 6 E 54 61 49 75 01 61 01 10 6 E 74 00 00 00 60 00 00 00 FE 0 F 0 D 69 28 64 65 61 64 29 72 00 76 00 6 A 67 00 00 00 06 03 AC 00 05 02 BA 0 A 07 6 E 29 65 4 E 62 64 49 63 08 61 03 61 2 F 21 00 05 1 D 05 00 00 00 BE 00 00 69 56 01 75 6 C 01 01 65 41 0 C 41 76 4 F 00 00 2 A 01 01 08 00 00 00 06 01 0 B 00 03 0 E 74 01 00 6 D 65 00 00 46 64 00 64 61 62 02 02 01 01 B 7 00 00 03 00 01 3 E 00 0 F 62 01 05 0 A 69 64 04 64 2 F 6 A 00 00 00 07 00 09 1 C 04 01 01 0 A 00 0 C 00 01 04 4 C 65 00 28 53 6 C 2 E 00 01 6 C 65 03 01 06 01 01 00 00 1 B 00 00 00 2 D 07 06 00 43 69 72 03 49 6 F 65 6 A 05 00 61 63 00 00 B 1 00 03 01 02 1 C 07 00 00 ; ; ; ; ; ; ; ; . . . <init>. . . ()V. . . C ode. . . Li ne. Number Table. . . add. . . (I I)I. . . So urce. File. . . Add. j ava. . . . Add. . . java/la ng/Objec t. !. . . . *. . . `. . . . 4
クラスファイル内部の分類 定数データの表 (コンスタントプール) (50. 4%) CA 00 03 6 E 61 75 61 10 74 04 00 00 00 60 00 FE 0 D 28 65 64 72 76 6 A 00 00 00 06 06 AC 05 BA 07 29 4 E 64 63 61 61 21 05 05 00 00 BE 00 56 75 01 65 0 C 76 00 00 2 A 01 00 00 01 00 0 E 01 6 D 00 46 00 61 02 01 B 7 00 00 03 01 00 62 05 69 04 2 F 00 00 1 C 01 0 A 00 00 04 65 28 6 C 00 6 C 03 06 01 00 00 2 D 06 43 72 49 65 05 61 00 00 B 1 03 02 07 00 00 3 C 6 F 54 49 01 01 6 E 00 00 0 F 69 64 61 29 00 00 67 00 00 03 00 02 0 A 6 E 65 62 49 08 03 2 F 00 1 D 00 00 00 69 01 6 C 01 41 41 4 F 00 00 01 08 00 06 0 B 03 74 00 65 00 64 64 62 02 01 00 00 00 3 E 0 F 01 0 A 64 64 6 A 00 00 07 09 04 01 0 C 01 4 C 00 53 2 E 01 65 01 01 00 00 1 B 00 07 00 69 03 6 F 6 A 00 63 00 00 00 01 1 C 00 ; ; ; ; . . . . -. . . . <init>. . . ()V. . . Code. . . Li ne. Number. Table. . . add. . . (II)I. . . So urce. File. . . Add. j ava. . . . Add. . . java/lang/Objec t. !. . . . *. . . `. . . . プログラム(アセンブラ命令)の部分は,たったこれだけ.(3. 8%) 5
命令文はどうなってる? コイツの話が今日のメイン . class public Add. super java/lang/Object. method public <init>()V. limit stack 1. limit locals 1 aload_0 invokespecial java/lang/Object/<init>()V return. end method add(II)I. limit stack 2. limit locals 3 iload_1 iload_2 iadd ireturn. end method 2 A ; p. 227 aload_0 B 7 00 01 ; p. 368 invoke. . . B 1 ; p. 452 return 1 B 1 C 60 AC ; ; p. 355 p. 318 p. 379 iload_1 iload_2 iadd ireturn 今日は命令全体の話はあ まりしません. 7
簡単なクラスの構造例 • 詳細は. /runnable/ を参照. – インタフェース 1, フィールド2, メソッド2 のクラス public class My. Run implements Runnable{ private int a=0; int b=2; public void run(){ a++; b=incb(); } private int incb(){ return b+1; } } 11
コンスタントプール • 今日のメイン ・・・・ 詳細は別途 00 1 B ; constant pool number= 26(d) ; ; ; ; ; ; ; ; ; 0 A 00 06 00 14 ; (00 01) Methodref => java/lang/Object. <init>: ()V 09 00 05 00 15 ; (00 02) Fieldref => My. Run. a: I 09 00 05 00 16 ; (00 03) Fieldref => My. Run. b: I 0 A 00 05 00 17 ; (00 04) Methodref => My. Run. incb: ()I 07 00 18 ; (00 05) Class => My. Run 07 00 19 ; (00 06) Class => java/lang/Object 07 00 1 A ; (00 07) Class => java/lang/Runnable 01 00 01 61 ; (00 08) Utf 8 = "a" 01 00 01 49 ; (00 09) Utf 8 = "I" 01 00 01 62 ; (00 0 A) Utf 8 = "b" 01 00 06 3 C 69 6 E 69 74 3 E ; (00 0 B) Utf 8 = "<init>" 01 00 03 28 29 56 ; (00 0 C) Utf 8 = "()V" 01 00 04 43 6 F 64 65 ; (00 0 D) Utf 8 = "Code" 01 00 0 F 4 C 69 6 E 65 4 E 75 6 D 62 65 72 54 61 62 6 C 65 ; (00 0 E) Utf 8 = "Line. Number. Table" 01 00 03 72 75 6 E ; (00 0 F) Utf 8 = "run" 01 00 04 69 6 E 63 62 ; (00 10) Utf 8 = "incb" 01 00 03 28 29 49 ; (00 11) Utf 8 = "()I" 01 00 0 A 53 6 F 75 72 63 65 46 69 6 C 65 ; (00 12) Utf 8 = "Source. File" 01 00 0 A 4 D 79 52 75 6 E 2 E 6 A 61 76 61 ; (00 13) Utf 8 = "My. Run. java" 0 C 00 0 B 00 0 C ; (00 14) Name. And. Type => <init>: ()V 0 C 00 08 00 09 ; (00 15) Name. And. Type => a: I 0 C 00 0 A 00 09 ; (00 16) Name. And. Type => b: I 0 C 00 10 00 11 ; (00 17) Name. And. Type => incb: ()I 01 00 05 4 D 79 52 75 6 E ; (00 18) Utf 8 = "My. Run" 01 00 10 6 A 61 76 61 2 F 6 C 61 6 E 67 2 F 4 F 62 6 A 65 63 74 ; (00 19) Utf 8 = "java/lang/Object" 01 00 12 6 A 61 76 61 2 F 6 C 61 6 E 67 2 F 52 75 6 E 6 E 61 62 6 C 65 ; (00 1 A) Utf 8 = "java/lang/Runnable" 13
クラスの情報 • クラス自体固有の情報 p. 58 or p. 195 00 21 ; access flag= PUBLIC + SUPER 00 05 ; this class= "My. Run" 00 06 ; super class= "java/lang/Object" 14
フィールドのリスト • クラス内のフィールド数とそれぞれを列挙. 00 02 ; num. of field(s)= 2(d) ; ; ; ; ; ; ; ; ; ; p. 62 or p. 209 ; BEGIN field 1(d) def. 00 02 ; access flag of attributes = PRIVATE 00 08 ; method name ="a" 00 09 ; method type ="I" 00 00 ; num. of attribute(s), 0(d) ; BEGIN field 2(d) def. 00 00 ; access flag of attributes = 00 0 A ; method name ="b" 00 09 ; method type ="I" 00 00 ; num. of attribute(s), 0(d) 16
メソッドのリスト • 実装してるメソッド数と,それぞれのメソッド をリストアップ 00 03 ; num. of methods(s)= 3(d) ; ; メソッド1, 2は複雑だから省略 p. 73 or p. 210 00 02 ; access flag of method = PRIVATE 00 10 ; method name ="incb" 00 11 ; method type ="()I" 00 01 ; num. of attribute(s), 1(d) ; ; begin attribute 1(d) 00 0 D ; attribute type= "Code" 00 00 00 1 F ; attribute length= 31(d) 00 02 ; stacks limits 00 01 ; locals limits 00 00 00 07 ; length of codes = 7(d) 2 A ; aload_0 B 4 00 03 ; getfield My. Run/b I 04 ; iconst_1 60 ; idd AC ; ireturn 00 00 ; num. of exception handler(s) = 0(d) ; ; 00 01 ; num. of attr. of this code attr. = 1(d) 00 0 E ; "Line. Number. Table" 00 00 00 06 ; length of attr. =6(d) 00 01 ; 1(d) line number(s) 00 00 00 0 D ; . line 13 17
クラス属性のリスト • もとになったファイル名,Innerクラスなどの 情報. 00 01 ; num. of class attribute(s)= 1(d) ; ; ; ; ; ; ; ; BEGIN class attribute 1(d) 00 12 ; class's attr. 1(d) name="Source. File" 00 00 00 02 ; length of attr. =2(d) 00 13 ; filename="My. Run. java" ; END class attribute 1(d) 18
簡単な例. /add/ より CPの個数 -1 ? 14個 (E個) 00 0 F ; constant pool number= 14(d) 0 A 00 03 00 0 C ; (00 01) Methodref => java/lang/Object. <init>: ()V 07 00 0 D ; (00 02) Class => Add 07 00 0 E ; (00 03) Class => java/lang/Object 01 00 06 3 C 69 6 E 69 74 3 E ; (00 04) Utf 8 = "<init>" 01 00 03 28 29 56 ; (00 05) Utf 8 = "()V" 01 00 04 43 6 F 64 65 ; (00 06) Utf 8 = "Code" 01 00 0 F 4 C 69 6 E 65 4 E 75 6 D 62 65 72 54 61 62 6 C 65 ; (00 07) Utf 8 = "Line. Number. Table" 01 00 03 61 64 64 ; (00 08) Utf 8 = "add" 01 00 05 28 49 49 29 49 ; (00 09) Utf 8 = "(II)I" 01 00 0 A 53 6 F 75 72 63 65 46 69 6 C 65 ; (00 0 A) Utf 8 = "Source. File" 01 00 08 41 64 64 2 E 6 A 61 76 61 ; (00 0 B) Utf 8 = "Add. java" 0 C 00 04 00 05 ; (00 0 C) Name. And. Type => <init>: ()V 01 00 03 41 64 64 ; (00 0 D) Utf 8 = "Add" 01 00 10 6 A 61 76 61 2 F 6 C 61 6 E 67 2 F 4 F 62 6 A 65 63 74 ; (00 0 E) Utf 8 = "java/lang/Object" 25
Utf 8 • ASCIIやEBCDIC等と同様,文字を計算機の中 で表現する規約. • There are seven character encoding schemes in Unicode: UTF-8, UTF-16 BE, UTF 16 LE, UTF-32 BE and UTF-32 LE. In http: //www. unicode. org/ glossary/index. html#character_encoding_form • 要は文字をコード化する方法の一つと思ってくだ さい. • 教科書p. 51にJVMに関する解説がちょっとある. 27
CONSTANT_Name. And. Type • 名前と型(引数と返り値)の対情報(シグニチャ)を 持つ. CONSTANT_Name. And. Type のタグID 名前へのCP番号 0 C 00 04 00 05 型へのCP番号 01 00 06 3 C 69 6 E 69 74 3 E <init> 01 00 03 28 29 56 ()V 29
CONSTANT_Methodref • メソッドの属するクラスと,メソッドの名前・ 型の対の対を持つ. 0 A 00 03 00 0 C Class Name. And. Type 0 C 00 04 00 05 07 00 0 E java/lang/Object 01 00 10 6 A 61 76 61 2 F 6 C 61 6 E 67 2 F 4 F 62 6 A 65 63 74 01 00 06 3 C 69 6 E 69 74 3 E <init> 01 00 03 28 29 56 ()V 30
- Slides: 31