版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、 Java字節(jié)碼編程語(yǔ)言設(shè)計(jì)及實(shí)現(xiàn) 黨石宇,廖湖聲 時(shí)間:2008年12月19日 字 體: 大 中 小 關(guān)鍵詞:<"cblue" " target='_blank'>編程語(yǔ)言<"cblue" " target='_b
2、lank'>方法調(diào)用<"cblue" " target='_blank'>編譯系統(tǒng)<"cblue" " target='_blank'>程序設(shè)計(jì)<"cblue" " target='_blank'>代碼優(yōu)化 1. 引言? 眾所周知,Java語(yǔ)言依靠Java虛擬機(jī)對(duì)字節(jié)碼
3、程序的支持,實(shí)現(xiàn)了跨平臺(tái)特征。作為一種中間語(yǔ)言,Java字節(jié)碼提供了匯編指令級(jí)的程序描述,能夠支持底層的程序<"cblue" " title="代碼優(yōu)化">代碼優(yōu)化。然而,目前的Java字節(jié)碼程序都是通過(guò)Java<"cblue" " title="編譯系統(tǒng)">編譯系統(tǒng)生成的,人們?nèi)鄙僖环N直接利用Java字節(jié)碼進(jìn)行<"cblue" " title="程序設(shè)計(jì)">程序設(shè)計(jì)的工具。為此,本文提出一種Java字節(jié)碼&l
4、t;"cblue" " title="編程語(yǔ)言">編程語(yǔ)言,通過(guò)提供一個(gè)Java字節(jié)碼生成系統(tǒng),直接支持Java字節(jié)碼程序設(shè)計(jì)。系統(tǒng)實(shí)現(xiàn)中,選用了Apache組織中的開(kāi)放源碼項(xiàng)目BCEL(Byte Code Engineering Library,字節(jié)碼工程庫(kù))作為Java字節(jié)碼生成工具。2.?Java字節(jié)碼編程語(yǔ)言設(shè)計(jì)? Java字節(jié)碼編程語(yǔ)言的提出,是為了產(chǎn)生優(yōu)化的字節(jié)碼程序,可用于對(duì)Java源程序的編譯系統(tǒng),以及各種程序變換和程序優(yōu)化系統(tǒng)。字節(jié)碼的表達(dá)和優(yōu)化能力都優(yōu)于Java程序,一些Java語(yǔ)言中無(wú)法實(shí)現(xiàn)的功能,利用字節(jié)碼可進(jìn)行描
5、述,例如字節(jié)碼中可使用goto跳轉(zhuǎn)命令,而Java語(yǔ)言沒(méi)有這個(gè)功能。? Java字節(jié)碼編程語(yǔ)言文法的設(shè)計(jì),兼顧了Java語(yǔ)言規(guī)范文法與Java虛擬機(jī)的指令格式,采用二者相結(jié)合的形式。Java字節(jié)碼編程語(yǔ)言的程序結(jié)構(gòu)由一個(gè)或多個(gè)類組成,每個(gè)類中有一個(gè)或多個(gè)域,域分為變量域和方法域,方法中包含了具體的指令語(yǔ)句,指令語(yǔ)句根據(jù)虛擬機(jī)指令設(shè)計(jì)。下面具體列出部分文法。? 類定義文法沿用Java語(yǔ)言規(guī)范:表1 類定義文法Modifierà? public | protected | private | static | abstract | final | native | synchronize
6、d | ? transient | volatile | strictfp ?ModifiersOptà? Modifier ?ClassDeclarationàclass Identifier extends Type implements TypeList ClassBody?InterfaceDeclarationà interface Identifier extends TypeList InterfaceBody?ClassOrInterfaceDeclarationà ModifiersOpt (ClassDeclaration | Int
7、erfaceDeclaration)?ClassBodyàClassBodyDeclaration?ClassBodyDeclarationà ; | static Block? | ModifiersOpt? MemberDecl?MemberDeclà? MethodOrFieldDecl? | void Identifier VoidMethodDeclaratorRest? |?Identifier ConstructorDeclaratorRest? |ClassOrInterfaceDeclaration|? 方法體(MethodBody)設(shè)計(jì)為由塊(
8、Block)組成,塊由多個(gè)塊語(yǔ)句(BlockStatements)組成,塊語(yǔ)句又分為局部變量聲明語(yǔ)句(LocalVariab<"innerlink" " title="leD">leDeclarationStatement)、類或接口定義語(yǔ)句(ClassOrInterfaceDeclaration)和指令語(yǔ)句(Instruction)。? 指令的設(shè)計(jì)則參考了Java虛擬機(jī)的指令格式,提供了虛擬機(jī)指令的所有功能,按功能可分為以下七類語(yǔ)句:· 裝載和存儲(chǔ)語(yǔ)句(Load_Store)· 運(yùn)算語(yǔ)句(Arithmetic)
9、· 類型轉(zhuǎn)換語(yǔ)句(Type_ Conversion)· 對(duì)象創(chuàng)建和操縱語(yǔ)句(Object_Create_Manipulation)· 操作數(shù)棧管理語(yǔ)句(Operand_Stack_Management)· 控制轉(zhuǎn)移語(yǔ)句(Control_Transfer)· <"cblue" " title="方法調(diào)用">方法調(diào)用和返回語(yǔ)句(Method_Invoke_Return)。? 相應(yīng)文法如下表:? 表2 方法及指令定義文法MethodBodyà Block?Blockà
10、BlockStatements ?BlockStatementsà BlockStatementBlockStatementà? LocalVariableDeclarationStatement? |?ClassOrInterfaceDeclaration? |?Identifier: Instruction;?Instructionà? BlockStatement? | Load_Store? |? Arithmetic? | Type_ Conversion? |?Object_Create_Manipulation ? | Operand_Stack_M
11、anagement? |?Control_Transfer? | Method_Invoke_Return?指令語(yǔ)句中方法調(diào)用和返回語(yǔ)句的文法如表3:? 表3 方法調(diào)用和返回語(yǔ)句文法MethodNameà Identifier?RetTypeà Type?ArgTypeà TypeList?MethodInvokeKeyword à ? invokevirtual? | invokeinterface? |?invokespecial? | invokestatic ?Method_Invoke_Returnà MethodInvokeKeyw
12、ord (ClassName, MethodName, RetType, ArgType) |?ireturn | lreturn | freturn | dreturn | areturn | return? ? 上表中,方法調(diào)用分為以下四種類型:· 調(diào)用對(duì)象的示例方法,調(diào)度對(duì)象的(虛)類型:invokevirtual· 調(diào)用由接口實(shí)現(xiàn)的方法:invokeinterface· 調(diào)用需要特殊處理的實(shí)例方法,即實(shí)例初始化方法、private方法或超類方法:invokespecial· 調(diào)用命名的類中的類(static)方法:invokestatic3? J
13、ava字節(jié)碼生成系統(tǒng)功能及結(jié)構(gòu)? Java字節(jié)碼生成系統(tǒng)的輸入為Java字節(jié)碼編程語(yǔ)言,輸出為Java字節(jié)碼文件。字節(jié)碼生成系統(tǒng)的功能是讀入Java字節(jié)碼編程語(yǔ)言程序,通過(guò)BCEL(字節(jié)碼工程庫(kù))生成字節(jié)碼文件。? BCEL字節(jié)碼工程庫(kù)是一個(gè)工具包,用于對(duì)Java類文件的靜態(tài)分析,動(dòng)態(tài)創(chuàng)建或修改。開(kāi)發(fā)人員能夠使用BCEL 庫(kù)在一個(gè)較高的抽象層次上實(shí)現(xiàn)所需的功能,而不用具體處理Java字節(jié)碼文件的內(nèi)部細(xì)節(jié)。BCEL完全用Java語(yǔ)言寫成,并遵守LGPL條款。由于BCEL庫(kù)是針對(duì)Java的class文件格式和虛擬機(jī)指令集所設(shè)計(jì)的,直接應(yīng)用BCEL庫(kù)進(jìn)行Java字節(jié)碼文件的生成比較困難,需要了解較多
14、的Java虛擬機(jī)方面的知識(shí)。本文提出的Java字節(jié)碼編程語(yǔ)言的文法與BCEL庫(kù)的字節(jié)碼生成接口相對(duì)應(yīng),易于應(yīng)用BCEL庫(kù)進(jìn)行編譯,完成字節(jié)碼生成。Java字節(jié)碼編程語(yǔ)言成為一座連接Java源程序和字節(jié)碼文件的橋梁,先將Java源程序編譯為中間代碼,再使用BCEL庫(kù)將中間代碼編譯為Java字節(jié)碼,生成class文件。? Java字節(jié)碼生成系統(tǒng)可分為詞法分析、語(yǔ)法分析和字節(jié)碼生成三個(gè)階段,其用例圖如下:? 圖1 Java字節(jié)碼生成系統(tǒng)的用例圖? 系統(tǒng)的數(shù)據(jù)流圖可表示為:? Java字節(jié)碼生成系統(tǒng)中,字節(jié)碼編程語(yǔ)言與BCEL庫(kù)中字節(jié)碼生成接口具有對(duì)應(yīng)關(guān)系,以方法調(diào)用為例,如下表:表4 java字節(jié)碼
15、編程語(yǔ)言與BCEL庫(kù)生成接口對(duì)應(yīng)關(guān)系Java字節(jié)碼編程語(yǔ)言方法調(diào)用文法BCEL庫(kù)生成接口MethodNameà Identifier?RetTypeà Type?ArgTypeà TypeList?MethodInvokeKeyword à ? ?invokevirtual? | invokeinterface? |?invokespecial? | invokestatic ?Method_Invoke_Returnà ?MethodInvokeKeyword(ClassName, MethodName, RetType, ArgType)?
16、 |?ireturn | lreturn | freturn | dreturn ? | areturn | return? ?BCEL庫(kù)中類InstructionFactory的方法:?public InvokeInstruction createInvoke(String class_name, String name, Type ret_type,Type arg_types, short kind)/kind對(duì)應(yīng)invokevirtual , invokeinterface? , invokespecial , invokestaticpublic static ReturnInstr
17、uction createReturn(Type type)/type類型對(duì)應(yīng)關(guān)系:T_ARRAY,T_OBJECTà areturn;T_INT,T_SHORT,T_BOOLEAN,T_CHAR,T_BYTEà ireturn;T_FLOATà freturn;T_DOUBLEà dreturn;T_LONGà lreturn;T_VOIDà return;4?Java字節(jié)碼生成示例? 下面通過(guò)生成階乘Java程序字節(jié)碼的介紹,說(shuō)明Java字節(jié)碼生成系統(tǒng)功能。左邊是求階乘的Java源程序,右邊是相應(yīng)的字節(jié)碼編程語(yǔ)言代碼。? 階乘Ja
18、va源程序 其中calculateFactorial方法的字節(jié)碼編程語(yǔ)言代碼? ? 表5 階乘程序和相應(yīng)字節(jié)碼編程語(yǔ)言代碼階乘Java源程序?其中calculateFactorial方法的字節(jié)碼編程語(yǔ)言代碼?public class Factorial?public int calculateFactorial(int x)? if (x<0)? ? throw? new ?IllegalArgumentException?('x must be >=0');?int ret=1;?for(int i=1;i<=x;i+)? ? ret=ret*i;? ret
19、urn ret;?public static void main?(String args)? ? Factorial f=new Factorial();?int n=6;? System.out.println(?f.calculateFactorial(n) );? ?public class Factorial?public int calculateFactorial(int x)? ? ?iload? x;? ifge “if1”;? new “java.lang.IllegalArgumentException”;? dup;? ldc “x must be >=0”;?
20、invokespecial ('java.lang.IllegalArgumentException' ,?'' ,?void, ?'java.lang.String');? athrow;?if1:? int ret;?push 1;? istore ret;? int i;? push 1;? istore i;?for_begin:? iload? i;? iload? x;? if_icmpgt “if2”;? iload? ret;? iload? i;? imul;? istore? ret;? iinc? i? 1;? goto “
21、for_begin”;?if2:? iload? ret;? ireturn;? 字節(jié)碼編程語(yǔ)言代碼編譯為BCEL庫(kù)調(diào)用,以階乘為例,以階乘為例,分別討論:· 類和方法聲明:? ? 表6 類和方法聲明轉(zhuǎn)換 字節(jié)碼編程語(yǔ)言代碼?BCEL庫(kù)生成代碼?public class Factorialpublic int?calculateFactorial(int x)? ? ? ?ClassGen cg = new ClassGen( "Factorial", "java.lang.Object", "Factorial", ACC
22、_PUBLIC| ACC_SUPER, null );ConstantPoolGen cp = cg.getConstantPool();InstructionList il = new InstructionList();MethodGen mg = new MethodGen( ACC_PUBLIC, Type.INT ,new TypeType.INT,? new String"x" ,? "calculateFactorial",? "Factorial", il, cp );?· 方法調(diào)用:? 表7 方法調(diào)用轉(zhuǎn)換 字節(jié)碼編程語(yǔ)言代碼?BCEL庫(kù)生成代碼?invokespecial (? "java.lang.IllegalArgumentException" ,"" ,void, "java.lang.String
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 共同管理合同范例
- 設(shè)備電器采購(gòu)合同范例
- 石材幕墻維修合同范例
- 左手假肢采購(gòu)合同范例
- 自己房屋無(wú)償使用合同范例
- 荒山承包開(kāi)采合同范例
- 轉(zhuǎn)讓房產(chǎn)寫合同范例
- 消防應(yīng)急合同范例
- 技術(shù)無(wú)償轉(zhuǎn)讓合同范例
- 攝影服務(wù)租賃合同范例
- 出租房屋安全檢查制度模版(2篇)
- 《森林防火安全教育》主題班會(huì) 課件
- 漏洞修復(fù)策略優(yōu)化
- 乘風(fēng)化麟 蛇我其誰(shuí) 2025XX集團(tuán)年終總結(jié)暨頒獎(jiǎng)盛典
- 車間生產(chǎn)現(xiàn)場(chǎng)5S管理基礎(chǔ)知識(shí)培訓(xùn)課件
- 2024年同等學(xué)力申碩英語(yǔ)考試真題
- 文書模板-《公司與村集體合作種植協(xié)議書》
- 碼頭安全生產(chǎn)知識(shí)培訓(xùn)
- 《死亡詩(shī)社》電影賞析
- JJF(京) 105-2023 網(wǎng)絡(luò)時(shí)間同步服務(wù)器校準(zhǔn)規(guī)范
- 老年科護(hù)理查房護(hù)理病歷臨床病案
評(píng)論
0/150
提交評(píng)論