《電子技術應用》
您所在的位置:首頁 > 其他 > 業界動態 > Java字節碼編程語言設計及實現

Java字節碼編程語言設計及實現

2008-12-19
作者:黨石宇,廖湖聲

1. 引言
??? 眾所周知,Java語言依靠Java虛擬機對字節碼程序的支持,實現了跨平臺特征。作為一種中間語言,Java字節碼提供了匯編指令級的程序描述,能夠支持底層的程序代碼優化" title="代碼優化">代碼優化。然而,目前的Java字節碼程序都是通過Java編譯系統" title="編譯系統">編譯系統生成的,人們缺少一種直接利用Java字節碼進行程序設計" title="程序設計">程序設計的工具。為此,本文提出一種Java字節碼編程語言" title="編程語言">編程語言,通過提供一個Java字節碼生成系統,直接支持Java字節碼程序設計。系統實現中,選用了Apache組織中的開放源碼項目BCEL(Byte Code Engineering Library,字節碼工程庫)作為Java字節碼生成工具。
2.?Java字節碼編程語言設計
??? Java字節碼編程語言的提出,是為了產生優化的字節碼程序,可用于對Java源程序的編譯系統,以及各種程序變換和程序優化系統。字節碼的表達和優化能力都優于Java程序,一些Java語言中無法實現的功能,利用字節碼可進行描述,例如字節碼中可使用goto跳轉命令,而Java語言沒有這個功能。
??? Java字節碼編程語言文法的設計,兼顧了Java語言規范文法與Java虛擬機的指令格式,采用二者相結合的形式。Java字節碼編程語言的程序結構由一個或多個類組成,每個類中有一個或多個域,域分為變量域和方法域,方法中包含了具體的指令語句,指令語句根據虛擬機指令設計。下面具體列出部分文法。
??? 類定義文法沿用Java語言規范:

表1 類定義文法

Modifierà???? public | protected | private | static | abstract | final | native | synchronized | ?

??????????????????????????? transient | volatile | strictfp ?

ModifiersOptà????? { Modifier }?

ClassDeclarationàclass Identifier [extends Type] [implements TypeList] ClassBody?

InterfaceDeclarationà interface Identifier [extends TypeList] InterfaceBody?

ClassOrInterfaceDeclarationà ModifiersOpt (ClassDeclaration | InterfaceDeclaration)?

?

ClassBodyà{{ClassBodyDeclaration}}?

ClassBodyDeclarationà ; | [static] Block?? | ModifiersOpt? MemberDecl?

?

MemberDeclà?????? MethodOrFieldDecl?????? | void Identifier VoidMethodDeclaratorRest? |?

Identifier ConstructorDeclaratorRest??? |ClassOrInterfaceDeclaration|?

?

??? 方法體(MethodBody)設計為由塊(Block)組成,塊由多個塊語句(BlockStatements)組成,塊語句又分為局部變量聲明語句(LocalVariableDeclarationStatement)、類或接口定義語句(ClassOrInterfaceDeclaration)和指令語句(Instruction)。

