没有合适的资源?快使用搜索试试~ 我知道了~
理论计算机科学电子笔记264(4)(2011)35-50www.elsevier.com/locate/entcsJava虚拟机指令集的编码Michael Eichberg1 Andreas Sewe2德国达姆施塔特理工大学计算机科学系摘要解析、分析和转换Java字节码的新工具包经常从头开始开发,以获得适合特定用途的表示。但是,虽然这些工具包实现的读取类文件和进行基本控制和数据流分析的功能是相当的,但它是一次又一次地实现的。分歧主要表现在次要的技术问题上。为了避免类似功能的重复开发,我们开发了一种基于XML的语言,用于指定基于字节码的指令集。使用这种语言,我们对Java虚拟机的指令集进行了编码,使其可以直接使用,例如,togenerate生成the skeleton骨架of bytecode字节码based基于tools工具.XML格式在此指定指令的格式及其在堆栈上的效果,执行时的本地寄存器。这使得静态分析的开发人员能够生成通用的控制流和数据流分析,例如,将Java字节码转换为静态单赋值形式的分析。为了评估我们的方法的有用性,我们使用了Java虚拟机指令的编码 开发一个框架来分析和转换Java类文件。评估显示,与手动开发相比,使用规范显著减少了开发时间关键词:Java字节码,Java虚拟机规范,XML1引言解析和分析Java字节码的程序的开发[9]有很长的历史,新的程序仍然在开发[2,3,4,7,13]。然而,在开发这样的工具时,要花费大量的时间来开发字节码的解析器,用于(重新)开发标准控制流和数据流分析,其计算,例如,控制流程图或数据依赖图。为了减少这些负担,我们开发了一种规范语言(OPAL SPL),用于对基于堆栈的中间语言的指令进行编码。这个想法是,一旦使用OPAL SPL完全指定了指令集,生成字节码解析器和标准分析就比手动生成要容易得多1电邮地址:eichberg@informatik.tu-darmstadt.de2电子邮件地址:sewe@st.informatik.tu-darmstadt.de1571-0661 © 2011 Elsevier B. V.在CC BY-NC-ND许可下开放访问。doi:10.1016/j.entcs.2011.02.00436M. Eichberg,A.Sewe/Electronic Notes in Theoretical Computer Science 264(4)(2011)字节码工具包类文件读取器规范<指令...//>>个说明>初始化或生成常量池读取器类层级分析......对照/数据流分析指令读取器Fig. 1. OPAL SPL规格发展为了支持这一目标,OPAL SPL支持字节码指令的格式以及这些指令在执行时在堆栈和寄存器上的效果。OPAL SPL规范的另一种用途是作为通用解析器或通用分析的输入,如图所示1.一、虽然该语言是专门为Java字节码设计的,并用于编码Java虚拟机(JVM)的完整指令集,但我们一直在努力开发一种独立于Java的规范语言。特别是,OPAL SPL专注于指定指令集,而不是完整的类文件,不仅因为前者考虑到OPAL SPL的主要焦点-生成解析器和促进基本分析-我们明确地设计了语言,以便可以对相关指令进行分组。这使得规范更加简洁,并允许分析以几乎相同的方式处理类似的指令。例如,JVM我们还设计了OPAL SPL,以使规范不规定框架如何表示或处理信息;即,OPAL SPL是表示不可知论的。下一节将描述规范语言。在第3节中,我们通过讨论所选JVM指令的规范来推理语言在第4节中讨论了质量标准的验证。该方法的评价见第5节。文章最后对相关工作进行了讨论,并给出了结论.2字节码指令指定字节码指令的语言(OPAL SPL)主要是为了实现JVM指令集的简明规范而设计的。OPAL SPL支持指定指令的格式及其在执行指令时对堆栈和局部变量(寄存器)的影响。因此,可以指定从堆栈中弹出和推送到堆栈上的值的类型,以及读取或写入哪些局部变量。给定完整指令集的规格,标准控制流和数据流分析所需的信息3完整的规范可在http://www.michael-eichberg.de/opal上获得。M. Eichberg,A.Sewe/Electronic Notes in Theoretical Computer Science 264(4)(2011)37然后可用。然而,OPAL SPL并不特别与Java绑定,因为它抽象了JVM规范的特殊性。例如,JVM接下来,我们首先概述语言,然后讨论它的语义。2.1语法1. INSTRUCTIONS::= instructions TYPES EXCEPTIONS FUNCTIONS instructions +>2. TYPES::= types TYPEDEF >//需要公共根类型3. TYPEDEF::= type @name @pc?TYPEDEF*>4. EXCEPTIONS::= exceptions(exceptions @type)+>5. 功能::=函数(function@name signature(param @type)*(returns @type)>)*<6. 联系我们::=instruction@mnemonic @deprecated?@ transforms_control?格式<序列+>(stack(form before after >)+ >)?<<(寄存器)?(exceptions<(exceptions @type)+>)?>>7. SEQUENCE::=序列(序列元素|padding_bytes @alignment|list @count @var|(implicit@var/VALUEEXPRESSION>) | (implicit_type @type < /TYPEEXPRESSION >))+8. 序列元素::={u1 |u2 |u4 |I1 |I2 |i4}@type?@var?/期望值?>>9. BEFOREOP::=((operand @type @var?)| (list @loop_var? @count< BEFOREOP>))*rest?10.AFTEROP::=(operand @type/VALUEEXPRESSION?>)休息?11. LOAD::=load @type @index @var12. STORE::= store @type @index/VALUEEXPRESSION>图二、OPAL规范语言(OPAL SPL)OPAL规范语言(OPAL SPL)是一种基于XML的语言。它的语法在图中描绘2使用类似EBNF的格式。非端子用大写字母书写(指示符、类型等),XML元素的名称用小写字母书写(类型、堆栈等)。XML属性的名称以“@”开头我们使用以”/”开头的符号(/VALUEEXPRESSION、/EXPECTEDVALUE等)引用XML元素的内容。<““(),?,+,*,{}、|“有通常的语义。例如,exceptions(exception@type)+>指定XML元素exceptions有一个或多个exception子元素,这些子元素总是具有属性类型。<2.2语义格式规范OPAL SPL中的每个规范都由四个主要部分组成(图2中的第1行)。第一部分(类型,第2-3行第二部分(exceptions,第4行)声明执行指令时可能抛出的exceptions第三部分(functions,第5行)声明了在指令规范中使用的函数。第四部分是指令本身的规范(第6-12行例如,调用指令不存储签名38M. Eichberg,A.Sewe/Electronic Notes in Theoretical Computer Science 264(4)(2011)并声明被调用方法的类。相反,存储的是对所谓常量池中条目的引用。只有这个常量池条目具有关于方法的所有信息。为了获得,例如,被调用方法的返回类型,则声明一个抽象函数TYPE methodref return type(methodref),该函数接受对条目的引用作为输入并返回方法的返回类型。使用抽象函数声明,我们抽象-在规范的说明-从这些信息的具体表示由封闭的字节码工具包。一条指令的规范最多由四个部分组成:指令指令每个格式序列的u1、u2和u4元素(第8行)分别指定当前值是1、2和4字节的无符号整数值。类似地,i1、i2和i4元素(第8行)用于指定当前值是(1、2或4字节)有符号整数值。 这些值可以可以使用var属性绑定到变量,并且可以使用type属性赋予第二种语义。例如,i2type=此外,还可以指定预期值(第8行)。这使得能够选择用于读取指令的格式序列。例如,在一个示例中, 171 /u1 >. 指定如果第一个字节的值为171,则此序列匹配。序列的列表元素用于指定需要读取的值的可变数量。元素的具体数量由count属性决定。属性的值是一个表达式,它可以使用以前分配给变量的值。sequence元素implicit和implicit type用于将隐式值和类型信息绑定到变量,这些变量以后可以用于类型或值表达式(第7、10和11行)。为了能够将相关的字节码指令聚合到一个逻辑指令中,可以定义几个格式序列。堆栈上的结果由弹出(第9行)和压入(第10行)的堆栈操作数的数量和类型决定。如果指定了多个堆栈布局,则堆栈上的效果由匹配的第一个执行前堆栈布局确定为了确定堆栈上的效应,数据流分析是必要的。唯一前缀规则对OPAL SPL编写的规范的一个约束是,格式序列可以通过仅解析指令的前缀来明确识别换句话说,如果每个格式序列被认为是产生式,并且每个u1、u2等被认为是终端,则OPAL SPL要求格式序列构成LR(0)语法。4这个独特的前缀规则是4注意OPAL SPL没有非终结符的概念;因此,语法实际上更弱LR(0)。此外,列表元素(cf.秒3.8)只允许在一个唯一的前缀之后。M. Eichberg,A.Sewe/Electronic Notes in Theoretical Computer Science 264(4)(2011)39分支偏移«pc=相对的»运行时间类型category_2_valuecategory_1_valuecategory_0_value参考或绝对地址2.........类别_1_值...双长参考浮子int_like类型运行时间类型浮子java.lang.Throwable绝对地址«pc=绝对»标量refarrayref虚空字节或布尔类型1char短int字节布尔图三. OPAL SPL型系统自动检查(cf.秒4);此外,该规则有助于从规范生成快速解析器,例如,使用嵌套的switch语句。类型系统OPAL SPL没有硬编码的类型层次结构。相反,用SPL编写的每个规范都包含了所描述的字节码语言所使用的类型系统的描述。唯一的限制是所有类型都必须安排在一个单一的、严格的层次结构中。Java虚拟机规范[9]3(1).它捕获Java虚拟机已知的所有运行时类型,以及仅在链接或编译时使用的类型,例如,brancho,fieldref和methodref。这种层次结构是JVM指令集特性的结果。字节或布尔类型,例如,需要对baload和bastore指令进行建模,这两个指令对字节数组或布尔数组进行操作OPAL SPL声明的类型层次结构(1)被种类层次结构(2)镜像;对于每个(小写)类型,自动存在一个(大写)种类。这种约定确保了它们的一致性,并使规范本身保持简短。类型INT LIKE的值是int、short等,就像类型int的值是1、2等一样。Kinds使得能够用类型来参数化逻辑指令,例如areturn,从而对相关指令进行简明的说明(例如,freturn、irereturn和areturn)可能(参见秒3.12)。lv指数cp指数typeref菲尔德雷夫方法论40M. Eichberg,A.Sewe/Electronic Notes in Theoretical Computer Science 264(4)(2011)第二名:...执行执行类型绑定值绑定共同格式化序列信息格式序列格式序列AF1osrtm:aSteSqeEqluemence第一名:SeqElem第二名:SeqElem...注册ID类型绑定值绑定通用堆栈布局二. 栈布局I. StackBLaeyfororuet在执行寄存器ID类型绑定负载(not(JVM使用)M不...执行前的寄存器值价值观通用堆栈布局二. 栈布局I. StackBLaeyfororuet执行之后店M不...执行后的寄存器图四、解析指令时的信息流信息流在OPAL SPL中,信息流(值、类型、寄存器ID)通过命名变量和使用变量的表达式来建模一般来说,信息的流动受到图1所示的约束四、例如,在特定格式序列中定义的变量只能由同一格式序列中的后面的元素引用;变量不能在格式序列中引用。如果同一变量被所有格式序列绑定,即,类似地,如果指令定义了多个堆栈布局,则值只能从执行前的第i个堆栈布局向执行后的第i个堆栈布局移动,并且只有执行前的所有堆栈布局所共有的信息可以存储在寄存器中。M. Eichberg,A.Sewe/Electronic Notes in Theoretical Computer Science 264(4)(2011)413设计探讨OPAL规范语言(OPAL SPL)的设计受到JVM指令集特性的影响在下文中,我们将讨论那些对设计有重大影响的指令3.1对堆栈底部建模(athrow)除了athrow之外,所有JVM配置都只指定从堆栈弹出和推入堆栈的操作数的数量和类型;它们不确定整个堆栈的布局。然而,在athrow指令的情况下,堆栈布局在其执行后完全确定(图5,第6行);堆栈上的单个元素是抛出的异常。这就需要对堆栈的内容进行显式建模,而不是由特定指令压入和弹出的操作数。堆栈其余部分的显式建模(第5行)由此允许对固定大小的堆栈进行(隐式)建模(第6行)。1 < 指令助记符=“athrow”转移控制=“always”>二...3stack> 五......6/指令>图15. 应用程序特定信息。4验证质量标准为了验证OPAL SPL规范,我们定义了一个XML模式,它确保规范的语法正确性并执行基本的身份检查。例如,它检查每个声明的类型和每个指令的助记符是否唯一。此外,我们还开发了一个程序,可以分析一个规范并检测以下错误:(a)格式序列没有唯一的前缀路径,(b)单个指令的多个格式序列在它们所绑定的变量中不一致,(c)函数参数的数量或类型除了这些错误,我们还警告以下潜在问题: 不使用声明的类型、函数或异常,(b)格式序列不定义具有名称操作码的变量,(c)在属于不同指令定义7的序列中使用相同的操作码值,(d)包含“if”、“goto”、“ret”、“jsr”、“jump”、“throw”或“switch”的指令助记符这些额外的检查已被证明对早期检测和修复(细微)错误非常有用。5评价规范的正确性我们使用JVM指令集的规范[ 9 ]来实现高度可扩展的该工具包支持四种表示7启用包含相同操作码值的多个序列的决定是建模所必需的新的指令。48M. Eichberg,A.Sewe/Electronic Notes in Theoretical Computer Science 264(4)(2011)Java字节码的三种表示形式:一种原生表示形式,它是Java字节码的一对一表示形式;一种高级表示形式,它抽象出Java字节码的一些细节,特别是从常量池中抽象出来的细节;一种使用高级表示形式的XML表示形式;一种基于Prolog的Java字节码表示形式,它也是基于高级表示形式的。我们已经对开发的框架进行了广泛的测试,并且能够导入JDK 6,Tomcat6.0.18和Eclipse 3.5的所有类文件。此外,我们已经用不同的编译器(javac和Eclipse的内置编译器)和不同的编译器设置编译了Apache Ant 1.7.1,并且还能够解码这些类文件。因此,我们确信JVM规范的编码是正确的。方法的合理性基于该规范,我们开发了两个生成器,它们都是使用FPGA实现的。第一个转换生成的类表示所有的指令,是350行。 每个生成的类将一条指令表示为Java对象,并提供获取指令具体实例的XML和Prolog表示的功能。第二个转换生成代码数组的解析器,该代码数组创建指令类的实例。这个转换又是300行我们将其与字节码代码工程库(BCEL)[2]进行了比较,后者使用类似的方法来表示和处理指令。与BCEL的预防相关代码相比,该生成器小15到20倍。该方法的另一个优点是,所有指令都是本地化的。例如,在Prolog表示的情况下,我们测试了几种不同的表示,这些表示通常会忽略所有指令。然而,一般来说,生成器需要更改的代码不到40行6相关工作将XML技术应用于Java字节码并不是一个新的想法[5]。类文件的XML序列化,例如,允许使用XML进行声明性转换。XMLVM [11]项目的目标不仅是支持JVM指令,[9],也就是说,[8]是一个集合。这要求至少转换了JVM然而,对单个XML指令在操作数堆栈上的效果的描述并没有以OPAL SPL这样易于访问的格式指定,而是嵌入在XSL转换中。霍尔风格的程序逻辑规则也可以作为JVM指令集的规范[1]。 虽然这样的规范超出了OPAL SPL,到目前为止,指令对VM的状态(操作数堆栈,寄存器等)的影响。它没有描述指令格式,也没有对指令进行分组(参见秒3.4)只有隐含地,通过推导规则,如果有的话。M. Eichberg,A.Sewe/Electronic Notes in Theoretical Computer Science 264(4)(2011)49Maxwell项目汇编系统[10]能够描述比高级中间语言(即IA32、PowerPC和IBM指令集架构)中常见的指令更复杂的指令。这些描述然后被用来生成汇编器和反汇编器以及测试用例。然而,系统无法描述指令的执行情况;仅描述了其格式。与OPAL SPL不同的是,这些解压缩不是以像XML这样的语言独立格式提供的,而是使用嵌入到Java中的特定于域的语言以编程方式构建的。Vmgen[6]是一个为基于堆栈的中间语言提供高效解释器的生成器。虽然它也可以用于生成基于寄存器的中间语言的代码,但它不能以声明方式描述此类指令,如可以使用OPAL SPL中的load和store元素来完成。它的描述也不包括字节码本身的格式;因此,不可能根据vmgenvmgen的一个显著特点是它(几乎)统一地处理操作数堆栈和指令流,这简化了对具有立即操作数的指令的描述。OPAL SPL没有达到相同程度的一致性,因为它描述了指令如何存储在类文件中。7结论和今后的工作在本文中,我们首先讨论了一种语言,用于指定基于字节码的指令的格式和执行语义,到内存访问。该语言用于编码JVM指令集的语义。JVM规范的编码结果随后被用于Java字节码框架的开发,该框架读取类文件并执行标准的控制流和数据流分析;例如,将基于堆栈的字节码表示转换我们的评估表明,使用规范作为开发字节码工具包的基础-它显着减少了需要开发的代码行数,也减少了此类工具包的开发时间在未来的工作中,我们将研究OPAL SPL在其他字节码语言(如通用中间语言)编码中的使用这将使得有可能开发(控制和数据流)分析有关的OPAL SPL和使用相同的分析来分析不同语言的字节码确认作者要感谢Lucas Satabin实现了类型检查器。这项工作得到了www.cased.de的支持。引用[1] 法比安·班瓦特和彼得·穆勒。 一种用于计算机的程序逻辑。计算机科学电子笔记,141(1):255 -2 73 ,2005 。第一届字节码语义研讨会论文集50M. Eichberg,A.Sewe/Electronic Notes in Theoretical Computer Science 264(4)(2011)验证、分析和转换(BYTECODE 2005)。[2] Bytecode Engineering Library(BCEL) http://jakarta.apache.org/bcel/manual.html,2006年。[3] 埃里克·布鲁顿。ASM 3.0:一个Java字节码工程库。http://download.forge.objectweb的网站。org/asm/asm-guide.pdf,2007年2月。[4] 千叶茂 Java编程助手3.11.0.ga。http://www.csg.is.titech.ac.jp/~ chiba/javassist/,2009.[5] 迈克尔·艾希伯格BAT2XML:基于XML的Java字节码表示。理论计算机科学电子笔记,141(1):93-107,2005。第一次字节码语义、验证、分析和转换研讨会论文集(BYTECODE 2005)。[6] M. Anton Ertl, David Gregg, Andreas Krall, and Bernd Paysan.一个高 效的虚拟 机解释器 生成器。Software Practice Experience,32(3):265[7] IBM. 霸王J. 沃森分析图书馆http://wala.sourceforge.net/,2006年。[8] ISO/IEC,瑞士日内瓦。信息技术[9] 蒂姆·林德霍尔姆和弗兰克·耶林。Java虚拟机规范Addison-Wesley,第2版,1999年。[10] Bernd Mathiske,Doug Simon,and Dave Ungar. Maxwell汇编系统在PPPJACM。[11] 阿诺·普德使用XSL样式表的字节码转换。在SNPD '08中:Proceedings of the 2008 Ninth ACIS InternationalConference on Software Engineering,Arti Ficial Intelligence,Networking,and Parallel/DistributedComputing,pages 563-568,Washington,DC,USA,2008. IEEE计算机协会。[12] 阿 诺 ·普 德 和 杰 西 卡 ·李 基 于 XML 的 字 节 码 级 转 换 框 架 。 Electronic Notes in Theoretical ComputerScience,253(5):97-111,2009.第四届字节码语义、验证、分析和转换研讨会论文集(BYTECODE2009)[13] 放 大 图 片 作 者 : R ajaVal l'ee-Rai , EtienneGagnon , LaurieJ. Henrique , Patri ckLam ,PatricePominville,andVij
下载后可阅读完整内容,剩余1页未读,立即下载
cpongm
- 粉丝: 4
- 资源: 2万+
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- zigbee-cluster-library-specification
- JSBSim Reference Manual
- c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf
- 建筑供配电系统相关课件.pptx
- 企业管理规章制度及管理模式.doc
- vb打开摄像头.doc
- 云计算-可信计算中认证协议改进方案.pdf
- [详细完整版]单片机编程4.ppt
- c语言常用算法.pdf
- c++经典程序代码大全.pdf
- 单片机数字时钟资料.doc
- 11项目管理前沿1.0.pptx
- 基于ssm的“魅力”繁峙宣传网站的设计与实现论文.doc
- 智慧交通综合解决方案.pptx
- 建筑防潮设计-PowerPointPresentati.pptx
- SPC统计过程控制程序.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功