星期三, 十一月 12, 2008

Java bytecode

java原始碼(.java)在經過java compiler(javac)編譯後形成bytecode(.class),再使用java virtual machine(JVM)直譯或JIT為physical machine code。java bytecode實際上就是由一串bytes所組成,可使用HEX editor檢視。


一. bytecode標準
可參考JVM Specification(http://java.sun.com/docs/books/jvms/second_edition/html/VMSpecTOC.doc.html):
chapter4 "The class File Format" 以presudo code說明byte code格式。
chapter6 "The Java Virtual Machine Instruction Set"說明JVM opcode。


對照以上內容可使用HEX editor自行撰寫bytecode再以JVM執行。




二. java組合語言
相較於C編譯為assembler再組譯為machine code執行,如果將JVM視為physical machine,java bytecode相當於machine code的地位。但在java原始碼和bytecode之間,sun沒有定義標準的java assembler。

jasmin(http://jasmin.sourceforge.net/)是一個java assembler(非標準),相較於直接編輯bytecode,可以先撰寫jasmin再組譯為byecode較為容易。


JDK也提供一個bytecode類反組譯器,可將bytecode轉為ascii code,說明如下:

指令javap -c employeeName

employeeName.java內容
==========================================
public String employeeName()
{
return name;
}

==========================================

執行結果
==========================================
Method java.lang.String employeeName()
0 aload_0
1 getfield #5
4 areturn
==========================================


以 javap 列出來的內容對照 JVM spec可瞭解 JVM instructions 的用途以及 class file format。


三. 參考資料:

[1] Java bytecode: Understanding bytecode makes you a better programmer
http://www-128.ibm.com/developerworks/ibm/library/it-haggar_bytecode/

[2]JVM Specification
http://java.sun.com/docs/books/jvms/second_edition/html/VMSpecTOC.doc.html

[3]jasmin
http://jasmin.sourceforge.net/

[4]Decompiling Java
http://www.tenlong.com.tw/Read/readForm.php?i=16

[5]A Working Developer`s Guide to Java Bytecode
http://www.strongd.net/blog/show/75

1 意見:

匿名 提到...

http://blog.ring.idv.tw/comment.ser?i=311