??? 指令的設計則參考了Java虛擬機的指令格式,提供了虛擬機指令的所有功能,按功能可分為以下七類語句:

  • 裝載和存儲語句(Load_Store
  • 運算語句(Arithmetic
  • 類型轉換語句(Type_ Conversion
  • 對象創建和操縱語句(Object_Create_Manipulation
  • 操作數棧管理語句(Operand_Stack_Management
  • 控制轉移語句(Control_Transfer
  • 方法調用" title="方法調用">方法調用和返回語句(Method_Invoke_Return)。

??? 相應文法如下表:

????????????????????????????????????? 表2 方法及指令定義文法

MethodBodyà Block?

Blockà { BlockStatements }?

BlockStatementsà {BlockStatement}

BlockStatementà?? LocalVariableDeclarationStatement????? |?

ClassOrInterfaceDeclaration?????????????? |?

[Identifier:] Instruction;?

Instructionà? BlockStatement?????????????????????????? | Load_Store?????????????????????????????? |?

???????????????????? Arithmetic????????????????????????????????? | Type_ Conversion????????????????????? |?

Object_Create_Manipulation ????? | Operand_Stack_Management???? |?

Control_Transfer???????????????????????? | Method_Invoke_Return?

?

指令語句中方法調用和返回語句的文法如表3:

????????????????????????????????? 表3 方法調用和返回語句文法

MethodNameà Identifier?

RetTypeà Type?

ArgTypeà {[TypeList]}?

MethodInvokeKeyword à ?? invokevirtual????????????? | invokeinterface? |?

invokespecial????????????? | invokestatic ?

Method_Invoke_Returnà MethodInvokeKeyword (ClassName, MethodName, RetType, ArgType) |?

?ireturn | lreturn | freturn | dreturn | areturn | return?

??? 上表中,方法調用分為以下四種類型:

  • 調用對象的示例方法,調度對象的(虛)類型:invokevirtual
  • 調用由接口實現的方法:invokeinterface
  • 調用需要特殊處理的實例方法,即實例初始化方法、private方法或超類方法:invokespecial
  • 調用命名的類中的類(static)方法:invokestatic

3? Java字節碼生成系統功能及結構?

??? Java字節碼生成系統的輸入為Java字節碼編程語言,輸出為Java字節碼文件。字節碼生成系統的功能是讀入Java字節碼編程語言程序,通過BCEL(字節碼工程庫)生成字節碼文件。

??? BCEL字節碼工程庫是一個工具包,用于對Java類文件的靜態分析,動態創建或修改。開發人員能夠使用BCEL 庫在一個較高的抽象層次上實現所需的功能,而不用具體處理Java字節碼文件的內部細節。BCEL完全用Java語言寫成,并遵守LGPL條款。

由于BCEL庫是針對Java的class文件格式和虛擬機指令集所設計的,直接應用BCEL庫進行Java字節碼文件的生成比較困難,需要了解較多的Java虛擬機方面的知識。本文提出的Java字節碼編程語言的文法與BCEL庫的字節碼生成接口相對應,易于應用BCEL庫進行編譯,完成字節碼生成。Java字節碼編程語言成為一座連接Java源程序和字節碼文件的橋梁,先將Java源程序編譯為中間代碼,再使用BCEL庫將中間代碼編譯為Java字節碼,生成class文件。

??? Java字節碼生成系統可分為詞法分析、語法分析和字節碼生成三個階段,其用例圖如下:

???????????????????? 圖1 Java字節碼生成系統的用例圖

??? 系統的數據流圖可表示為:

???? Java字節碼生成系統中,字節碼編程語言與BCEL庫中字節碼生成接口具有對應關系,以方法調用為例,如下表:

表4 java字節碼編程語言與BCEL庫生成接口對應關系

Java字節碼編程語言方法調用文法

BCEL庫生成接口

MethodNameà Identifier?

?

RetTypeà Type?

?

ArgTypeà {[TypeList]}?

?

MethodInvokeKeyword à ?? ?

invokevirtual?????????? | invokeinterface? |?

invokespecial?????????? | invokestatic ?

?

Method_Invoke_Returnà ?

MethodInvokeKeyword(ClassName, MethodName, RetType, ArgType)???? |?

ireturn | lreturn | freturn | dreturn ?? | areturn | return? ?

BCEL庫中類InstructionFactory的方法:?

public InvokeInstruction createInvoke

(String class_name, String name, Type ret_type,Type[] arg_types, short kind)

//kind對應invokevirtual , invokeinterface?????? , invokespecial , invokestatic

public static

ReturnInstruction createReturn(Type type)

//type類型對應關系:

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字節碼生成示例?

??? 下面通過生成階乘Java程序字節碼的介紹,說明Java字節碼生成系統功能。左邊是求階乘的Java源程序,右邊是相應的字節碼編程語言代碼。

??? 階乘Java源程序 其中calculateFactorial方法的字節碼編程語言代碼??

?????????????????????????? 表5 階乘程序和相應字節碼編程語言代碼

階乘Java源程序?

其中calculateFactorial方法的字節碼編程語言代碼?

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;?

?????? return 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”;?

??? 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 “for_begin”;?

if2:??? iload? ret;?

??? ireturn;?

}?

}?

??? 字節碼編程語言代碼編譯為BCEL庫調用,以階乘為例,以階乘為例,分別討論:

  • 類和方法聲明:?

????????????????????????????????? ? 表6 類和方法聲明轉換

字節碼編程語言代碼?

BCEL庫生成代碼?

public class Factorial

{

public int

?calculateFactorial(int x)

? {?

……

? }

}?

ClassGen cg =

new ClassGen( "Factorial", "java.lang.Object", "Factorial",

ACC_PUBLIC| ACC_SUPER, null );

ConstantPoolGen cp = cg.getConstantPool();

InstructionList il = new InstructionList();

MethodGen mg =

new MethodGen( ACC_PUBLIC, Type.INT ,

new Type[]{Type.INT},

??????????????????????????? new String[]{"x"} ,?????? "calculateFactorial",

??????????????????????????? "Factorial", il, cp );?

?

  • 方法調用:?

?????????????????????????????????? 表7 方法調用轉換

字節碼編程語言代碼?

BCEL庫生成代碼?

invokespecial (?

"java.lang.IllegalArgumentException" ,

"" ,

void,

{"java.lang.String"});

il.append( factory.createInvoke(

"java.lang.IllegalArgumentException",

? "",

? Type.VOID,

? new Type[]

{new ObjectType("java.lang.String")},

? INVOKESPECIAL ) );?

?

結束語?

使用Java字節碼編程語言來完成字節碼的生成,屏蔽了底層生成字節碼的具體方法,通過生成相應虛擬機命令的擴展形式,降低了字節碼生成的難度。

Java字節碼編程語言的應用廣泛,可用于Java代碼優化,如對Java源程序進行部分求值優化后,可對生成的滯留程序和例化程序編譯為中間語言的形式,在利用BCEL庫生成字節碼,完成進一步的字節碼優化。還可以對Java字節碼編程語言進行優化,去掉冗余的控制轉移和方法調用,進而生成更緊湊的Java字節碼。

參考文獻?

[1] James Gosling,Bill Joy,Guy Steele,Gilad Bracha 《The Java Language Specification》 ADDISON-WESLEY? 2000

[2] Markus Dahm《Byte Code Engineering With the BCEL API》

Freie Universit?t Berlin Institut für Informatik, Technical Report B-17-98? http://inf.fuberlin.de/pub/BCEL/report.ps

[3] 玄偉劍等譯.《Java 虛擬機規范》.北京大學出版社,1997


本站內容除特別聲明的原創文章之外,轉載內容只為傳遞更多信息,并不代表本網站贊同其觀點。轉載的所有的文章、圖片、音/視頻文件等資料的版權歸版權所有權人所有。本站采用的非本站原創文章及圖片等內容無法一一聯系確認版權者。如涉及作品內容、版權和其它問題,請及時通過電子郵件或電話通知我們,以便迅速采取適當措施,避免給雙方造成不必要的經濟損失。聯系電話:010-82306118;郵箱:aet@chinaaet.com。
热re99久久精品国产66热_欧美小视频在线观看_日韩成人激情影院_庆余年2免费日韩剧观看大牛_91久久久久久国产精品_国产原创欧美精品_美女999久久久精品视频_欧美大成色www永久网站婷_国产色婷婷国产综合在线理论片a_国产精品电影在线观看_日韩精品视频在线观看网址_97在线观看免费_性欧美亚洲xxxx乳在线观看_久久精品美女视频网站_777国产偷窥盗摄精品视频_在线日韩第一页
  • <strike id="ygamy"></strike>
  • 
    
      • <del id="ygamy"></del>
        <tfoot id="ygamy"></tfoot>
          <strike id="ygamy"></strike>
          国产亚洲一区二区精品| 亚洲裸体视频| 蜜臀久久99精品久久久久久9| 亚洲新中文字幕| 亚洲大片精品永久免费| 国产日韩欧美在线看| 欧美一区二区三区免费观看视频| 国内精品久久久久久久果冻传媒| 一区二区在线免费观看| 一区二区不卡在线视频 午夜欧美不卡在| 欧美日韩国产丝袜另类| 伊人成年综合电影网| 香蕉成人伊视频在线观看| 国产精品v欧美精品∨日韩| 国产三级精品三级| 国产精品午夜在线| 久久综合久久综合久久| 欧美电影电视剧在线观看| 黄色成人91| 欧美阿v一级看视频| 亚洲在线成人| 国产精品电影在线观看| 尤物网精品视频| 亚洲中字黄色| 欧美性片在线观看| 亚洲精品乱码久久久久| 亚洲精品字幕| 欧美激情综合五月色丁香小说| 激情视频一区二区三区| 久久综合久久综合久久| 午夜免费在线观看精品视频| 一卡二卡3卡四卡高清精品视频| 亚洲精品久久久久久久久久久久久| 夜夜嗨av一区二区三区网站四季av| 国外精品视频| 欧美高清不卡在线| 亚洲区免费影片| 亚洲国产成人久久综合| 亚洲第一区中文99精品| 在线电影欧美日韩一区二区私密| 欧美日韩国产高清| 午夜免费日韩视频| 国产午夜精品麻豆| 亚洲国产美女精品久久久久∴| 欧美高清在线视频观看不卡| 欧美性天天影院| 日韩小视频在线观看专区| 夜色激情一区二区| 一本久道久久久| 91久久久精品| 欧美成人有码| 亚洲欧美日韩国产另类专区| 欲香欲色天天天综合和网| 红桃av永久久久| 亚洲一区视频在线观看视频| 欧美色精品天天在线观看视频| 欧美一区永久视频免费观看| 亚洲人成人99网站| 久久er精品视频| 欧美日韩综合不卡| 香蕉成人啪国产精品视频综合网| 欧美大色视频| 亚洲欧美中文另类| 欧美视频免费看| 久久久不卡网国产精品一区| 极品尤物一区二区三区| 国产亚洲一区二区三区| 欧美在线www| 国产精品伦理| 91久久综合| 国产精品久久久久久久久久妞妞| 亚洲精品自在在线观看| 国产精品综合久久久| 卡一卡二国产精品| 在线精品视频免费观看| 久久成人精品视频| 久久久久国色av免费看影院| 日韩亚洲视频在线| 午夜精品久久99蜜桃的功能介绍| 国产精品免费一区豆花| 国内精品久久久| 亚洲特黄一级片| 亚洲日韩第九十九页| 久久久久久久综合| 国产精品v欧美精品v日本精品动漫| 久久免费少妇高潮久久精品99| 亚洲午夜黄色| 欧美有码视频| 1024欧美极品| 亚洲综合欧美日韩| 欧美一区精品| 一区二区三区日韩欧美精品| 亚洲精品资源美女情侣酒店| 亚洲免费影视第一页| 一本色道久久综合亚洲精品高清| 国产精品国产自产拍高清av王其| 亚洲天堂成人在线视频| 国产亚洲福利社区一区| 久久久亚洲午夜电影| 久久久蜜桃精品| 亚洲国产一区二区a毛片| 久久成人综合网| 欧美另类女人| 亚洲欧美精品伊人久久| 国内久久精品| 亚洲深爱激情| 牛人盗摄一区二区三区视频| 欧美国产欧美综合| 国产日韩欧美成人| 韩国女主播一区| 欧美午夜视频在线观看| 亚洲尤物视频网| 国产精品av久久久久久麻豆网| 巨胸喷奶水www久久久免费动漫| 欧美日韩日日夜夜| 欧美日韩黄色一区二区| 欧美精品一区二区三区高清aⅴ| 亚洲三级色网| 激情综合色综合久久综合| 欧美视频在线观看免费| 欧美日韩国产成人在线免费| 欧美成人精品在线播放| 久久九九国产| 欧美日韩在线电影| 亚洲第一黄网| 亚洲性感美女99在线| 99这里只有精品| 欧美性一二三区| 国内精品国语自产拍在线观看| 亚洲一区二区免费视频| 亚洲激情成人网| 亚洲激情在线激情| 国产精品成人一区二区三区吃奶| 日韩午夜精品| 久久在线91| 在线免费观看一区二区三区| 欧美亚洲在线| 国产精品swag| 国产精品一区二区三区四区五区| 亚洲日本欧美日韩高观看| 亚洲国产视频一区| 最新中文字幕一区二区三区| 久久av一区二区三区亚洲| 狠狠干成人综合网| 亚洲精选久久| 久久久久成人精品| 国产精品高清在线| 黑人巨大精品欧美黑白配亚洲| 欧美性猛片xxxx免费看久爱| 亚洲国产成人精品女人久久久| 国产精品qvod| 亚洲国产成人午夜在线一区| 99国产精品久久| 欧美日韩亚洲一区二区| 一区二区日韩| 一区二区三区日韩| 欧美日本在线| 国产精品xxxav免费视频| 欧美在线视频一区二区三区| 欧美www视频在线观看| 亚洲欧洲日韩综合二区| 国产精品电影在线观看| 欧美午夜女人视频在线| 国产日韩欧美自拍| 亚洲高清网站| 久久久久久**毛片大全| 欧美黑人一区二区三区| 国产精品综合色区在线观看| 亚洲国产精品久久精品怡红院| 亚洲第一页自拍| 亚洲第一黄色| 欧美日韩一区二区三区在线观看免| 亚洲精品极品| 亚洲一区二区精品在线| 欧美国产精品人人做人人爱| 久久看片网站| 国际精品欧美精品| 欧美丝袜一区二区| 国产视频不卡| 亚洲精品日韩在线| 狠狠久久亚洲欧美专区| 欧美凹凸一区二区三区视频| 欧美国产日韩二区| 亚洲图片欧洲图片av| 国产精品播放| 国产欧美一区二区精品性色| 欧美bbbxxxxx| 欧美日韩免费观看一区=区三区| 国产一区二区精品久久99| 国产精品进线69影院| 久久国产一二区| 欧美午夜精品久久久久免费视| 香蕉乱码成人久久天堂爱免费| 欧美日韩国产片| 韩曰欧美视频免费观看| 欧美精品一区二区三区一线天视频| 久久久久久夜精品精品免费| 欧美一区2区三区4区公司二百| 亚洲视频综合在线| 99精品久久免费看蜜臀剧情介绍| 国产伦精品一区二区三区高清| 国内外成人免费激情在线视频网站| 亚洲精品日韩精品| 黑丝一区二区三区| 久久福利视频导航| 在线观看亚洲a| 久久精品一区蜜桃臀影院| 亚洲国产一区在线观看| 国内精品视频在线观看| 亚洲精品国偷自产在线99热| 久久九九久精品国产免费直播| 亚洲一区久久久| 欧美视频不卡中文| 蜜桃精品久久久久久久免费影院| 亚洲三级电影在线观看| 永久免费毛片在线播放不卡| 午夜精品久久久久影视| 欧美人在线视频| 亚洲欧洲精品一区二区三区不卡| 一区二区视频免费完整版观看| 国产综合18久久久久久| 一区二区欧美在线| 国产精品亚洲一区二区三区在线| 欧美日韩亚洲在线| 亚洲一区二区免费视频| 亚洲精品国产精品国自产在线| 国产模特精品视频久久久久| 欧美精品午夜视频| 亚洲欧美国产视频| 亚洲精品乱码久久久久久蜜桃麻豆| 欧美视频导航| 国产一区二区在线观看免费播放| 免费在线看成人av| 国产亚洲欧美另类中文| 国产一区二区精品在线观看| 一色屋精品视频在线看| 国外成人免费视频| 亚洲欧美日韩一区二区三区在线| 欧美日韩一区二区三区在线| 久久岛国电影| 欧美影片第一页| 欧美日韩免费在线观看| 欧美一区91| 在线观看日韩| 亚洲一级高清| 亚洲电影天堂av| 久久不射电影网| 亚洲国产精品久久久久秋霞不卡| 99国产精品久久久| 亚洲视频网在线直播| 亚洲精品国精品久久99热| 亚洲日本aⅴ片在线观看香蕉| 91久久国产自产拍夜夜嗨| 亚洲中字在线| 亚洲精华国产欧美| 香蕉久久精品日日躁夜夜躁| 亚洲第一区中文99精品| 欧美视频一区| 夜夜躁日日躁狠狠久久88av| 亚洲国产另类久久精品| 久久综合福利| 香蕉国产精品偷在线观看不卡| 一本色道久久综合亚洲精品婷婷| 国产精品日韩在线观看| 久久九九国产精品| 欧美一区二区三区啪啪| 欧美3dxxxxhd| 欧美日韩亚洲一区二区三区在线| 午夜宅男欧美| 欧美婷婷久久| 欧美日韩精品国产| 亚洲精品久久久久久久久| 欧美一区二区免费视频| 久久av一区二区三区| 欧美影片第一页| 一色屋精品视频免费看| 夜夜精品视频| 你懂的国产精品永久在线| 国产亚洲一区二区在线观看| 久久影视三级福利片| 欧美在线免费视屏| 亚洲成人自拍视频| 国产在线国偷精品产拍免费yy| 国产精品国色综合久久| 亚洲视频一区二区在线观看| 欧美日韩在线精品| 中文亚洲欧美| 亚洲国产另类精品专区| 性久久久久久久久久久久| 9色精品在线| 国产尤物精品| 亚洲一级黄色| 激情综合在线| 国产一区二区三区电影在线观看| 一本色道久久88精品综合| 国产精品美腿一区在线看| 亚洲制服av| 久久伊人亚洲| 亚洲缚视频在线观看| 亚洲国产美女精品久久久久∴| 亚洲美女黄色| 久久五月天婷婷| 亚洲美女在线看| 国产精品日韩专区| 樱花yy私人影院亚洲| 一区二区三区高清在线观看| 精品不卡视频| 国产一区二区高清| 亚洲一区美女视频在线观看免费| 亚洲国产一区二区a毛片| 亚洲国产日韩欧美| 国产精品成人免费视频| 欧美精品入口| 国产精品每日更新在线播放网址| 一区二区高清视频| 欧美日韩国产综合一区二区| 国产视频精品网| 国产日本欧美在线观看| 欧美破处大片在线视频| 久久嫩草精品久久久精品| 亚洲人妖在线| 欧美国产一区二区三区激情无套| 欧美日韩精品在线| 国产婷婷色综合av蜜臀av| 精品电影一区| 玖玖在线精品| 国产欧美日韩一区| 亚洲成色www久久网站|