Java字节码编程语言设计及实现_第1页
Java字节码编程语言设计及实现_第2页
Java字节码编程语言设计及实现_第3页
Java字节码编程语言设计及实现_第4页
Java字节码编程语言设计及实现_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、    Java字节码编程语言设计及实现        党石宇,廖湖声 时间:2008年12月19日     字 体: 大 中 小        关键词:<"cblue" " target='_blank'>编程语言<"cblue" " target='_b

2、lank'>方法调用<"cblue" " target='_blank'>编译系统<"cblue" " target='_blank'>程序设计<"cblue" " target='_blank'>代码优化            1. 引言? 众所周知,Java语言依靠Java虚拟机对字节码

3、程序的支持,实现了跨平台特征。作为一种中间语言,Java字节码提供了汇编指令级的程序描述,能够支持底层的程序<"cblue" " title="代码优化">代码优化。然而,目前的Java字节码程序都是通过Java<"cblue" " title="编译系统">编译系统生成的,人们缺少一种直接利用Java字节码进行<"cblue" " title="程序设计">程序设计的工具。为此,本文提出一种Java字节码&l

4、t;"cblue" " title="编程语言">编程语言,通过提供一个Java字节码生成系统,直接支持Java字节码程序设计。系统实现中,选用了Apache组织中的开放源码项目BCEL(Byte Code Engineering Library,字节码工程库)作为Java字节码生成工具。2.?Java字节码编程语言设计? Java字节码编程语言的提出,是为了产生优化的字节码程序,可用于对Java源程序的编译系统,以及各种程序变换和程序优化系统。字节码的表达和优化能力都优于Java程序,一些Java语言中无法实现的功能,利用字节码可进行描

5、述,例如字节码中可使用goto跳转命令,而Java语言没有这个功能。? Java字节码编程语言文法的设计,兼顾了Java语言规范文法与Java虚拟机的指令格式,采用二者相结合的形式。Java字节码编程语言的程序结构由一个或多个类组成,每个类中有一个或多个域,域分为变量域和方法域,方法中包含了具体的指令语句,指令语句根据虚拟机指令设计。下面具体列出部分文法。? 类定义文法沿用Java语言规范:表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)设计为由块(

8、Block)组成,块由多个块语句(BlockStatements)组成,块语句又分为局部变量声明语句(LocalVariab<"innerlink" " title="leD">leDeclarationStatement)、类或接口定义语句(ClassOrInterfaceDeclaration)和指令语句(Instruction)。? 指令的设计则参考了Java虚拟机的指令格式,提供了虚拟机指令的所有功能,按功能可分为以下七类语句:· 装载和存储语句(Load_Store)· 运算语句(Arithmetic)

9、· 类型转换语句(Type_ Conversion)· 对象创建和操纵语句(Object_Create_Manipulation)· 操作数栈管理语句(Operand_Stack_Management)· 控制转移语句(Control_Transfer)· <"cblue" " title="方法调用">方法调用和返回语句(Method_Invoke_Return)。? 相应文法如下表:? 表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?指令语句中方法调用和返回语句的文法如表3:? 表3 方法调用和返回语句文法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? ? 上表中,方法调用分为以下四种类型:· 调用对象的示例方法,调度对象的(虚)类型:invokevirtual· 调用由接口实现的方法:invokeinterface· 调用需要特殊处理的实例方法,即实例初始化方法、private方法或超类方法:invokespecial· 调用命名的类中的类(static)方法:invokestatic3? J

13、ava字节码生成系统功能及结构? Java字节码生成系统的输入为Java字节码编程语言,输出为Java字节码文件。字节码生成系统的功能是读入Java字节码编程语言程序,通过BCEL(字节码工程库)生成字节码文件。? BCEL字节码工程库是一个工具包,用于对Java类文件的静态分析,动态创建或修改。开发人员能够使用BCEL 库在一个较高的抽象层次上实现所需的功能,而不用具体处理Java字节码文件的内部细节。BCEL完全用Java语言写成,并遵守LGPL条款。由于BCEL库是针对Java的class文件格式和虚拟机指令集所设计的,直接应用BCEL库进行Java字节码文件的生成比较困难,需要了解较多

14、的Java虚拟机方面的知识。本文提出的Java字节码编程语言的文法与BCEL库的字节码生成接口相对应,易于应用BCEL库进行编译,完成字节码生成。Java字节码编程语言成为一座连接Java源程序和字节码文件的桥梁,先将Java源程序编译为中间代码,再使用BCEL库将中间代码编译为Java字节码,生成class文件。? Java字节码生成系统可分为词法分析、语法分析和字节码生成三个阶段,其用例图如下:? 图1 Java字节码生成系统的用例图? 系统的数据流图可表示为:? Java字节码生成系统中,字节码编程语言与BCEL库中字节码生成接口具有对应关系,以方法调用为例,如下表:表4 java字节码

15、编程语言与BCEL库生成接口对应关系Java字节码编程语言方法调用文法BCEL库生成接口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库中类InstructionFactory的方法:?public InvokeInstruction createInvoke(String class_name, String name, Type ret_type,Type arg_types, short kind)/kind对应invokevirtual , invokeinterface? , invokespecial , invokestaticpublic static ReturnInstr

17、uction 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源程序,右边是相应的字节码编程语言代码。? 阶乘Ja

18、va源程序 其中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;? 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;? 字节码编程语言代码编译为BCEL库调用,以阶乘为例,以阶乘为例,分别讨论:· 类和方法声明:? ? 表6 类和方法声明转换 字节码编程语言代码?BCEL库生成代码?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 );?· 方法调用:? 表7 方法调用转换 字节码编程语言代码?BCEL库生成代码?invokespecial (? "java.lang.IllegalArgumentException" ,"" ,void, "java.lang.String

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论