没有合适的资源?快使用搜索试试~ 我知道了~
--《理论计算机科学电子札记》2003年第URL:http://www.elsevier.nl/locate/entcs/volume 82. html15页s安全高效的动态对象解析Andreas Hartmann,WolframAmmeInstitut fur InformatikFriedri ch-S chiller-Univer sitaütJena德国耶拿Jeffery von Ronne,Michael Franz2加州大学欧文分校信息与计算机摘要通过将“非转义”对象转换成其组成部分标量数据字段的集合,可以大大减少面向对象程序的执行时间。但是对于支持动态链接的语言,这种优化(我们称之为“对象解析”)通常只能在运行时执行,此时整个程序都可用于分析。在这种情况下,由此产生的业绩增长将被分析和重组阶段产生的额外费用所抵消。在本文中,我们描述了正在进行的工作,它提供了一个注释技术,减少了执行对象解析所需的运行时开销。我们的方法在编译时对每个类进行部分静态转义分析,然后用即时(JIT)编译器可以用于对象解析的信息注释该类的中间表示。我们应用这种技术的safeTSA的中间表示,产生一个简单的扩展safeTSA的类型系统,保证安全和可验证的1介绍垃圾收集是提高程序员生产力的一个重要辅助手段,但它需要额外的运行时开销来管理内存分配和释放。在简单的Java实现中,所有对象都将在垃圾收集堆中创建,而包含布尔值、字符、数字类型和引用的局部变量将在垃圾收集堆中创建。1电子邮件: krs,informatik.uni-jena.de2电子邮件:jronne@ics.uci.edu,franz@uci.edu2003年由ElsevierScienceB. V. 操作访问和C CB Y-NC-N D链接。哈特曼等2对象存储在更有效的运行时堆栈上。在堆上分配对象的效率较低,因为在分配过程中查找空闲空间以及在垃圾收集器运行时查找无法访问的对象会产生额外的开销。一般来说,减少垃圾回收器管理的对象数量将提高其性能。对象解析3是一种优化技术,旨在通过分配尽可能多的数据来减少垃圾收集器在堆栈上而不是堆上。研究表明,大量对象的行为类似于传统的自动变量,可以在运行时堆栈上分配。McDowell在[14]中报告说,在该研究中的程序中,0%到56%的对象可以在堆栈上分配,但通常有5-15%的对象可以在堆栈上分配。这些结果表明,对象解析的潜力,作为一个生产性的面向对象的程序优化技术。只能对生存期永远不能超出创建对象的方法范围的对象执行对象解析。这是真的对象可以通过逃逸分析确定,如在[5]。如果转义分析确定对象被限制在方法的静态范围内不幸的是,在动态加载的情况下,即使是简单的应用程序的静态对象解析也实际上,在大多数情况下,对象解析所需的信息仅在外部方法的内容可用时才可用对Java Grande Benchmark程序运行一个简单的转义分析算法,结果发现,由于f.e.,大多数为对象解析找到的候选对象不能在编译时优化。来自不同类的已创建对象的未知构造函数,或者访问索引未知的数组字段然而,将分析推迟到运行时意味着执行转义分析所花费的CPU周期是不执行程序所花费的CPU周期。出于这个原因,最小化转义分析的运行时成本是有益的;这可以通过在编译时执行部分转义分析并将结果作为注释附加到各个程序模块来实现本文介绍了一种安全有效的转义信息传输注释技术我们的方法静态派生每个类该技术被实现为safeTSA中间表示的扩展[1]。本文的其余部分结构如下:在第2节中,我们更详细地讨论了为什么静态的离线对象解析对于现代程序来说是不够的。第3节简要介绍了safeTSA中间表示,第4节描述3也称为堆栈分配[4]哈特曼等3安全传输转义注释。第5节讨论了相关工作,第6节讨论了进一步发展的前景。2转义分析和对象解析在面向对象语言的典型实现中,每个对象在存储器中表示为指示其类型的标签、一些实例字段和一些字段,这些字段保存关于可以在该对象上调用的方法的信息。如果一个对象我们称这个过程为对象解析,将对象的分配转换逃逸分析的准确性限制了寻找目标解析机会的有效性。大多数逃逸分析研究集中在静态全程序逃逸分析技术的开发上。但是在提供普遍的单独编译和动态链接的环境中(例如,Java虚拟机在存在这种动态类加载机制的情况下,外部方法的内容不能在编译时确定,因此任何静态编译时分析都必须做出更坏的假设(也就是说,必须假设传递给外部方法的每个对象都将转义)4,从而导致转义的不精确推导信息和对象分辨率的低速率 尽管有这些限制,大多数已经为Java开发的转义分析是静态编译时分析(例如,[7])。因此,大多数Java转义分析,要求潜在的用户,忘记了Java的动态类加载和单独的虽然一般来说,Java程序的对象解析必须推迟到运行时,但在一些情况下,静态编译时对象解析将是成功的。事实上,只有两种情况:• 对于在类c的方法f中定义的数组a,对象解析总是可以静态执行的,当且仅当,a的元素数量在编译时是已知的,并且a的引用从不直接或间接使用,除非作为参数传递给c的其他静态确定的方法。• 在编译时可以执行对象o的对象解析,而不是在类c的方法f中定义的数组,当且仅当,对o的引用仅用于直接或间接访问字段,或者作为参数传递给c的其他静态确定的方法。由于Java语言规范只允许每个类文件有一个类,哈特曼等4public class Complex{addRandom2Complex(Complex z){ RandomComplex r = new RandomComplex(); z.real += r.real;int n =r. int n;return n;}}(一)public class FrameCheck{public boolean compute(){FRect lower = new FRect(10,15,30,30);返回upper.intersects(lower);}}(b)第(1)款Fig. 1.不允许静态对象解析的程序。在所有其他情况下,执行的对象解析可能导致程序的运行时行为可能被更改的情况,因此不应在编译时执行对象解析。图1显示了两个用Java编写的示例程序,它们不能执行静态对象解析图1(a)中的addRandom2Complex()方法首先生成一个随机复数。然后,它将这个数字添加到作为其参数接收的复数中。最后,它将加法的结果返回给调用方。乍一看,对象r似乎可以转换为两个堆栈分配变量real和imag。然而,仔细观察程序,就会发现我们上面提到的一般对象的静态对象解析的条件并不满足。这是因为Java中的构造函数调用可以被看作是 一 个 方 法 调 用 , 它 将 对 已 分 配 对 象 的 隐 式 引 用 作 为 参 数 , 但RandomComplex类的构造函数不是Complex类的成员。如果一个人试图堆栈分配r,但是当RandomComplex类被加载时,它的默认构造函数是,例如,将对象的引用附加到静态链表中,那么在addRandom2Complex()方法退出后,引用可以保持活动,并且引用现在将指向一个可以被重用于其他目的的位置,违反语言类型安 全 为 代 价 的 图 1 ( b ) 显 示 了 另 一 个 在 编 译 时 不 可 优 化 的 例 子 。FrameCheck类提供了一个checkIntersects()方法来确定新放置的上部框架是否与现有的下部框架相交。 下frame被传递给一个名为intersects()的方法,该方法检查给定frame的可能与第一个示例一样,调用的方法(在本例中,构造函数FRect()和方法intersects())都不是在类内部定义的5真静 编译时物件 决议将 被 成功 用于 类似方法addComplex2Complex,因为被分析类的构造函数是可访问的哈特曼等5(a)SSA中的(b)safeTSA图二.示例程序并且因此可以在运行时改变。3SafeTSASafeTSA[1]是一种类型安全的中间表示,被设计为机器独立的中间表示,它既易于验证又易于转换为优化的机器代码。安全TSA表示是一个静态的单赋值变量,因为它不区分原始程序的变量,而只区分这些变量的唯一定义。与简单的SSA表示不同,safeTSA提供了内在的和防篡改的引用完整性,作为编码本身的格式良好属性。safeTSA的另一个关键思想是类型分离:不同类型的值保持分离,即使是手工制作的恶意程序也不能破坏类型安全和随之而来的内存完整性。详情可参见[1]。下面是对safeTSA的类型分离的简短介绍,它将在下一节中用于安全地编码部分静态转义分析的结果。图2(a)在左侧显示了源程序片段,在右侧显示了如何将其转换为SSA形式的草图。SSA表示中的每一行对应于定义新SSA变量的指令。这些变量是通过用连续的整数标记指令来命名的;在本图中,每个指令左侧的箭头指向一个标签,该标签指定由每个指令隐式指定的特定目标变量。对其他指令中先前计算的值的引用通过将先前值的标签括在括号中来表示-在我们的描述中,我们使用(i)和(j)作为计算i和j的初始值的指令的占位符。SSA表示的一个问题在于程序的类型安全,即确保所有操作数的使用都是类型一致的。恶意代码提供者可能想向我们提供非法程序,其中指令将使用不符合类型的操作数,例如。在图2(a)中,(10)中的整数加法将哈特曼等6图三. safeTSA的隐含机器模型可以应用于布尔操作数。在我们的中间表示中,类型安全是由类型分离的概念来保证的。虽然普通SSA的寄存器平面是隐式创建的,考虑了移动程序中出现的预定义类型、导入类型和本地类型(图3)。在safeTSA中,适当的寄存器平面的选择由操作隐式给出,即,每条指令自动为源寄存器和目的寄存器选择适当的平面。指令的操作数仅指定由此选择的平面上的特定寄存器编号。此外,适当的目的寄存器平面上的目的寄存器也是隐式选择的-在每个平面上,寄存器简单地以升序填充。在本例中,整数加法运算取两个寄存器号作为其参数,src 1和src 2。它将隐式地从寄存器integer-src 1和integer-src 2中获取两个源操作数,并将其结果存入下一个可用的整数寄存器。恶意攻击者无法更改整数加法以操作整数以外的操作数,也无法生成整数以外的结果。将类型分离应用于图2(a)的程序的结果如图2(b)所示。内存安全为了构造内存安全,我们的机器模型为每个引用类型ref提供了一个匹配的类型safe-ref,它表示变量已经过空检查。类似地,对于每个数组,我们提供一个匹配类型safe-index-,其实例可以仅假设合法范围内的索引值然后,空检查变成在相应的寄存器平面上采用显式引用源类型和显式寄存器编号的操作。如果检查成功,则ref值被复制到相应safe-ref类型平面上的隐式给定寄存器(下一个可用寄存器),否则将出现异常。哈特曼等7生成的.类似地,索引检查操作将获取数组和整数寄存器的编号,检查整数值是否在边界内,并且如果检查成功,则将整数值复制到适当的安全索引寄存器平面。空值检查和索引检查可以推广到包括所有类型转换操作:xupcast操作涉及动态检查,如果失败将导致异常。在成功的情况下,它将复制正在转换的值到目标类型平面上的下一个可用的空闲寄存器(只有动态检查会在目标机器上产生实际代码,而不是复制操作)。向下转换操作永远不会失败,也永远不会产生任何实际的目标代码。safeTSA中的所有存储器操作要求存储指示符已经处于安全状态;即,这些操作将仅从安全-引用或安全-索引类型的寄存器平面而不是从对应的不安全类型获取操作数。内存访问有四种不同的原语:getfield引用类型对象字段setfield引用类型对象字段值getelt数组类型对象索引setelt数组类型对象索引值其中,ref-类型表示类型表中的引用类型,object指定对应的safe-ref类型的平面上的寄存器号,field是对ref-类型的数据成员的符号引用,并且value指定对应于field的类型的平面上的寄存器号。类似地,对于数组引用,object指定数组类型平面上包含数组基址的寄存器Pimitive操作和方法调用safeTSA中的原语操作从属于类型,只有两个通用指令:基元基型运算操作数1操作数2.。。xprimitive基类型运算操作数1操作数2.。。其中,base-type是对类型表的符号引用,operation是对定义在该类型上的操作的符号引用,而operand 1.操作数N表示对应于操作的参数类型的各个平面上的寄存器编号在每种情况下,结果被存放到对应于操作的结果类型的平面上的下一个可用寄存器中。三个原语提供了带和不带动态分发的方法调用:xcall基本类型方法操作数1操作数2.。。xcall实例基类型接收器方法操作数1操作数2.。。xdispatch基本类型接收器方法操作数1操作数2.。。哈特曼等8−其中,base-type标识接收器对象的静态类型,receiver指定实际接收器对象在相应平面上的寄存器编号,method是对被调用方法的符号引用,而operand 1.操作数N表示对应于方法的参数类型的各个平面上的寄存器编号。结果将存入下一个可用的寄存器,该平面对应于该方法的结果类型。4SafeTSA中的代码注释支持高效运行时对象解析的代码注释可以通过扩展其类型系统添加到safeTSA对每个程序单元单独执行静态编译时部分转义这些注释可以通过在safeTSA的机器模型中添加寄存器平面的附加维度并将转义注释存储为safeTSA表示中的类型专门化来安全地传输在运行时,我们需要知道,对于每个创建对象的位置,它们是否可以比分配其内存的方法存活(也就是说,对象但在编译单个程序单元时,只能对这个问题提供部分答案。对对象6的引用的每个定义被归类为正常(即,不做出关于它是否会逃逸),作为强有界(即,它只用于字段访问周围的方法或作为强有界参数传递给同一程序单元中的其他方法,因此不会转义周围方法因此,safeTSA机器模型将使用三个转义分类进行扩展,因此对于每个Java类,有六个引用类型(原始safeTSA有两个)。在一个维度中,每个引用类型被分类为非空(在这个扩展模型中,如果引用定义是有界的,则代表类A的对象引用的SSA变量可以被分配类型mbnd A,但是引用可以无限制地逃逸的引用的SSA变量将被分配正常引用类型A。此外,类型A的参数定义可以注释为类型mbnd−A或sbnd−A7。[6]特别令人感兴趣的定义是初始内存分配、方法参数和φ函数。由数组访问创建并从方法返回的引用被保守地视为已转义。7注意,为了保持实现更改之间的动态链接,调用者不需要精确匹配被调用者哈特曼等9见图4。扩展机器模型。上面的类型扩展可以在运行时通过检查一些简单的约束来识别可以在堆栈上而不是在堆上创建的对象。强绑定引用创建始终可以是堆栈分配的。(The链接器必须验证强绑定的SSA变量只传递给被调用方其将对应的参数注释为强有界8)。一个可能有界的引用变量m可以被改变为一个强有界的(和栈分配的),如果它的用户是φ-函数,该φ-函数是或可以被改变为具有适当的强有界类型和/或方法调用,其中,响应的形式参数是或可以被改变为适当的强有界类型9。这些条件通过以下程序实现:。将所有mbnd类型的对象引用创建标记为。。通过φ-函数跟踪a的流,并识别所有间接用户。。对于每个标记的定义a,确定作为参数10传递a(直接或通过φ函数)的方法f。。 检查每个方法f对应的形参p的类型。- 如果对于所有p,p的类型是sbnd,则可以优化对象创建。- 如果对于任何p,p的类型是正常的(即不是mbnd或sbnd),则对象创建可能不会被优化。- 否则,每个p都是sbnd或mbnd,某些p是mbnd。对于每个p是mbnd,递归地检查p是否有界。如果所有检查都成功,则可以优化对象创建,否则必须保持未优化。可以通过将mbnd参数/变量适当地改变为sbnd和正常参数/变量修改指令集safeTSA机器模型的扩展下面描述的这些改变以这样的方式构造,以保证逃生信息的安全传输,使得接收到的逃生信息可以被安全地传输。这些被调用方8如果要遵守Java二进制兼容性规则,这些最初将仅是对与调用者相同的编译单元内的final或静态方法的调用。9翻译,我们允许可能有界定义用于强有界用途,而不是反向。10注意,由于多态性,一个调用站点可能有多个被调用者,所有这些都必须考虑哈特曼等10保证部分逃逸分析结果相对于所接收的程序是正确的。有界对象引用的定义将其排除在返回值之外。因此,返回指令将自动地仅从正常寄存器平面选择对象引用变量,这保证了不会从这种指令返回sbnd或mbndsafeTSA中的指令隐式地从相应寄存器平面中的SSA变量获取其操作数,并将其结果值自动存储在其结果类型的寄存器平面中的下一个自由变量中。这对于扩展机器模型仍然成立,但是一些指令同样地在不同“有界性”的引用类型上操作因为在调用者和被调用者的形式方法参数之间不存在1:1的有界性对应在下表中,我们描述了插入附加修饰符会影响的最重要的指令• new:new操作符在safeTSA中代表对象的分配。新指令的应用程序传递来自安全引用类型的对象,该对象由该指令本身隐式该指令将由一个修饰符扩展,该修饰符指定结果应该存储在哪种寄存器平面中11新的类构造函数operand-list-mod,其中mod∈ {n,m,s}• xupcast,downcast:指令xupcast和downcast将值从一个寄存器组复制到另一个寄存器组。我们只提供一个mod注释,并且要求两种类型都是正确的有界性。这足以确保,例如,sbnd变量不能转换为普通变量,然后允许转义。xupcastref-type ref-type object-mod,其中mod∈ {n,m,s}向下转换引用类型引用类型对象-mod,其中mod∈ {n,m,s}• getfield,setfield,getelem,setelem,xdispatch,xcall-instance:可用于内存访问和方法调用的指令必须使用修饰符进行扩展,该修饰符指定必须从哪个寄存器平面获取将由指令访问的对象。getfield引用类型对象字段-mod,其中mod∈ {n,m,s}setfield引用类型对象字段值-mod,其中mod∈ {n,m,s}getelem数组类型对象索引-mod,其中mod∈ {n,m,s}setelem数组类型对象索引值-mod,其中mod∈ {n,m,s}x调度基类型接收器方法操作数列表-mod,其中mod∈ {n,m,s}x调用实例基类型方法操作数列表-mod,其中mod∈ {n,m,s}11s修饰符可用于(并保持Java二进制兼容性)调用与调用者相同的编译单元内的构造函数。哈特曼等11final class FRect{int x,y,width,height;public int findDuplicate(int x,int y,int width,int height){ this.x = x;this.width = width;this.height = height;}boolean intersects(FRect r){ FrameBorder.incDefBorder(r); return!((r.x+ r.width<= x)||(r.y+ r.height >=y)||(r.x >= x + width)||(r.y >= y + height));}}final class StringName {static void incDefBorder(FRectr){ r.x -= 2; r.y -= 2;r.width += 2;r.height += 2;}}图五.类FRect(a)和FrameBorder(b)代码注释我们回头参考图1(b)的示例程序,作为我们的注释技术如何工作的一个例子。请注意,这个程序不适合静态的编译时对象解析,因为类FRect或FrameBorder中的任何一个都可以在编译过程后独立更改(使任何静态编译时对象解析无效)。图5显示了FRect和FrameBorder的类定义,因为它们是由JIT编译器的类加载器加载的。在编译类FRect、FrameBorder和FrameCheck期间,将为每个类生成扩展的 safeTSA 文 件 。 图 6 描 述 了 编 译 后 的 checkIntersect 、 intersects 和incDefBorder方法在checkIntersect中,参数p1被指定为sbnd类型,因为编译器可以在统计上验证该引用是否安全有界。相反,new运算符产生的对象引用将被分配类型mbnd,因为它将作为参数传递给方法intersects。在方法intersects中,参数被指定为mbnd类型,因为它将作为方法incDefBorder的参数给出,但方法incDefBorder中的参数定义被指定为sbnd类型,因为从p1创建的引用变量被安全地绑定到方法。由于checkIntersect方法将在程序执行期间调用,而JIT编译器尚未编译此方法,因此类加载器将首先加载FrameCheck类。对checkIntersect方法的初步分析表明,变量lower引用的对象可能是对象分辨率的候选对象,因为lower的类型是mbnd。检查是否可以在这个对象上执行对象解析,类加载器哈特曼等12将 首 先 加 载 类FRect , 并 验 证 intersects 的参 数是 否转义 该方 法。由 于intersects的参数不是哈特曼等13enter方法boolean checkIntersect(sbnd-FRect p1)mbnd-FRect-0:新FRect-mvoid:xcall init> FRect(0)\$(10,n),(15,n),(30,n),(30,n)-m sbnd-#FRect-0:xupcast FRect #FRect(p1)-sboolean-0:xdispatch #FRect(0)intersects\$(0,m)-sboolean-1:return boolean 0enter方法boolean intersects(mbnd-FRect p1)void:xcall FrameBorders #class includeSmallBorders\$(p1,m)mbnd-#FRect-0:xupcast FRect #FRect p1-mint-0:getfield #FRect(0)x -mint-1:getfield #FRect(0)width-mint-2:iadd(0)(1)int-3:getfield #FRect #this x-sboolean-0:ilte(2),(3)int-4:getfield #FRect(0)y-mint-5:getfield #FRect(0)height-mint-6:iadd(4),(5)int-7:getfield #FRect #this y-sboolean-1:ilte(6),(7)boolean-2:bbor(0)(1)int-7:getfield #FRect #this width-sint-8:iadd(3),(7)boolean-3:igte(0),(8)boolean-4:bbor(2),(3)int-9:getfield #FRect #this height-sint-10:iadd(7),(9)boolean-5:igte(4),(10)boolean-6:bbor(4)(5)boolean-7:bbnot(6)boolean-8:bbreturn(7)输入方法void incDefBorder(sbnd-FRect p1)sbnd-#FRect-0:xupcast FRect #FRect p1-sint-0:getfield #FRect(0)x-sint-1:isub(0),const-2void:setfield #FRect(0)x(1)-sint-2:getfield #FRect(0)y -sint-3:isub(2),const-2void:setfield #FRect(0)y(3)-sint-4:getfield #FRect(0)width-sint-5:iadd(4),const-2void:setfield #FRect(0)width(5)-sint-6:getfield #FRect(0)height -sint-7:iadd(6),const-2哈特曼等14void:setfield #FRect(0)height(7)-s见图6。类型扩展后的示例方法。哈特曼等15定义为sbnd类型时,必须加载FrameBorders类,并使用incDefBorder方法进行分析。方法incDefBorder的sbnd参数声明指示参数不转义其方法。结果分析器得出结论,方法intersects的参数定义也是安全的,因此可以转换为sbnd类型。这意味着传递给intersects的对象引用不能转义该方法,因此可以通过变量lower对可访问的对象执行对象解析。5相关工作对转义分析的最早研究是由Park和Goldberg[15]完成的,他们开发了一种基于引用生存期的函数式语言转义分析,并对列表进行操作。在[18]中,Steensgaard开发了一种具有近线性时间复杂度的跨过程流不敏感点分析。Whaley将指向和逃逸分析结合到指向逃逸图中,并使用该数据结构以消除线程绑定对象的多余同步线程也在[16]中处理,Salcianu描述了一种技术,用于获得多线程访问的对象的精确指向和转义信息。Vivien等人[19]提供了一种用于增量指针和别名分析的算法。Choi等人[5]应用转义分析来执行堆栈分配,并利用连接图减少线程间同步。他们的方法类似于别名和指向图领域的工作,但他们的图可以更容易地另一个应用在[9]中给出; Gay和Steensgaard描述了一种方法,该方法的分析结果将用于在运行时堆栈上分配对象。他们的技术通常只检测可以被堆栈分配的对象的一个子集,此外,还保守地假设对象在存储在其他对象中时会逃逸。Blanchet将他的转义分析结果应用于Java中对象的堆栈分配[4]。他的技术可以精确地确定任务的逃跑信息。与Blanchets的工作相比,我们的技术受益于预先计算的除了逃逸分析,还有其他分析可以用来指导堆栈分配或对象解析。在支持对象解析中,也可以使用索引分析[6]、引用计数[11,12]和存储使用分析[17]。一般来说,使用这些分析进行对象解析将是比使用标准逃逸分析技术昂贵得多程序表示的代码注释没有像转义分析那样被彻底研究,但是最近,已经提出了各种注释,用于使用Java字节码和其他中间表示来增强JIT编译器的性能[3]。Krintz等人[13]注释字节码以提高JVM执行的程序的性能Franz etal.[8]用转义信息注释程序的语法树,并对它们进行编码以保证安全传输。两哈特曼等16[13][8]保证他们注释的安全。Hannan在[10]中使用函数方法来注释转义信息类型。与我们的工作相反,他排除了动态类加载,也没有给出类型计算的算法。6结论即使在非常简单的程序中,静态对象解析也常常是不可行的。这是因为对象解析所需的信息通常只在整个程序加载时才可用。但是动态对象解析要求将用于确定转义信息的时间从程序执行中去除。动态转义分析的运行时成本可以通过在编译时执行部分转义分析并将结果作为注释附加到各个程序单元来降低。在本文中,我们提出了一种安全有效的注释技术,减少了运行时的开销,这是执行对象解析所需的。我们的方法在编译时对每个类执行部分静态转义分析,然后使用此信息注释该类的中间表示,JIT编译器可以使用此信息进行对象解析。我们应用这种技术nique的safeTSA的中间表示,产生一个简单的扩展safeTSA作为一个更大项目的一部分,我们开发了一个系统,该系统由Java到safeTSA编译器和JVM组成,该JVM扩展为支持从safeTSA到本地PowerPC代码的即时编译[2]。目前,我们正在将对我们的代码注释技术的支持添加到safeTSA系统中。引用[1] W. Amme,N. Dalton,J. von Ronne,and M.弗朗兹SafeTSA:一种基于静态单赋值形式的类型安全和引用安全的移动代码表示。SIGPLAN'01 Conference onProgramming Language Design and Implementation,第137-147页,2001年[2] W. Amme,J. von Ronne,and M.弗朗兹使用safetsa表示来提升现有java虚拟机的性能。2003年,第10届并行计算机并行计算国际研讨会[3] A. Azevedo,A. Nicolau,and J. Hummel.一个注释感知的java虚拟机实现。Concurrency - Practice and Experience,12(6):423[4] B.布兰切特面向对象语言的转义分析:在Java中的应用。ACM SIGPLANNotices,34(10):20[5] J. - D. 崔,M。古普塔,M。J. 塞拉诺河谷C. Sreedhar和S.P. 米德基夫java中的转义面向对象会议,第1-19页,1999年哈特曼等17[6] A.德语指针的过程间may-alias分析:超越k限制。ACM SIGPLAN Notices,29(6):230[7] R. Fitzgerald,T. B. Marmot:An Optimizing Compiler for Java. Microsoft技术报告3,Microsoft,2000年3月。[8] M. 弗朗兹角克林茨河谷Haldar,和C.H. 鹳鸟防篡改注释。技术报告02-10,信息和计算机科学系,加州大学欧文分校,3月。2002年。[9] D. 盖伊和B。斯坦斯加德基于对象程序的快速转义分析和堆栈分配在第17届国际混凝土结构会议(CCSpringer-Verlag,2000.[10] J· 汉 南 函 数 式 语 言 的 基 于 类 型 的 转 义 分 析 。 Journal of FunctionalProgramming,8(3):239[11] L.海德曼使用引用计数分析的实时垃圾收集。博士论文,莱斯大学,1988年8月。也是莱斯大学技术报告TR 88[12] P. 胡达克引用计数的语义模型及其抽象。1986年ACM Conference on Lisp andFunctional Programming,第351-363页。ACM,ACM,Aug. 一九八六年[13] C. Krintz和B.考尔德使用注释减少动态优化时间。SIGPLAN Conference onProgramming Language Design and Implementation,第156-167页,2001年[14] C.麦克道尔Java中的垃圾减少互联网出版物http://www.cse.ucsc.edu/research/embedded/pubs/gc,1982年。[15] Y. G.公园和B。金伯格引用逃逸分析:根据引用的生命周期优化引用计数。在部分求值和基于语义的程序操纵中,第178-189页[16] A. Salcianu和M. C.里纳德多线程程序的指针和转义分析。并行编程的原理和实践,第12-23页[17] M. Serrano 和 M. 费 利 存 储 使 用 分 析 及 其 应 用 。 在 Proceedings of the 1fstInternational Conference on Functional Programming,第12页,费城,1996年6月。[18] B.斯坦斯加德在几乎线性的时间内进行指向分析。在Symposium on Principles ofProgramming Languages,第32-41页[19] F. Vivien 和 M.C. 里 纳 德 递 增 指 针 和 转 义 分 析 。 SIGPLAN Conference onProgramming Language Design and Implementation,第35-46页,2001年[20] J. Whaley 和 M. 里 纳 德 Java 程 序 的 组 合 指 针 和 转 义 分 析 。 ACM SIGPLANNotices,34(10):187
下载后可阅读完整内容,剩余1页未读,立即下载
cpongm
- 粉丝: 5
- 资源: 2万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 黑板风格计算机毕业答辩PPT模板下载
- CodeSandbox实现ListView快速创建指南
- Node.js脚本实现WXR文件到Postgres数据库帖子导入
- 清新简约创意三角毕业论文答辩PPT模板
- DISCORD-JS-CRUD:提升 Discord 机器人开发体验
- Node.js v4.3.2版本Linux ARM64平台运行时环境发布
- SQLight:C++11编写的轻量级MySQL客户端
- 计算机专业毕业论文答辩PPT模板
- Wireshark网络抓包工具的使用与数据包解析
- Wild Match Map: JavaScript中实现通配符映射与事件绑定
- 毕业答辩利器:蝶恋花毕业设计PPT模板
- Node.js深度解析:高性能Web服务器与实时应用构建
- 掌握深度图技术:游戏开发中的绚丽应用案例
- Dart语言的HTTP扩展包功能详解
- MoonMaker: 投资组合加固神器,助力$GME投资者登月
- 计算机毕业设计答辩PPT模板下载
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功