CN109564521A - 用于类层级分析的混合去优化机制 - Google Patents
用于类层级分析的混合去优化机制 Download PDFInfo
- Publication number
- CN109564521A CN109564521A CN201780047204.2A CN201780047204A CN109564521A CN 109564521 A CN109564521 A CN 109564521A CN 201780047204 A CN201780047204 A CN 201780047204A CN 109564521 A CN109564521 A CN 109564521A
- Authority
- CN
- China
- Prior art keywords
- software
- class
- call
- hoc approach
- optimization
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/455—Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
- G06F9/45504—Abstract machines for programme code execution, e.g. Java virtual machine [JVM], interpreters, emulators
- G06F9/45516—Runtime code conversion or optimisation
- G06F9/45525—Optimisation or modification within the same instruction set architecture, e.g. HP Dynamo
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/44—Encoding
- G06F8/443—Optimisation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/42—Syntactic analysis
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/448—Execution paradigms, e.g. implementations of programming paradigms
- G06F9/4488—Object-oriented
- G06F9/449—Object-oriented method invocation or resolution
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/455—Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
- G06F9/45504—Abstract machines for programme code execution, e.g. Java virtual machine [JVM], interpreters, emulators
- G06F9/45516—Runtime code conversion or optimisation
- G06F9/4552—Involving translation to a different instruction set architecture, e.g. just-in-time translation in a JVM
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Devices For Executing Special Programs (AREA)
- Stored Programmes (AREA)
Abstract
提供了与编译软件相关的装置和方法。计算设备可以接收软件,所述软件具有用于编译成机器语言指令的软件相关指令。计算设备可以执行类层级分析以确定软件的类层级。计算设备可以基于类层级来确定特定方法调用是否将被校验作为虚拟方法调用执行。在确定特定方法调用将被校验之后,计算设备可以确定特定机器语言指令,所述特定机器语言指令可以包括:保护机器语言指令,用于校验运行时可修改的去优化指示符以确定特定方法调用是否将作为虚拟方法调用执行,以及用于特定方法调用的方法调用机器语言指令。计算设备可以向运行时系统提供该特定机器语言指令。
Description
相关申请的交叉引用
本申请要求于2016年8月23日提交的名称为“Hybrid Deoptimization Mechanismfor Class Hierarchy Analysis”的美国专利申请第62/378,502号和于2017年1月16日提交的,名称为“Hybrid Deoptimization Mechanism for Class Hierarchy Analysis”的美国专利申请第15/407,186的优先权,所有这些专利申请的内容以引用的方式并入在本文中。
背景技术
在使用虚拟机(例如支持Java语言的虚拟机)的运行时环境中,软件可以转换成一个或多个字节码。字节码是执行一个或多个相对低级操作的指令;例如存储器加载和存储、寄存器操作和基本数值操作。然而,字节码可能无法在特定计算设备上直接执行。相反,特定计算设备的机器语言指令可以由特定计算设备直接执行,以执行一个或多个相对低级的操作。
为了弥合字节码与机器语言指令之间的差距,可以编译字节码,这包括将字节码转换成可以在特定计算设备上执行的机器语言指令。另一种用于执行字节码的技术涉及使用解释器或可在特定计算设备上执行的软件,该软件可以执行字节码指定的操作。通常,已经编译成机器语言指令的字节码可以比解释的字节码执行得更快。
一些字节码编译器可以作为提前(AOT)编译器操作,在执行机器语言指令之前,该编译器将所有字节码编译成机器语言指令;即,所有机器语言指令都是在运行时之前生成的。一些字节码编译器可以作为即时(JIT)编译器工作,在软件执行期间,根据需要将字节码编译成机器语言指令。
发明内容
一方面,提供了一种方法。计算设备接收软件,软件使用将要编译成机器语言指令的一个或多个软件相关指令表达。软件包括特定方法调用。计算设备执行软件的类层级分析,以确定与软件相关联的类层级。计算设备基于类层级确定是否要校验特定方法调用作为虚拟方法调用执行。在确定特定方法调用要被校验作为虚拟方法调用执行之后,计算设备确定一个或多个特定机器语言指令。一个或多个特定机器语言指令包括:一个或多个保护机器语言指令,用于执行去优化指示符的校验,以确定特定方法调用是否将作为虚拟方法调用来执行,其中去优化指示符在运行时是可修改的;以及用于特定方法调用的一个或多个方法调用机器语言指令。计算设备向该计算设备的运行时系统提供一个或多个特定机器语言指令。
在另一方面,提供了一种计算设备。计算设备包括一个或多个处理器;以及数据存储装置,其至少包括存储在其上的计算机可执行指令,所述计算机可执行指令在由一个或多个处理器执行时,使得计算设备执行功能。这些功能包括:接收软件,软件使用将要编译成机器语言指令的一个或多个软件相关指令表达,其中该软件包括特定方法调用;执行软件的类层级分析以确定与软件相关联的类层级;基于类层级,确定特定方法调用是否要被校验作为虚拟方法调用执行;在确定特定方法调用要被校验作为虚拟方法调用执行之后,确定一个或多个特定机器语言指令,一个或多个特定机器语言指令包括一个或多个保护机器语言指令以及用于特定方法调用的一个或多个方法调用机器语言指令,一个或多个保护机器语言指令用于执行去优化指示符的校验以确定特定方法调用是否将作为虚拟方法调用执行,其中去优化指示符在运行时是可修改的;以及向运行时系统提供一个或多个特定机器语言指令。
在另一方面,提供了一种非暂时性计算机可读介质。非暂时性计算机可读介质上存储有指令,所述指令在由计算设备的一个或多个处理器执行时,使得计算设备执行功能。这些功能包括:接收软件,软件使用将被编译成机器语言指令的一个或多个软件相关指令表达,其中该软件包括特定方法调用;执行软件的类层级分析以确定与软件相关联的类层级;基于类层级,确定所述特定方法调用是否要被校验作为虚拟方法调用执行;在确定特定方法调用要被校验作为虚拟方法调用执行之后,确定一个或多个特定机器语言指令,一个或多个特定机器语言指令包括一个或多个保护机器语言指令以及用于特定方法调用的一个或多个方法调用机器语言指令,一个或多个保护机器语言指令用于执行去优化指示符的校验以确定特定方法调用是否将作为虚拟方法调用执行,其中去优化指示符在运行时是可修改的;以及向运行时系统提供一个或多个特定机器语言指令。
在另一方面,提供了一种设备。该设备包括:用于接收软件的装置,软件使用将要编译成机器语言指令的一个或多个软件相关指令表达,其中该软件包括特定方法调用;用于执行软件的类层级分析以确定与软件相关联的类层级的机构;用于基于类层级确定特定方法调用是否要被校验作为虚拟方法调用执行的机构;用于在确定特定方法调用要被校验作为虚拟方法调用执行之后,确定一个或多个特定机器语言指令的装置,机器语言指令包括一个或多个保护机器语言指令以及用于特定方法调用的一个或多个方法调用机器语言指令,一个或多个保护机器语言指令用于执行去优化指示符的校验,以确定特定方法调用是否将作为虚拟方法调用执行,其中去优化指示符在运行时是可修改的;以及用于向用于运行时执行的装置提供一个或多个特定机器语言指令的装置。
在另一方面,提供了一种系统:该系统包括第一计算设备和第二计算设备。第一计算设备包括一个或多个第一处理器和第一数据存储,第一数据存储至少包括存储在其上的计算机可执行指令,所述计算机可执行指令在由一个或多个第一处理器执行时,使得第一计算设备执行第一功能。第一功能包括:发送使用一个或多个软件相关指令表达的第一软件。第二计算设备包括一个或多个第二处理器和第二数据存储,第二数据存储至少包括存储在其上的计算机可执行指令,所述计算机可执行指令在由一个或多个第二处理器执行时,使得第二计算设备执行第二功能。第二功能包括:接收软件,软件使用将被编译成包括第一软件的机器语言指令的一个或多个软件相关指令表达,其中该软件包括特定方法调用;执行软件的类层级分析,以确定与软件相关联的类层级;基于类层级,确定特定方法调用是否要被校验作为虚拟方法调用执行;在确定特定方法调用将被校验作为虚拟方法调用执行之后,确定一个或多个特定机器语言指令,一个或多个特定机器语言指令包括一个或多个保护机器语言指令以及用于特定方法调用的一个或多个方法调用机器语言指令,一个或多个保护机器语言指令用于进行去优化指示符的校验以确定特定方法调用是否将作为虚拟方法调用执行,其中去优化指示符在运行时是可修改的;以及向运行时系统提供一个或多个特定机器语言指令。
前述发明内容仅仅是说明性的,并不旨在以任何方式进行限制。除了上述说明性方面、实施例和特征之外,通过参考附图和以下详细描述以及附图,进一步的方面、实施例和特征将变得显而易见。
附图说明
图1示出了根据示例实施例的涉及由计算设备运行时执行混合同步/异步去优化软件的场景。
图2A和2B示出了根据示例实施例的涉及由计算设备运行时执行用于混合同步/异步去优化和类加载的软件的场景。
图3图示出了根据示例实施例的其中计算设备生成与混合同步/异步去优化相关联的优化源软件的场景。
图4图示出了根据示例实施例的其中计算设备生成与混合同步/异步去优化相关联的优化源软件的另一场景。
图5图示出了根据示例性实施例的其中计算设备生成与混合同步/异步去优化相关联的优化源软件的又一场景。
图6A和6B图示出了根据示例性实施例其中计算设备生成与混合同步/异步去优化相关联的优化源软件的再一场景。
图7图示出了根据示例实施例其中计算设备生成与混合同步/异步去优化相关联的优化源软件的又一场景。
图8描绘了根据示例实施例的分布式计算体系结构。
图9A是根据示例实施例的示例计算设备的功能框图。
图9B描绘了根据示例实施例的被布置为基于云的服务器系统的计算集群网络。
图10是根据示例性实施例的方法的流程图。
具体实施方式
用于运行时的选择性去优化方法的技术
在由虚拟运行时系统表示为字节码的面向对象软件的执行期间,计算设备可以在从字节码生成的机器语言指令(例如由即时(JIT)编译器生成的机器语言指令)的执行与字节码的解释执行之间切换。可以在编译执行与解释执行之间切换执行的一个例子是在调试期间。一些调试器操作,例如软件的单步执行,由解释器处理。一旦调试器被唤起(invoke),以前可能已经编译过的字节码通常会被解释,因为调试器检查的软件通常会由解释器执行。如果正在调试的软件涉及一系列先前的方法调用,这些方法调用的数据可以存储在执行堆栈中。
当执行从编译代码(即,从字节码生成的机器语言指令)切换到解释代码(即,使用解释器执行的字节码)时,结果执行可以被分类为去优化执行,因为计算设备对编译代码的通常更高效执行被切换到解释器的解释代码的通常更低效的执行,因此通过生成机器语言指令实现的任何优化都因切换到解释器而丢失。
可以唤起去优化技术来确保待解释的软件处于解释器状态,该解释器状态等同于软件在执行编译机器语言指令时所处的编译代码状态。特别地,去优化技术可以修改执行堆栈以转换存储在执行堆栈中的数据,同时执行机器语言指令以适合于解释器执行。去优化技术可以在可以发生切换到解释器的一个或多个程序点记录解释器状态以及编译代码状态。当在运行时利用去优化技术时,去优化技术可以使用记录的解释器状态将编译代码状态翻译成对应的解释器状态,并且然后唤起解释器。在一些实施例中,诸如调试线程的外部线程可以通过以下强制另一线程去优化:将编译代码的入口点改变为解释器桥,挂起与编译代码相关联的所有线程,以及检查现在挂起的线程的执行堆栈。如果执行堆栈包括对要去优化的特定方法的引用,则外部线程可以改变特定方法的被调用方(例如,调用该特定方法的另一个方法)的返回程序计数器地址,以便被调用方唤起去优化技术。
去优化可以同步或异步执行。当执行软件的线程(或进程)之外的线程(或进程)被确定针对执行软件的线程(或进程)唤起去优化技术时,执行异步去优化。也就是说,异步去优化是在通常来自另一个线程的、执行编译代码的线程(或进程)上强制进行的;例如调试器线程。
当执行线程(或进程)的编译代码确定唤起去优化技术时,执行同步去优化。通常,编译代码可以显式测试与去优化相关的一个或多个条件。如果存在这些条件,编译代码可以显式调用实施同步去优化技术的软件。例如,编译器可以插入同步去优化软件。编译器可以插入用来对不容易被编译器优化的软件部分调用去优化技术的软件。然后,编译器可以对解释器处理的软件部分进行去优化,以便编译器可以更好地优化其余的软件。在此示例中,同步优化可以通过将编译代码的入口点改为解释器桥来执行。在一些示例中,软件的去优化部分可以随后用不同的和最新的假设重新编译。同步和异步去优化的其他示例也是可能的。
面向对象的软件,例如用Java、C++、Python或Ruby编写的软件,经常包括一个或多个软件对象,该软件对象包括一种或多种方法,或者执行与该对象相关联的操作的功能。例如,表示形状的对象可能有一种指示该对象形状类型的方法;例如圆形、矩形等。软件对象通常被指定为类的实例,其中类可以指定该对象的数据和方法。该类可以包括子类;例如,定义形状对象的类可以有定义三角形对象的子类。
一些方法是接口方法,这些接口方法是实现了显式定义在许多类中都是通用的接口的方法。如果方法是接口方法,则该方法可以是直接方法或虚拟方法。如这里所使用的,直接方法是不构成接口的一部分并且只有一个实现的方法,而虚拟方法是构成接口的一部分并且具有多个实现的方法。例如,由基类或具有子类的类指定的方法可以由基类及其子类中的一个或多个实现,虚拟方法也是如此。作为另一个示例,仅由一个类实现的方法是直接方法。
许多面向对象的程序都有虚拟方法调用。以下是Java方法调用的示例:
receiver.getX()
上面行的“getX()”部分可以是对名为“getX”的方法的调用。getX()方法可以是一种虚拟方法,因此可以有不同的实现,取决于“receiver”对象的类型。
为了唤起或执行类的方法,运行时系统可以检查与对象相关联的类层级以确定执行哪个特定方法。例如,假定形状类有两个子类:三角形子类和多边形子类。在这个示例中,形状类可以定义“Type”方法,该方法由形状类和三角形子类中每一个单独地实现,但不由多边形子类实现。如果为多边形子类的实例调用Type方法,则多边形子类的类层级可以指示在多边形级别不存在Type方法的实现,但是Type方法的实现存在于形状级别(即,因为形状类是多边形类的基类)。然后,可以对多边形实例执行形状级别的Type方法。但是,如果为三角形子类的实例调用Type方法,则可以检查类层级,以确定可以为三角形实例唤起Type方法在三角形级别的实现。
为了实现方法调用,运行时系统可以首先分派(dispatch)或选择用于执行的方法,然后调用或执行所分派的方法。虚/接口方法调用的规范可能涉及复杂方法解析规则的使用,通常涉及通过方法列表和遍历对应的类层级来进行迭代。
为了减少对方法解析规则的依赖并加快方法分派,运行时系统可以在每个类的基础上使用接口方法的接口方法表和/或虚拟方法的虚拟方法表(缩写为“vtable”)。vtable是表条目的可变长度表(或类似的数据结构),其中每个表条目包括虚拟方法的标识符和对于对应虚拟方法的引用,诸如与虚拟方法相关的存储器地址。类似地,接口方法表中的每个表条目包括接口方法的标识符和对于对应接口方法的引用。在一些示例中,vtable可以包括虚和直接方法二者的表条目。
vtable和/或接口表可以存储指示哪种方法实现将被用于特定类实例的信息。如果vtable用于方法调用,则这种方法调用就是虚调用或虚拟方法调用。例如,为方法调用选择特定的vtable条目可以在方法的多种实现之间进行选择,并且特定的vtable条目可以存储对特定实现的引用,诸如入口点。然而,如果避免对于非接口方法调用使用vtable,则该方法调用可以称为直接调用或直接方法调用。例如,对于一些方法调用,当只存在该方法的一种实现时,可以避免使用vtable,然后可以将该方法的入口点确定为存储该一种实现的存储器地址。在一些示例中,直接调用可能涉及避免使用接口表来调用接口方法;然后,直接调用可以具体称为直接接口调用或直接接口方法调用。
使用vtable的虚拟方法调用的示例序列如下:
compiled_code=receiver.getClass().getVTableSlot(some_index).getCompiledCode();
invoke compiled_code;
在上面的第一行中,唤起“getCompiledCode()”方法来获取在vtable中保存的引用中存储的编译代码。对于由“receiver”对象的“getClass”方法指定的类,vtable是使用“getVTableSlot”方法获得的。获得的特定编译代码基于索引“some_index”,该索引指的是由虚拟方法调用唤起的方法。也就是说,示例序列的第一行返回正在被唤起的方法的编译代码。然后,上面示例序列的第二行唤起编译代码。
与唤起直接方法相比,唤起虚拟方法的开销可能相对较高。如上面的示例序列所指示,基于vtable的虚拟方法调用可以涉及两个或更多个依赖的存储器加载操作以获得被唤起的编译代码。依赖的存储器加载可能很昂贵,尤其是在现代CPU体系结构上。
虚拟方法的去虚拟化可以加快软件执行速度。特定方法的去虚拟化可以包括对特定方法进行直接方法调用,而不是虚拟方法调用。在某些情况下,直接方法调用可以使用“内联”来实现,或者用方法的软件实现的副本来替换特定方法调用。然而,当方法的多个实现可能存在时,基于vtable的虚调用通常不能被去虚拟化。
使用类层级分析对方法去虚拟化
用于确定方法是否可以被去虚拟化的一种技术使用类层级分析(CHA)。类层级分析包括向编译器提供关于程序的类层级或继承关系集的信息,以及为类层级中的每个类定义的方法集。基于类层级分析提供的信息,编译器可以确定虚拟方法调用是否有资格去虚拟化。
例如,类层级分析可以确定虚拟方法调用实际上是否是直接调用。例如,假定接收器对象是没有子类化的类Foo的实例。类层级分析和所得到的类层级可以指示使用接收器对象进行的所有虚拟方法调用都是直接调用。作为另一个示例,假定虚拟方法调用被写为“receiver.getX()”,其中“receiver”是已经被子类化的类Foo的实例,但是没有Foo的子类实现“getX()”方法。然后,类层级分析和所得到的类层级可以指示receiver.getX()是对类Foo中方法getX()的实现的直接调用。在确定虚拟方法调用实际上是直接调用之后,虚拟方法调用可以被去虚拟化成直接调用。
通过检查软件中可能被编译的所有类并确定哪些虚调用实际上是直接调用,可以静态地实现类层级分析。一些静态类层级分析可能不正确;因为在实现静态类层级分析时,一些软件可能不可用。软件不可用可能是由于动态类加载,这涉及添加一个或多个软件类以在运行时期间执行。动态加载的类可能不是静态类层级分析的一部分,因此静态类层级分析可能会错过动态加载的类。
在一些实施例中,类层级分析可以在运行时动态执行,以确定表示加载到运行时系统中的所有类的动态类层级分析。加载新类时,可以更新动态类层级分析。在一些实施例中,使用静态和动态类层级分析二者。例如,最初可以实现软件的静态类层级分析,可能是在软件被编译成字节码(或其等同物)的编译步骤期间进行。然后,可以在软件执行期间实现一次或多次动态类层级分析,以更新初始静态类层级分析。
用于使用运行时去优化纠正对方法去虚拟化的技术
在一些示例中,类层级分析可以在确定是否将虚调用去虚拟化方面做出假设。在一些示例中,这些假设可能过于保守或者过于激进。如果假设过于激进,则导致的软件执行可能不正确;例如,可能执行对方法去虚拟化的错误实现。如果这些假设过于保守,运行时性能可能会因为执行多于必要的虚调用而受到影响。
类层级分析所做的一些假设在运行时被违反。例如,只要方法只有一个实现(即该方法不被子类覆盖),类层级分析就可以利用加载类的运行时配置文件来对虚调用进行去虚拟化。然而,如果在运行时违反了方法只有一个实现的假设,例如由于类加载,则基于该假设生成的方法的编译代码可能无效,因此无效方法的方法调用可能必须由解释器执行。
用于纠正在对方法调用去虚拟化中所做假设的一种技术使用异步去优化。在这种技术中,异步去优化可以:(1)修补被调用方的返回程序计数器以从执行堆栈中移除编译的方法堆栈帧/激活记录,(2)用对应的解释器帧替换移除的堆栈帧/激活记录,以及(3)使用解释器帧开始解释器执行。
然而,使用异步去优化来纠正在对方法调用去虚拟化中做出的假设可能有缺点。在许多示例中,异步去优化可以在线程挂起点触发,导致线程挂起点成为去优化点,由于在线程挂起点维持从编译代码状态到解释器状态的信息映射,导致挂起线程的额外开销。另一个缺点是,在编译代码中应该被指示为无用(或未使用)的一些值可能在去优化点被指示为保持在用(或使用)。保持在用的不必要的标记值可能会使用多于必要的寄存器和/或生成数据从寄存器到存储器的不必要的移动(即,不必要的寄存器溢出)。此外,每个去优化点可以防止某些类型的代码移动。
使用异步去优化的另一个缺点可能涉及运行时去优化软件的复杂性,该软件通过检查堆栈和修补解释器的返回程序计数器值来建立解释器使用的执行堆栈。运行时去优化软件必须在原本不希望被去优化的程序点上操作,诸如调用运行时的循环回边缘和编译慢路径。为了在这样的程序点上操作,运行时去优化软件可以管理修补的返回程序计数器和真实返回程序计数器的映射,以便正确地更新堆栈。管理映射会增加运行时去优化软件的复杂性。在解释器应该重新执行部分执行的字节码的情况下,异步去优化可能特别复杂;例如,当字节码涉及运行时调用的使用时。此外,支持异步去优化会增加其他运行时软件的复杂性,诸如异常处理软件和/或修补返回程序计数器的其他软件;例如方法跟踪软件。
用于纠正对方法调用去虚拟化中所做的假设的另一种技术可以依赖于同步去优化。同步去优化技术可以包括插入和使用一个或多个“保护(guard)”或显式校验来确定编译代码是有效的还是无效的。如果保护指示方法的编译代码无效,那么可以通过去优化来纠正在对方法调用去虚拟化中做出的假设。如果保护指示方法的编译代码是有效的,那么可以维持在对方法调用去虚拟化中所做的假设。保护的示例伪代码如下表1所示。
表1
可以测试标志变量,它可以是布尔变量或其他数据,以确定当前执行的编译代码是否仍然有效。通常,标志变量的值设置在编译代码的头部中。然而,可能无法在运行时期间改变设置在编译代码头部中的标志,因为编译代码的头部可以存储在存储器的只读代码部分中。此外,获得测试有效性的标志需要花费一些费用——至少一次存储器加载。
这里描述了一种混合方案,用于纠正在利用同步和异步去优化二者方面的对方法调用去虚拟化中做出的假设。对于进行去虚拟化的虚调用的每个编译方法,可以为该方法定义运行时可修改的去优化指示符(即,存储在存储器的读写部分中)。在本文的示例中,去优化指示符由“should_deoptimize”变量表示。
编译代码可以在运行时为每个经去虚拟化的虚调用执行保护。这种保护的示例伪代码如下表2所示。
表2
上面表2中所示的保护做出的去优化指示符/should_deoptimiz变量的显式校验是同步去优化的一个方面,而表2中所示的去优化函数的运行时方面是异步去优化的方面。在一些实施例中,保护和去优化函数的运行时方面既简单又高效。
对于所使用的每种方法,相应的should_deoptimize变量的值可以被初始化为值0,表示允许对方法进行优化/去虚拟化的初始假设(即,该方法有资格进行优化/去虚拟化的假设)。在运行时期间,可以修改should_deoptimize变量的值。例如,方法的should_deoptimize变量的值可以被设置为值1(或者另一个非零值),以指示拒绝该方法的优化/去虚拟化的假设(即,该方法没有资格优化/去虚拟化的假设)。然后,对该方法的should_deoptimize变量的值的测试可以保护该方法的经去虚拟化的虚调用。
通过使用对去优化条件进行显式测试的混合同步/异步去优化技术,编译器可以控制去优化发生的程序点。控制去优化点可以减少与编译代码相关联的元数据量,释放用于无用值的寄存器,允许更多代码移动,并简化运行时的去优化,使编译代码能够更高效地执行,并减少与编译相关联的开销。通过分配寄存器来存储去优化指示符并使用这里描述的优化技术优化保护,可以最小化使用混合去优化的成本。这里描述的混合去优化技术可以用于编译器做出激进假设的其他场景,并且随后在运行时使用去优化来纠正这些激进假设。
用于运行时选择性去优化方法的示例场景
图1示出了根据示例实施例的场景100,该场景100涉及由计算设备102对混合同步/异步去优化的运行时软件执行。在场景100期间,计算设备102执行JIT编译器以从对应于源110的字节码生成机器语言指令。在其他场景下,可以使用JIT编译器以外的编译器。
然后,JIT编译器修改对应于源110的字节码和/或添加字节码以生成表示为修改后的源120的修改的字节码。JIT编译器根据修改后的字节码生成机器语言指令。在其他场景中,JIT编译器可以将对应于修改源110的附加和/或修改的机器语言指令输出到修改后的源120,而不是修改和/或添加字节码。
在JIT编译器生成表示修改后的源120的机器语言指令中的至少一些之后,计算设备102使用运行时系统软件来执行字节码和/或机器语言指令,运行时系统软件包括用于执行字节码的字节码解释器。特别地,计算设备102执行表示修改后的源120的字节码和/或机器语言指令,并在场景100期间生成关于图1中示为运行时跟踪130的已执行软件的信息。在计算设备102使用运行时系统软件来执行对应于修改后的源120的字节码和/或机器语言指令并生成运行时跟踪130之后,场景100可以结束。
表3A、3B和3C中相应地再现了图1所示的源110、修改后的源120和运行时跟踪130的重新格式化内容。
表3A
表3B
表3C
如图1和表3A所示,源110包括“class Shape”的定义,该定义包括至少一个整数——“size(大小)”和至少三种方法:“setSize(int s)”,该方法将大小整数的值设置为输入参数s的值;“getSize()”,其返回大小整数的值;和“printit()”,其打印一条消息“It’s a shape!(这是形状)”。源110还包括“class ShapeHolder”的定义,该定义包括“localShape”变量中的至少一个类Shape对象,其中localShape变量可以使用类ShapeHolder的“getShape()”方法获得。
在场景100中,对“Shape a=h1.getShape()”行中的“getShape()”方法的调用导致了对使用“a”对象变量进行的方法调用去虚拟化的类层级分析,因为getShape()方法可能返回类Shape的对象或Shape类子类的对象。类层级分析可以确定源110的“a”对象的实际类型、对应的方法实现以及方法调用的可能的去虚拟化。源110示出了使用“a”对象对类Shape的方法setSize和getSize中每一个的调用——可以通过使用去优化指示符校验这些方法调用以作为虚拟方法调用执行。在一些实施例中,作为虚拟方法调用执行的方法调用可以由计算设备102的运行时系统的字节码解释器来执行。
图1和表3B示出了源110在被更新以实现混合同步/异步去优化技术之后的修改后的源120。修改后的源120图示出了JIT编译器对源110所做的修改。在场景100中,对类Shape实现类层级分析,作为如上所讨论的行“Shape a=h1.getShape()”的执行的一部分。类层级分析导致should_deoptimize变量用于类Shape相关的保护。
在修改后的源120中,在上述用于类Shape的两种方法调用中的每一种之前,插入了用于校验表示为should_deoptimize变量的去优化指示符的保护。特别地,修改后的源120包括:在源110和修改后的源120中所示的Shape.setSize()和Shape.getSize()方法调用之前使用的类Shape的去优化指示符的“ShouldDeoptShape”变量。在场景100中,JIT编译器在即将执行程序前(也就是说,刚好及时)插入在修改后的源120中所示的保护的字节码和/或机器语言指令。
如果校验方法调用的去优化指示符的值指示将发生去优化,则如修改后的源120中的“deopt()”函数调用所示,异步去优化软件可以用于使方法调用去优化。如果方法调用没有被去优化,那么可以执行去虚拟化的方法调用,如修改后的源120所示。例如,修改后的源120示出在“guard for setSize()(用于setSize()的保护)”之后执行用于“a.SetSize(4)”的“devirtualized call(去虚拟化调用)”;也就是说,执行setSize方法的去虚拟化调用(例如,直接方法调用)。
图1和表3C示出运行时跟踪130,其指示计算设备102在场景100期间执行对应于修改后的源120的机器语言指令时所采取的动作。运行时跟踪130以“Start main”开始,指示修改后的源120的执行开始于调用“main”函数。运行时跟踪130随后示出修改后的源120的“Shape a=h1.getShape()”行的执行结果。如上所述,在执行修改后的源120的该行期间,对类Shape执行类层级分析,导致对与类Shape相关的保护使用一个should_deoptimize变量。运行时系统分配寄存器R1来存储SideDeoptShape变量的值,以用作去优化指示符/should_deoptimize变量,并将ShouldDeoptShape变量和对应的寄存器R1二者初始化为0。
如运行时跟踪130和表3C所示,运行时系统执行类Shape的setSize方法的保护。运行时跟踪130示出了使用“If(R1)-fails”指示来执行setSize方法的保护的结果,因为寄存器R1存储了ShouldDeoptShape变量的值。然后,由于寄存器R1等于0,setSize方法的保护失败。当setSize方法的保护失败时,将执行经去虚拟化的调用“a.setSize(4)”,该调用将类Shape实例“a”中的大小整数设置为等于4。
场景100继续,运行时系统执行类Shape的getSize方法的保护。运行时跟踪130示出了用“If(R1)-fails”指示来执行getSize方法的保护的结果,因为寄存器R1存储ShouldDeoptShape变量的值。然后,由于寄存器R1等于0,getSize方法的保护失败。当getSize方法的保护失败时,执行经去虚拟化的调用“a.getSize”,编译器使用的临时变量“tmp”被设置为经去虚拟化的调用“a.getSize”的结果。在场景100中,“tmp”变量随后被设置为值4,这是类Shape的实例“a”中的大小整数的值。运行时系统然后执行打印功能,以导致输出“The size of a=4”,如运行时跟踪130和表3C进一步所示。在生成输出“The sizeof a=4”之后,“main”函数调用完成,如运行时跟踪130中的“Exit main”语句所示。一旦“main”函数调用已经完成并且运行时跟踪130被完全生成,场景100就可以完成。
类的运行时加载可以改变针对与去虚拟化相关的方法的假设。例如,假定类C的方法M最初被假设有资格进行优化/去虚拟化。在这个示例中,方法M的另一个实现是在运行时作为运行时类加载的一部分被加载,然后方法M有资格优化/去虚拟化的假设可以无效,并且因此方法M此后可以被认为无资格优化/去虚拟化。一旦方法M无资格优化/去虚拟化,就可以假设方法M此后被去优化,并且可以利用方法M的虚拟方法调用。
当由于类加载而在运行时触发去优化时,线程可以被挂起,无效方法的should_deoptimize变量的值可以被设置为1(或者另一个非零值),无效方法调用堆栈上的should_deoptimize变量的值可以被修补为1(或者另一个非零值)。一旦现在无效的方法再次被执行,当试图对该方法进行去虚拟化调用时,测试现在无效的方法的should_deoptimize变量的值的保护会触发去优化。然后,解释器可以执行对现在无效的方法的虚拟方法调用。
在一些实施例中,方法的should_deoptimize变量的值可以存储在寄存器中。然后,在这些实施例中,去虚拟化调用的保护可以涉及测试寄存器值并基于寄存器值进行分支;即利用寄存器进行测试和分支操作。如果在执行保护之前,should_deoptimize变量的值没有存储在寄存器中,可以将should_deoptimize变量的值加载到寄存器中,并且可以使用现在存储should_deoptimize变量的值的寄存器来执行测试和分支操作。将值加载到寄存器中并执行后续的测试和分支操作可能比基于vtable的虚调用快得多,因为测试和分支操作可能在使用分支预测的CPU体系结构上非常高效。
在某些场景中,可以支持类卸载。然后,如果具有方法M的实现的类被卸载,并且将方法M的实现总数减少到一个,则可以改变方法M将被去优化的假设。然而,本公开的其余部分假设不支持类卸载——因此,一旦假设某个方法被去优化,那么该假设将适用于程序执行的其余部分。
图2A和2B示出了根据示例实施例的涉及由计算设备102的混合同步/异步去优化软件运行时执行的场景200。在场景200期间,计算设备102执行JIT编译器以从对应于源210和212的字节码生成机器语言指令。在其他场景下,可以使用JIT编译器以外的编译器。
然后,JIT编译器修改对应于源210和212的字节码和/或添加字节码以生成表示为修改后的源20的修改的字节码。JIT编译器根据修改后的字节码生成机器语言指令。在其他场景下,JIT编译器可以将对应于修改源210和212的附加和/或修改的机器语言指令输出到修改后的源220,而不是修改和/或添加字节码。
在场景200中,源210存储在一个名为“loadfile”的文件中,源212存储在一个名为“mainfile”的单独文件中。在场景200的初始阶段,仅表示“mainfile”文件中的软件的字节码被加载到计算设备102中,因此JIT编译器最初仅从由源212表示的字节码生成机器语言指令。在计算设备102执行这些机器语言指令中的一些指令之后,来自“loadfile”文件的软件被引入或加载到计算设备102中。在加载“loadfile”文件之后,JIT编译器从由源210和源212表示的字节码生成机器语言指令。
在JIT编译器生成表示修改后的源20的机器语言指令中的至少一些之后,计算设备102使用运行时系统软件来执行字节码和/或机器语言指令,该运行时系统软件包括用于执行字节码的字节码解释器。特别地,计算设备102执行表示修改后的源220的字节码和机器语言指令,并在场景200期间生成关于图2B中示出为运行时跟踪230的已执行软件的信息。在计算设备102使用运行时系统软件来执行对应于修改后的源220的字节码和/或机器语言指令并生成运行时跟踪230之后,场景200可以结束。
表4A、4B、4C和4D相应地再现了图2A和2B所示的源210、源212、修改后的源20和优化源230的重新格式化内容。具体地,图2A示出了源210、源212和修改后的源220,图2B示出了修改后的源220和已优化的源230的副本。
表4A
表4B
表4C
表4D
如图2A和表4A所示,源210示出了“loadfile”文件包括“class Circle”的定义,该定义“extends(扩展)”“Class Shape”(即,是“Class Shape”的子类)。类Circle至少包括一种方法:“printit()”,它会打印一条消息“It’s a circle!(这是一个圆)”。源210还包括“class CircleHolder”的定义,该定义将Circle类的对象存储在“localCircle”变量中,其中localCircle变量可以使用CircleHolder类的“getCircle()”方法获得。
如图2A和表4B所示,源212示出“mainfile”文件包括类Shape和ShapeHolder的定义以及主函数。类Shape至少包括一个方法:“printit()”,它会打印一条消息“It’s ashape!(这是一个形状)”。源212还包括“class ShapeHolder”的定义,该定义将类Shape的对象存储在“localShape”变量中,其中localShape变量可以使用类ShapeHolder的“getShape()”方法获得。将源210和212放在一起,类Circle是类Shape的子类,它修改Shape方法的printit()方法。因此,当类Circle在运行时被使用时,存在两个printit()方法的实现可用——一个在类Shape中的实现,一个在类Circle中的实现。
在场景200中,对“Shape a=h1.getShape()”行中的“getShape()”方法的调用导致了对使用“a”对象变量进行的方法调用去虚拟化的类层级分析,因为getShape()方法可能返回类Shape的对象或类Shape子类的对象。因此,初始类层级分析可用于确定源110的“a”对象的实际类型、对应的方法实现以及方法调用的可能的去虚拟化。
稍后在主函数中,对“some_condition”变量进行了测试。如果测试成功,“CircleHolder h2;”行被执行——该行直接指类CircleHolder,间接指类Circle。由于“some_condition”可能不总是真,类Circle和类CircleHolder可能未加载到计算设备102的运行时系统内,除非执行“CircleHolder h2;”行。特别是对于场景200,loadfile文件中的类CircleHolder和类Circle之前没有被加载到计算设备102的运行时系统中,因此执行“CircleHolder h2;”行导致类CircleHolder和类Circle被加载到运行时系统中;例如,通过遵循类路径找到定义类CircleHolder和类Circle的loadfile文件,然后将loadfile的内容加载到运行时系统中。
行“Shape c=h2.getCircle();”在源212的主函数中,将“c”变量定义为类Shape的实例,并将“c”变量设置为等于类CircleHolder的getCircle方法的结果。因为getCircle方法返回类Circle的对象,“c”变量是类Circle的对象(也是类Shape的对象)。
加载类CircleHolder和类Circle后,可以使用动态层级分析更新初始类层级分析,以包括新加载的类。源212的“main”函数包括对类Shape和类Circle的三个方法调用,这些调用可以被校验使用去优化指示符作为虚拟方法调用来执行:第一方法调用是将类Shape的printit实现为“a.printit()”,第二方法调用是将类Circle的printit实现为“c.printit()”,第三方法调用是将类Shape的printit实现为“a.printit()”。在一些实施例中,作为虚拟方法调用执行的方法调用可以由计算设备102的运行时系统的字节码解释器执行。
图2A、图2B和表4C示出了在源212被更新以执行混合同步/异步去优化技术之后的修改后的源20。修改后的源220图示出了JIT编译器对源210和212所做的修改。在场景200中,对类Shape执行初始类层级分析,作为如上所讨论的行“Shape a=h1.getShape()”的执行的一部分。初始类层级分析导致第一should_deoptimize变量用于类Shape相关的保护。当执行“CircleHolder h2;”行时,可以动态更新类层级分析,以包括类Circle,如上所述。更新的类层级分析可以导致使用类Circle相关的保护的第二should_deoptimize变量和/或更新与类Shape相关的should_deoptimize变量的值。
在修改后的源220中,在上述关于类Shape和Circle的三个方法调用中的每一个之前,插入了用于校验表示为should_deoptimize变量的去优化指示符的保护。特别地,修改后的源220包括:用于源212中所示的两个“a.printit()”方法调用之前使用的Shape类的去优化指示符的“ShouldDeoptShape”变量,以及用于源212中所示的“c.printit()”方法调用之前使用的类Circle的去优化指示符的“ShouldDeoptCircle”变量。在场景200中,JIT编译器在即将程序执行之前插入在修改后的源代码220中所示的保护的字节码和/或机器语言指令。
如果校验方法调用的去优化指示符的值指示将发生去优化,则如修改后的源220中的“deopt()”函数调用所示,异步去优化软件可以用于使方法调用去优化。如果方法调用未被去优化,则如修改后的源220所示,执行去虚拟化的方法调用。例如,修改后的源220示出,在执行了保护类Shape的第一“if(ShouldDeoptShape)”语句之后,“a.printit()”方法被执行为“devirtualized call”。
图2B和表4D示出运行时跟踪230,其指示计算设备102在场景200期间执行对应于修改后的源220的机器语言指令和/或字节码时所采取的动作。运行时跟踪230以“Startmain”开始,表示修改后的源220的执行开始于调用“main”函数。
运行时跟踪230随后示出修改后的源220的“Shape a=h1.getShape()”行的执行结果。如上所述,在执行修改后的源20的该行期间,仅针对类Shape执行初始类层级分析,导致一个should_deoptimize变量用于类Shape相关保护。类层级分析最初只包括类Shape,因为类Circle在“loadfile”文件中,对于初始类层级分析是不可用的。运行时系统分配寄存器R1存储ShouldDeoptShape变量的值,用作去优化指示符/should_deoptimize变量,并将ShouldDeoptShape变量和对应的寄存器R1初始化为0。
如运行时跟踪230和表4D所示,运行时系统然后执行类Shape的printit方法的保护。运行时跟踪230示出了利用“If(R1)-fails”指示来执行类Shape的printit方法的保护的结果,因为寄存器R1存储了ShouldDeoptShape变量的值。然后,由于寄存器R1等于0,类Shape的printit方法的保护失败。当类Shape的printit方法的保护失败时,执行对a.printit()的去虚拟化调用,这导致计算设备102输出“It’s a shape!”。
场景200继续运行时系统执行机器语言指令来进行测试“if(some_condition)”。在该场景中,“some_condition”变量被设置为非零值,因此“if(some_condition)”测试成功,如运行时跟踪230所示。在执行“if(some_condition)”测试之前,类CircleHolder和类Circle没有被加载到计算设备102的运行时系统中。
场景200继续运行时系统执行修改后的源220的“CircleHolder h2;”行的机器语言指令。机器语言指令使用classpath来定位文件“loadfile”中类CircleHolder和类Circle的实现,并尝试将软件从loadfile(即,源210)加载到计算设备102中。在场景200中,文件loadfile中的软件被成功加载到计算设备102的运行时系统中。计算设备102随后更新初始类层级分析,以包括新加载的类CircleHolder和类Circle,导致一个或多个should_deoptimize变量用于类Circle相关的保护。
此外,更新了类Shape的should_deoptimize变量的值,以指示类Shape方法现在要被去优化,因为与类Shape相关联的printit方法现在有两个实现。也就是说,有一个被提供给类Shape的printit方法的实现和一个被提供给类Circle的printit方法的实现。为了记录类Shape方法调用现在将被去优化,ShouldDeoptShape变量和对应的寄存器R1都被设置为1,如运行时跟踪230和表4D中的“Set R1=1”指示所示。
计算设备102的运行时系统还分配寄存器R2来存储新的should_deoptimize变量ShouldDeoptCircle的值。然后,运行时系统将should_deoptimize变量和对应的寄存器R2初始化为1,因为类Circle中的方法有多个实现;例如printit方法。这样,类Circle方法调用将被去优化,如运行时跟踪230和表4D中的“Set R2=1”指示所示。
场景200继续定义变量“h2”作为类CircleHolder的实例。计算设备102的运行时系统随后执行修改后的源220的行“Shape c=h2.getCircle();”的机器语言指令,其将“c”变量定义为类Shape的实例,并将“c”变量赋予给getCircle方法的结果,导致“c”变量被设置为类Circle的实例。
如运行时跟踪230和表4D所示,运行时系统随后执行类Circle的printit方法的保护。运行时跟踪230示出了利用“If(R2)-succeeds”指示来执行类Circle的printit方法的保护的结果,因为寄存器R2存储了ShouldDeoptCircle变量的值。然后,由于寄存器R2等于1,类Circle的printit方法的保护成功。随着对类Circle的printit方法的保护成功,对类Circle的printit方法的虚拟化调用由计算设备102的解释器执行,如运行时跟踪230和表4D中的“Call deopt()/use interpreter for c.printit()”指示所示。然后,类Circle的printit方法的执行使得计算设备102输出“It’s a circle!”。
在解释器执行类Circle的printit方法之后,场景200继续运行时系统执行类Shape的printit方法的保护。运行时跟踪230示出了利用“If(R1)-succeeds”指示来执行类Shape的printit方法的保护的结果,因为寄存器R1存储了ShouldDeoptShape变量的值。然后,由于寄存器R1等于1,类Shape的printit方法的保护成功。随着类Shape的printit方法的保护成功,类Shape的printit方法的虚拟化调用由计算设备102的解释器执行,如运行时跟踪230和表4D中的“Call deopt()/use interpreter for a.printit()”指示所示。
在场景200中加载loadfile之前,类Shape的printit方法的保护成功了,但是正如上面段落中所指出的,类Shape的printit方法的保护在加载loadfile后失败了。因此,printit方法的保护能够在运行时纠正在初始类层级分析期间做出的错误假设(即,printit方法只有一个实现)。
然后,类Shape的printit方法的执行使得计算设备102输出“It’s a shape!”。在生成输出“It’s a shape!”后,如运行时跟踪230中的“Exit main”语句所示,“main”函数调用完成。一旦“main”函数调用已经完成并且运行时跟踪230被完全生成,场景200就可以完成。
在其他场景下,一旦执行转移到解释器,执行就不会返回到编译代码。在这些场景下,一旦解释器已经被唤起,保护可能不会被插入源代码和/或执行。
对去优化保护进行优化的示例场景
使用这里描述的优化技术,可以提高混合同步/异步去优化的性能,该优化技术消除了should_deoptimize变量测试值的一些保护,同时保持程序正确性。在场景300、400、500、600和700中,以及在下面的讨论中,变量“receiver”是具有一个或多个方法的类“A”实例,例如“getX()”和“getY()”方法。
当接收器变量作为参数传递时,第一优化技术可以消除保护;例如涉及方法、函数或过程。当输入编译代码时,在那个点使用类层级分析做出的所有去虚拟化假设仍然为真。否则,编译代码应该已经失效,并且应该设置方法的入口点来唤起解释器。例如,当接收器变量作为参数传递给方法M1时,当输入方法M1的编译代码时,receiver.getX()仍然解析为A.getX()。因此,在方法M1的主体内,对于接收器参数的去虚拟化的虚调用的保护是不必要的。
图3图示出了根据示例实施例的场景300,其中计算设备102确定与混合同步/异步去优化相关联的已优化的源330。在场景300期间,计算设备102执行JIT编译器以从对应于源310的字节码生成机器语言指令。在其他场景下,可以使用JIT编译器以外的编译器。
然后,JIT编译器修改对应于源310的字节码和/或添加字节码以生成被表示为已优化的源330的修改的字节码,其中已优化的源330还表示已经使用第一优化技术优化的修改后的源320。JIT编译器根据修改后的字节码生成机器语言指令。在其他场景下,JIT编译器可以将对应于修改源310和/或修改后的源320的附加和/或修改的机器语言指令输出为已优化的源330,而不是修改和/或添加字节码。
在JIT编译器为已优化的源330生成机器语言指令中的至少一些之后,计算设备102使用运行时系统软件来执行字节码和/或机器语言指令,运行时系统软件包括用于执行字节码的字节码解释器。特别地,计算设备102在场景300期间执行表示已优化的源330的字节码和机器语言指令。在计算设备102使用运行时系统软件来执行对应于已优化的源330的字节码和/或机器语言指令之后,场景300可以结束。
表5A、5B和5C相应地再现了图3所示的源310、修改后的源320和已优化的源330的重新格式化内容。
表5A
表5B
表5C
如图3和表5A所示,源310示出,“class A”包括至少两个整数变量——“X”和“Y”——以及至少两个方法:“getX()”,返回X整数变量的值;“getY()”,返回Y整数变量的值。源310还包括“class AHolder”的定义,该定义在“localA”变量中至少包括类A的对象,其中localA变量可以使用AHolder类的“getA()”方法获得。
在场景300中,对“A receiver=h1.getA()”行中的“getA()”方法的调用导致了对使用“receiver”对象变量进行的方法调用去虚拟化的类层级分析,因为getA()方法可能返回类A对象或类A子类对象。类层级分析可以确定源310的“receiver”对象的实际类型、对应的方法实现以及方法调用的可能去虚拟化。源310示出了对“printXY”函数中类A的方法“getX()”和“getY()”中每一个的调用——这些方法调用可以使用去优化指示符被校验以作为虚拟方法调用来执行。在一些实施例中,作为虚拟方法调用执行的方法调用可以由计算设备102的运行时系统的字节码解释器执行。
图3和表5B示出了源310被更新以执行混合同步/异步去优化技术之后的修改后的源320。修改后的源320图示出了JIT编译器对源310所做的修改。在场景300中,如上所述,作为行“A receiver=h1.getA()”的执行的一部分,对类A执行类层级分析。类层级分析导致使用should_deoptimize变量用于A类相关的保护。
在修改后的源320中,在利用“receiver”对象作为变量的printXY函数调用之前,以及在上述printXY函数内的两个方法调用中的每一个之前,插入了用于校验表示为should_deoptimize变量的去优化指示符的保护。特别地,修改后的源320包括用于在源310和修改后的源130中所示的printXY函数调用和A.getX()和A.getY()方法调用之前使用的类A的去优化指示符的“ShouldDeoptA”变量。在场景100中,JIT编译器在即将进行程序执行之前插入字节码和/或机器语言指令,用于修改后的源代码320中所示的保护。
如果校验方法调用的should_deoptimize变量的值指示将发生去优化,则如修改后的源320中的“deopt()”函数调用所示,异步去优化的软件可以用于使方法调用去优化。如果方法调用没有被去优化,那么可以执行去虚拟化的方法调用,如修改后的源320所示。例如,修改后的源320示出,在“guard for getX()”之后,将“tmp1”变量赋予给“in.getX()”中的“devirtualized call”的结果;也就是说,对类A的getX()方法的去虚拟化调用。
图3和表5C示出了已优化的源330,其是在使用第一优化技术被进一步修改(优化)以减少修改后的源320中的保护的数目之后的修改后的源320。特别是,printXY函数中getX()和getY()方法调用的保护已经从已优化的源330中消除,因为getX()和getY()方法调用在执行中是在“guard for parameter”之后进行的,“guard for parameter”是在主函数中printXY函数调用之前。
由于printXY函数调用已经有了一个保护,该保护可以确保printXY函数主体内的所有A实例都有资格虚拟化(或者在其他场景下,没有资格虚拟化),因此唤起getX()和getY()方法将解析为对A.getX()和A.getY()的相应直接方法调用。在其他场景下,printXY函数调用之前的保护的if语句可能会采用真分支(即ShouldDeoptA为真),然后会出现去优化。因此,printXY函数调用之前的保护确保了printXY函数主体内类A的所有去虚拟化假设仍然正确,因为假设的任何变化都将把一个或多个should_deoptimize变量设置为非零值。因此,如果printXY函数调用之前的保护允许去虚拟化,所有去虚拟化的虚调用都应该解析为它们对应的直接调用。因为接收器实例是在执行printXY函数之前定义的,所以在printXY函数主体内涉及类A“in”参数的任何去虚拟化的方法调用也应该解析为它们对应的直接调用,因为“in”参数的类型在最初根据静态单一赋值属性赋值后不应该改变。
只要在类实例定义(例如,作为类A实例的接收器变量的定义)与实际对方法调用去虚拟化之间的任何路径中都存在保护,第二优化技术就可以通过消除特定去虚拟化的方法调用的保护来执行。
图4图示出了根据示例实施例的场景400,其中计算设备102确定与混合同步/异步去优化相关联的已优化的源430。在场景400期间,计算设备102执行JIT编译器以从对应于源410的字节码生成机器语言指令。在其他场景下,可以使用JIT编译器以外的编译器。
然后,JIT编译器修改对应于源410的字节码和/或添加字节码以生成被表示为已优化的源430的修改的字节码,其中已优化的源430还表示已使用第二优化技术优化的修改后的源420。JIT编译器根据修改后的字节码生成机器语言指令。在其他场景下,JIT编译器可以将对应于修改源410和/或修改后的源420的附加和/或修改的机器语言指令输出为已优化的源430,而不修改和/或添加字节码。
在JIT编译器为已优化的源430生成机器语言指令中的至少一些之后,计算设备102使用运行时系统软件来执行字节码和/或机器语言指令,运行时系统软件包括用于执行字节码的字节码解释器。特别地,计算设备102在场景400期间执行表示已优化的源430的字节码和机器语言指令。在计算设备102使用运行时系统软件来执行对应于已优化的源430的字节码和/或机器语言指令之后,场景400可以结束。
表6A、6B和6C中相应地再现了图4所示的源410、修改后的源420和已优化的源430的重新格式化内容。
表6A
表6B
表6C
如图4和表6A所示,源410示出,“class A”包括至少两个整数变量——“X”和“Y”——以及至少两个方法:“getX()”,返回X整数变量的值,和“getY()”,返回Y整数变量的值。源410还包括“class AHolder”的定义,“class AHolder”在“localA”变量中至少包括类A的对象,其中localA变量可以使用类AHolder的“getA()”方法获得。
在场景400中,对“A receiver=h1.getA()”行中的“getA()”方法的调用导致了对使用“receiver”对象变量进行的方法调用去虚拟化的类层级分析,因为getA()方法可能返回类A对象或类A子类的对象。类层级分析可以确定源410的“receiver”对象的实际类型、对应的方法实现以及方法调用的可能去虚拟化。源410示出了对“main”函数中类A的方法“getX()”和“getY()”中每一个的调用——这些方法调用可以使用去优化指示符校验作为虚拟方法调用来执行。在一些实施例中,作为虚拟方法调用执行的方法调用可以由计算设备102的运行时系统的字节码解释器执行。
图4和表6B示出了在源410被更新以执行混合同步/异步去优化技术之后的修改后的源420。在场景400中,如上所述,作为行“A receiver=h1.getA()”的执行的一部分,对类A进行类层级分析。类层级分析导致使用should_deoptimize变量用于类A相关的保护。
在修改后的源420中,在上述类A的getX()和getY()方法调用之前,插入了用于校验表示为should_deoptimize变量的去优化指示符的保护。特别地,修改后的源420包括用于在getX()和getY()方法调用之前使用的类A的去优化指示符的“ShouldDeoptA”变量。
如果校验方法调用的should_deoptimize变量的值指示将发生去优化,则如修改后的源420中的“deopt()”函数调用所示,异步去优化软件可以用于使方法调用去优化。如果方法调用未被去优化,则如修改后的源420所示,执行去优化的方法调用。例如,修改后的源420示出,在“guard for getX()”之后,“localX”变量被赋予给“receiver.getX()”的“devirtualized call”的结果;也就是说,对类A的getX()方法的去虚拟化调用。
图4和表6C示出了已优化的源430,其是在使用第二优化技术被进一步修改(优化)以减少修改后的源420中的保护的数目之后的修改后的源420。特别地,主函数中getY()方法调用的保护已经从已优化的源430中消除,因为getY()方法调用在执行中是在getX()方法调用的保护之后进行。
由于getX()方法调用已经有了保护,该保护可以确保类A的所有实例在该点都有资格虚拟化(或者在其它场景下,没有资格虚拟化),因此稍后对getY()方法的唤起将解析为对A.getY()的直接方法调用。在其他场景下,getX()方法调用的保护的if语句可以采用真分支(即,ShouldDeoptA为真),然后将进行去优化。因此,getX()方法调用的保护确保了getX()方法调用后A类的所有去优化假设仍然正确,因为假设的任何改变都会将一个或多个should_deoptimize变量设置为非零值。因此,如果getX()方法调用的保护允许去虚拟化,那么所有去虚拟化的虚调用都应该解析为它们对应的直接调用。由于接收器实例是在getX()方法调用的保护被执行之前定义的,任何涉及接收器实例的去虚拟化的方法调用也应该解析为它们对应的直接调用,因为接收器实例的类型在最初根据静态单个赋值属性赋值后不应该改变。
在一些示例中,第二优化技术可以涉及在软件块中的类的任何方法被第一次唤起之前使用主导保护,以确保在类实例的定义与该类的去虚拟化的方法调用之间的任何路径中都有保护。在其他示例中,第二优化技术可以作为另一编译器优化技术例如GlobalValue Numbering的一部分来执行。
如果类实例是在循环之前定义的,第三优化技术可以包括将循环主体内部的保护移动到循环主体外。第二优化技术和第三优化技术基于相同的原理——也就是说,保护不仅可以被消除,而且可以沿着主导的树路径一直移动到它的定义。向上移动保护可以很容易地背负一些标准的代码移动,这些标准的代码移动将循环不变量提升出循环。在一些示例中,第三优化技术可以作为另一个优化技术的一部分来执行,所述另一优化技术诸如将循环不变量移出循环主体的代码移动。
图5图示出了根据示例实施例的场景500,其中计算设备102确定与混合同步/异步去优化相关联的已优化的源530。在场景500期间,计算设备102执行JIT编译器以从对应于源510的字节码生成机器语言指令。在其他场景下,可以使用JIT编译器以外的编译器。
然后,JIT编译器修改对应于源510的字节码和/或添加字节码以生成被表示为已优化的源530的修改的字节码,其中已优化的源530还表示已使用第三优化技术优化的修改后的源520。JIT编译器根据修改后的字节码生成机器语言指令。在其他场景下,JIT编译器可以将对应于修改源510和/或修改后源520的附加和/或修改的机器语言指令输出为已优化的源530,而不是修改和/或添加字节码。
在JIT编译器为已优化的源530生成机器语言指令中的至少一些之后,计算设备102使用运行时系统软件来执行字节码和/或机器语言指令,运行时系统软件包括用于执行字节码的字节码解释器。特别地,计算设备102在场景500期间执行表示已优化的源530的字节码和机器语言指令。在计算设备102使用运行时系统软件来执行对应于已优化的源530的字节码和/或机器语言指令之后,场景500可以结束。
表7A、7B和7C相应地再现了图5所示的源510、修改后的源520和已优化的源530的重新格式化内容。
表7A
表7B
表7C
如图5和表7A所示,源510示出,“class A”包括至少两个整数变量——“X”和“Y”——以及至少四个方法:“setX(int inX)”,其将X整数变量的值赋予给输入参数“inX”的值;“setY(int inY)”,其将Y整数变量的值赋予给输入参数“inY”的值;“getX()”,其返回X整数变量的值;以及,“getY()”,其返回Y整数变量的值。源510还包括“class AHolder”的定义,该定义在“localA”变量中至少包括类A对象,其中localA变量可以使用类AHolder的“getA()”方法获得。
在场景500中,对“A receiver=h1.getA()”行中的“getA()”方法的调用导致了对使用“receiver”对象变量进行的方法调用去虚拟化的类层级分析,因为getA()方法可能返回类A对象或类A子类的对象。类层级分析可以确定源510的“receiver”对象的实际类型、对应的方法实现以及方法调用的可能去虚拟化。源510示出了对“main”函数中类A的方法setX()和getX()中每一个的调用——可以使用去优化指示符校验这些方法调用作为虚拟方法调用执行。在一些实施例中,作为虚拟方法调用执行的方法调用可以由计算设备102的运行时系统的字节码解释器执行。
图5和表7B示出了在源510被更新以执行混合同步/异步去优化技术之后的修改后的源520。在场景500中,如上所述,作为行“A receiver=h1.getA()”的执行的一部分,对类A执行类层级分析。类层级分析导致使用should_deoptimize变量用于类A相关的保护。
在修改后的源520中,在上述类A的setX()和getX()方法调用之前,插入了用于校验表示为should_deoptimize变量的去优化指示符的保护。特别地,修改后的源520包括在setX()和getX()方法调用之前使用的类A的去优化指示符的“ShouldDeoptA”变量。如果对方法调用的should_deoptimize变量的校验指示将发生去优化,则如修改后的源520中的“deopt()”函数调用所示,异步去优化软件可以用于使方法调用去优化。如果方法调用未被去优化,则如修改后的源520所示,执行去虚拟化的方法调用。例如,修改后的源520示出,在“guard for setX()”之后,执行了对“receiver.setX(tmp)”的“devirtualized call”,这可以是对类A的setX()方法的去虚拟化调用。
图5和表7C示出了已优化的源530,其是在使用第三优化技术被进一步修改(优化)以减少修改后的源520中的保护的数目之后的修改后的源520。特别地,修改后的源520中的循环主体内的两个方法调用的保护已经被在循环主体之前插入的已优化的源530的新保护所取代,其中循环主体中的setX()和getX()方法调用的执行在新保护之后进行。
由于循环主体的前面是保护,该保护可以确保在该点所有A实例都有资格虚拟化(或者在其它场景下,没有资格虚拟化),因此在循环主体中唤起setX()和getX()方法将解析为对A.getX()和A.getY()的相应的直接方法调用。在其他场景下,循环主体前面的保护的if语句可以采用真分支(即,ShouldDeoptA是TRUE),然后将进行去优化。因此,循环主体前面的保护确保类A的所有去虚拟化假设仍然正确,因为假设的任何变化都将把一个或多个should_deoptimize变量设置为非零值。因此,如果循环主体前面的保护允许去虚拟化,则循环主体内所有去虚拟化的所有虚调用都应该解析为它们对应的直接调用。因为接收器实例是在执行循环主体前的保护之前定义的,所以涉及循环主体中接收器实例的任何去虚拟化的方法调用也应该解析为它们对应的直接调用,因为接收器实例的类型在根据静态单个赋值属性赋值后不应该改变。
在允许代码修补的实施例中,编译器可能不必为显式校验去优化指示符的保护生成软件。编译器可以维护潜在优化点的列表。然后,使编译代码无效可能涉及修补每个潜在去优化位点的起始位置,以跳转到使指令高速缓存无效的去优化软件。在这些实施例中,线程挂起不是必需的。与消除保护相关以及在这些实施例中应用于消除潜在的去优化点的优化,即使没有明确生成保护软件,也是有益的。相反,由于每个潜在的去优化点仍然有一些相关联的开销(即慢路径软件,对应的元数据支持可以保持寄存器活动更长,防止某些类型的代码移动),减少潜在的去优化点的数目可以减少混合同步/异步去优化的开销。
第四优化技术可以包括对软件应用只使用一个去优化指示符。如果任何去虚拟化假设不正确;也就是说,如果软件应用的任何方法都没有资格去虚拟化,则可以设置保护值来拒绝所有方法的虚化。这种优化技术可以减少用于软件应用的去优化指示符的数目。在一些示例中,这里描述的优化技术中的两种或多种可以一起使用;例如,第四优化技术可以与第一优化技术、第二优化技术和/或第三优化技术的使用相结合。
图6A和6B图示出了根据示例实施例的场景600,其中计算设备102确定与混合同步/异步去优化相关联的已优化的源630。在场景600期间,计算设备102执行JIT编译器以从对应于源610的字节码生成机器语言指令。在其他场景下,可以使用JIT编译器以外的编译器。
然后,JIT编译器修改对应于源610的字节码和/或添加字节码以生成被表示为已优化的源630的修改的字节码,其中已优化的源630表示已使用第二优化技术进一步优化的已优化的源622,其中已优化的源622表示已使用根据第四优化技术的每个应用去优化指示符优化的修改后的源620,并且其中修改后的源620示出已使用每个类去优化指示符修改后的源610。JIT编译器根据修改后的字节码生成机器语言指令。在其他场景下,JIT编译器可以将对应于修改源610、修改后的源620和/或已优化的源622的附加和/或修改的机器语言指令输出为已优化的源630,而不是修改和/或添加字节码。
而在其他场景中,源610的修改可能涉及每个应用的去优化指示符,导致直接生成已优化的源622;也就是说,在这些场景下,不生成修改后的源620。
在JIT编译器为已优化的源630生成机器语言指令中的至少一些之后,计算设备102使用运行时系统软件来执行字节码和/或机器语言指令,运行时系统软件包括用于执行字节码的字节码解释器。特别地,计算设备102在场景600期间执行表示已优化的源630的字节码和机器语言指令。在计算设备102使用运行时系统软件来执行对应于已优化的源630的字节码和/或机器语言指令之后,场景600可以结束。
表8A、8B、8C和8D中相应地再现了图6所示的源610、修改后的源620、已优化的源622和已优化的源630的重新格式化内容。
表8A
表8B
表8C
表8D
如图6A和表8A所示,源610示出,“class A”包括至少一个整数变量——“X”——和至少两个方法:“setX(int inX)”,其将X整数变量的值赋予给输入参数“inX”的值;以及,“getX()”,其返回X整数变量的值。源610还示出,“class B”包括至少一个整数变量——“Y”和至少两个方法:“setY(int inY)”,该方法将Y整数变量的值赋予给输入参数“inY”的值;以及,“getY()”,其返回Y整数变量的值。源610还包括“class AHolder”的定义和“class BHolder”的定义,“class AHolder”包括“localA”变量中的至少一个类A对象,其中可以使用类AHolder的“getA()”方法获得该localA变量;并且“class BHolder”包括“localB”变量中的至少一个类B对象,其中可以使用类BHolder的“getB()”方法获得该localB变量。
在场景600中,对“A receiverA=hA.getA()”行中的“getA()”方法的调用会导致使用“receiverA”对象变量进行的方法调用去虚拟化的类层级分析,因为getA()方法可能会返回类A对象或类A子类的对象。类似地,“B receiverB=hB.getB()”行会导致使用“receiverB”对象变量进行的方法调用去虚拟化的类层级分析,因为getB()方法可能返回类B对象或类B子类的对象。
类层级分析可以确定源610的“receiverA”和“receiverB”对象的实际类型、对应的方法实现以及方法调用的可能去虚拟化。源610示出了对“main”函数中类A方法setX()和getX()中每一个以及类B方法setY()和getY()中每一个的调用——可以使用去优化指示符校验这些方法调用作为虚拟方法调用的执行。在一些实施例中,作为虚拟方法调用执行的方法调用可以由计算设备102的运行时系统的字节码解释器执行。
图6A和表8B示出了源610在被更新以执行混合同步/异步去优化技术之后的修改后的源620。在场景600中,作为行“A receiver=h1.getA()”的执行的一部分,对类A和类B执行类层级分析。类层级分析导致使用两个should_deoptimize变量:一个变量用于与类A相关的保护,一个变量用于与类B相关的保护。
在修改后的源620中,在上述的类A的setX()和getX()方法调用中每一个之前,插入了表示为should_deoptimize变量的用于校验类A的每类去优化指示符的保护,在上述的类B的setY()和getY()方法调用中每一个之前,插入了表示为should_deoptimize变量的用于校验类B的去优化指示符的保护。特别地,修改后的源620包括在setX()和getX()方法调用之前使用的类A去优化指示符的“ShouldDeoptA”变量和在setY()和getY()方法调用之前使用的类B去优化指示符的“ShouldDeoptB”变量。
如果对方法调用的should_deoptimize变量的校验指示将发生去优化,则如修改后的源620中“deopt()”函数调用所示,异步去优化软件可以用于使方法调用去优化。如果方法调用未被去优化,则如修改后的源620所示,执行去虚拟化的方法调用。例如,修改后的源620示出,在“guard for setX()”之后,执行了对“receiverA.setX(x)”的“devirtualized call”,这可以是对类A的setX()方法的去虚拟化调用。
图6B和表8C示出了已优化的源622,该已优化的源622是修改后的源620在使用第四优化技术被进一步修改(优化)以减少修改后的源620中的保护变量的数目之后的源。特别地,已优化的源622用每个应用的“ShouldDeoptALL”去优化指示符/should_deoptimize变量替换在修改后的源620中发现的每个类的“ShouldDeoptA”和“ShouldDeoptB”去优化指示符/should_deoptimize变量的使用。图6B和表8C示出了已优化的源622的四个保护中的每一个使用每个应用的“ShouldDeoptALL”去优化指示符/should_deoptimize变量。
图6B和表8D示出了已优化的源630,其是在使用第二优化技术被进一步修改(优化)以减少修改后的源620中的保护的数目之后的修改后的源620。特别是,主函数中setY()、getX()和getY()方法调用的保护已经从已优化的源430中消除,因为setY()、getX()和getY()方法调用的执行是在setX()方法调用的保护之后执行。请注意,即使主函数中的setY()方法调用是对类B方法的第一方法调用,setY()方法调用的保护和setY()方法调用之前的setX()方法的保护二者都会测试每个应用的“ShouldDeoptALL”去优化指示符。因此,setY()方法调用的保护与setX()方法调用之前的保护进行相同的测试。然后,应用第二去优化技术允许移除setY()方法调用的保护。因此,在应用第四优化技术和第二优化技术之后,已优化的源630只有测试每个应用的“ShouldDeoptALL”去优化指示符的一个保护。
在一些实施例中,可以使用每类should_deoptimize变量(去优化指示符),诸如上面在场景100、200、300、400、500、600和700的场境中指出的;例如场景100和200中使用的ShouldDeoptA变量以及场景300、400、500、600和700中使用的ShouldDeoptA变量。在其他实施例中,一个每应用should_deoptimize变量(去优化指示符)可以用于软件应用的所有类;例如场景600中使用的ShouldDeoptAll变量。
在其他实施例中,使用了每方法should_deoptimize变量(去优化指示符)。作为使用每方法should_deoptimize变量的特定示例,假定类CL1有两个方法:方法M_MANY和方法M_ONLY,其中类CL1与最初为程序执行而加载的软件一起被包括,并且当类CL1最初被加载时,方法M_MANY和M_ONLY中的每一个都只有一个实现。运行时系统可以检查由最初加载的软件的类层级分析生成的类层级,以确定方法M_MANY和M_ONLY中的每一个最初只有一个实现。然后,运行时系统可以初始化方法M_MANY的去优化指示符ShouldDeoptCL1M_MANY的值和方法M_ONLY的去优化指示符ShouldDeoptCL1M_ONLY的值为0,指示允许(有资格)对方法M_MANY和M_ONLY优化/去虚拟化的假设。
继续这个示例,假定在运行时,加载了附加的软件,包括类CL1的子类CL2,其中子类CL2包括方法M_MANY的另一个实现,但不包括M_ONLY的另一个实现。运行时系统可以确定方法M_MANY有两个实现,M_ONLY有一个实现,这是通过在加载附加软件之后重新执行类层级分析来更新类层级,然后检查更新的类层级来获得关于现在组合的初始加载的软件和附加软件的方法的实现信息。
由于方法M_ONLY在加载附加软件后仍然只有一个实现,因此运行时系统可以维持(而不是更改)去优化指示符ShouldDeoptCL1M_ONLY的0值。通过维持ShouldDeoptCL1M_ONLY的值,运行时系统指示在加载附加软件后仍然允许优化方法M_ONLY。相反,由于方法M_MANY在加载附加软件后有两个实现,运行时系统可以将去优化指示符ShouldDeoptCL1M_MANY的值更改为1(或另一个非零值)。通过将ShouldDeoptCL1M_MANY的值更改为非零值,运行时系统指示加载附加软件后,方法M_MANY被拒绝(没有资格)优化/去虚拟化。
在其他实施例中,这里描述的由JIT编译器执行的功能的部分或全部可以由AOT编译器执行。例如,AOT编译器可以利用简档信息,包括使用在运行时收集的类层级分析提供的信息,来执行这里描述为由JIT编译器执行的功能的部分或全部。
在一些实施例中,编译器,诸如JIT编译器和/或AOT编译器,可以具有指示线程内可能出现线程挂起的一个或多个位置的信息。在这些实施例中,第五优化技术可以消除由编译器确定的不会发生线程挂起的软件部分中的保护;即,在软件的该部分线程挂起是不可能的。在确定在软件的一部分中没有发生线程挂起之后,编译器可以确定去优化指示符值将在软件的整个部分中保持不变,因为去优化指示符值只能在线程挂起时改变。
然后,编译器可以消除不会出现线程挂起的软件部分的冗余保护。例如,让P0部分成为其中编译器已经确定不会发生线程挂起的软件部分。然后,可以执行部分P0中的初始保护IG1来校验去优化指示符,确定初始方法调用是否将作为虚拟方法调用来执行。然后,校验去优化指示符并且在部分P0内保护IG1之后的所有保护都可以被消除,因为部分P0内的后续保护对于保护IG1来说是冗余的。其他示例也是可能的。在一些示例中,这里描述的优化技术中的两种或多种可以一起使用;例如,第五优化技术可以与第一优化技术、第二优化技术、第三优化技术和/或第四优化技术的使用相结合。
图7图示出了根据示例实施例的场景700,其中计算设备102确定与混合同步/异步去优化相关联的已优化的源730。在场景700期间,计算设备102执行JIT编译器以从对应于源710的字节码生成机器语言指令。在其他场景下,可以使用JIT编译器以外的编译器。
然后,JIT编译器修改对应于源710的字节码和/或添加字节码以生成被表示为已优化的源730的修改的字节码,其中已优化的源730还表示已使用第五优化技术优化的修改后的源720。JIT编译器根据修改后的字节码生成机器语言指令。在其他场景下,JIT编译器可以将对应于修改源710和/或修改后的源720的附加和/或修改的机器语言指令输出到已优化的源730,而不是修改和/或添加字节码。
在JIT编译器为已优化的源730生成机器语言指令中的至少一些之后,计算设备102使用运行时系统软件来执行字节码和/或机器语言指令,运行时系统软件包括用于执行字节码的字节码解释器。特别地,计算设备102在场景700期间执行表示已优化的源730的字节码和机器语言指令。在计算设备102使用运行时系统软件来执行对应于已优化的源730的字节码和/或机器语言指令之后,场景700可以结束。
表9A、9B和9C相应地再现了图7所示的源710、修改后的源720和已优化的源730的重新格式化内容。
表9A
表9B
表9C
如图7和表9A所示,源710示出,“class A”包括至少一个整数变量——“X”——和至少两个方法:“setX(int inX)”,它将X整数变量的值赋予给输入参数“inX”的值;“getX()”,它返回X整数变量的值。源710还包括“class AHolder”的定义,其在“localA”变量中至少包括类A对象,其中localA变量可以使用类AHolder的“getA()”方法获得。
在场景700中,对行“A receiver1=h1.getA()”中的getA()方法的调用导致使用第一接收器对象“receiver1”进行的方法调用去虚拟化的类层级分析,因为getA()方法可能返回类A对象或类A子类的对象。类层级分析可以确定源710的receiver1对象的实际类型、对应的方法实现以及方法调用的可能去虚拟化。源710还示出了第二接收器对象“received 2”被赋予给“h2.getA()”方法调用的结果,以及随后通过receiver1和received 2对象中的每一个对类A的setX()方法的调用。可以使用去优化指示符校验这些方法调用作为虚拟方法调用执行。在一些实施例中,作为虚拟方法调用执行的方法调用可以由计算设备102的运行时系统的字节码解释器执行。
图7和表9B示出了源710在被更新以执行混合同步/异步去优化技术之后的修改后的源720。在场景700中,如上所讨论,作为行“A receiver=h1.getA()”的执行的一部分,对类A执行类层级分析。类层级分析导致使用should_deoptimize变量用于类A相关的保护。
在修改后的源720中,在上述类A的setX()和getX()方法调用之前,插入了用于校验表示为should_deoptimize变量的去优化指示符的保护。特别地,修改后的源720包括在setX()方法调用之前使用的类A的去优化指示符的“ShouldDeoptA”变量。如果对方法调用的should_deoptimize变量的校验指示将发生去优化,则如修改后的源720中的“deopt()”函数调用所示,异步去优化软件可以用于使方法调用去优化。如果方法调用未被去优化,则如修改后的源720所示,执行去虚拟化的方法调用。例如,修改后的源720示出在“guard for1st setX()”之后,执行了对“receiver1.setX(i)”的“devirtualized call”,这可以是对类A的setX()方法的去虚拟化调用。
在场景700中,receiver1.setX(i)和receiver2.setX(i)的执行发生在部分P1内,部分P1是不发生线程挂起的软件部分。对于场景700,软件的该部分从位于源710、修改后的源720和已优化的源730中的每一个中的注释“//begin NS portion P1”开始,并结束于位于源710、修改后的源720和已优化的源730中的每一个中的注释“//end NS portion P1”。在这些注释中,“NS”是“no suspension”的缩写。
在部分P1中,使用三个标签来定位图7和表9B中的特定软件行。特别地,修改后的源720包括三个标签“L1”、“L2”和“L3”,以说明软件的相应行:(1)校验should_deoptimize变量“ShouldDeoptA”的保护,(2)可以在标签L1处的保护之后执行的对“receiver1.setX(i)”的去虚拟化调用,以及(3)在对“receiver2.setX(i)”方法调用之前校验should_deoptimize变量“ShouldDeoptA”的保护。修改后的源720还指示所有三个标签L1、L2和L3以及它们对应的代码行都在部分P1内。在其他场景下,没有出现线程挂起的软件部分可能没有标签。
图7和表9C示出了已优化的源730,其是在使用第五优化技术被进一步修改(优化)以减少修改后的源720中的保护的数目后的修改后的源720。在部分P1中,标签L1处的保护和标签L3处的保护每个校验should_deoptimize变量ShouldDeoptA,并且标签L1处的保护在标签L3处的保护之前。由于标签L1处的保护在标签L3处的保护之前,并且在标签L1与L3之间不会出现线程挂起,所以根据第五优化技术,L3处的保护可以从已优化的源730中作为冗余消除。因此,已从已优化的源730中消除了修改后的源720中标签L3处的保护。
示例数据网络
图8描绘了根据示例实施例的分布式计算体系结构800,其中服务器设备808、810被配置为通过网络806与可编程设备804a、804b、804c、804d、804e通信。网络806可以对应于LAN、广域网(WAN)、企业内部网、公共互联网或被配置为在联网计算设备之间提供通信路径的任何其他类型的网络。网络806还可以对应于一个或多个LAN、WAN、公司内部网和/或公共互联网的组合。
尽管图8仅示出了三个可编程设备,但是分布式应用体系结构可以服务于数十、数百或数千个可编程设备。此外,可编程设备804a、804b、804c、804d、804e(或任何附加的可编程设备)可以是任何种类的计算设备,诸如普通膝上型计算机、台式计算机、可穿戴计算设备、移动计算设备、头戴式设备(HMD)、网络终端、无线通信设备(例如,智能电话或蜂窝电话)等。在一些实施例中,诸如用可编程设备804a、804b、804c指示,可编程设备可以直接连接到网络806。在其它实施例中,诸如用可编程设备804d和804e指示的,可编程设备可以经由相关联的计算设备,诸如可编程设备804c,间接地连接到网络806。在该示例中,可编程设备804c可以充当相关联的计算设备,以在可编程设备804d和804e与网络806之间传递电子通信。在图8中未示出的其他实施例中,可编程设备可以直接和间接连接到网络806。
如可编程设备804a-804e所请求的,服务器设备808、810可以被配置为执行一个或多个服务。例如,服务器设备808和/或810可以向可编程设备804a-804e提供内容。内容可以包括但不限于网页、超文本、脚本、二进制数据,诸如编译的软件、图像、音频和/或视频。内容可以包括压缩和/或未压缩的内容。内容可以被加密和/或未加密。其他类型的内容也是可能的。
作为另一个示例,服务器设备808和/或810可以向可编程设备804a-804e提供对用于数据库、搜索、计算、图形、音频、视频、万维网/互联网利用和/或其他功能的软件的访问。服务器设备的许多其他示例也是可能的。
计算设备体系结构
图9A是根据示例实施例的计算设备900的功能框图。特别地,图9A所示的计算设备900可以被配置为执行编译器、JIT编译器、AOT编译器、运行时系统、计算设备102、可编程设备704a、704b、704c、704d、704e、服务器设备708、710的至少一个功能,和/或与混合同步/异步去优化、优化技术、场景100、200、300、400、500、600、700和方法1000相关的至少一个功能。
计算设备900可以包括用户接口模块901、网络通信接口模块902、一个或多个处理器903、数据存储装置904和一个或多个传感器920,所有这些都可以通过系统总线、网络或其他连接机构905链接在一起。
用户接口模块901可操作用于向外部用户输入/输出设备发送数据和/或从外部用户输入/输出设备接收数据。例如,用户接口模块901可以被配置为向用户输入设备发送数据和/或从用户输入设备接收数据,用户输入设备为诸如键盘、小键盘、触摸屏、计算机鼠标、轨迹球、操纵杆、照相机、语音识别模块和/或其他类似的设备。用户接口模块901还可以被配置为向用户显示设备提供输出,诸如一个或多个阴极射线管(CRT)、液晶显示器、发光二极管(LED)、使用数字光处理(DLP)技术的显示器、打印机、灯泡和/或其他类似设备,现在已知或以后开发的。用户接口模块901还可以被配置为生成可听输出,诸如扬声器、扬声器插孔、音频输出端口、音频输出设备、耳机和/或其他类似设备。
网络通信接口模块902可包括一个或多个无线接口907和/或一个或多个有线接口908,它们可配置成经由网络通信。无线接口907可以包括一个或多个无线发射器、接收器和/或收发器,诸如蓝牙收发器、Zigbee收发器、Wi-Fi收发器、WiMAX收发器和/或可配置为经由无线网络通信的其他类似类型的无线收发器。有线接口908可以包括一个或多个有线发射器、接收器和/或收发器,诸如以太网收发器、通用串行总线(USB)收发器或类似的收发器,其可配置为经由双绞线、同轴电缆、光纤链路或类似的物理连接与有线网络进行通信。
在一些实施例中,网络通信接口模块902可以被配置为提供可靠、安全和/或认证的通信。对于每个通信,可以提供用于确保可靠通信的信息(即,有保证的消息传递),可能作为消息头部和/或尾部的一部分(例如,分组/消息排序信息、封装头部和/或尾部、大小/时间信息以及传输验证信息,诸如CRC和/或奇偶校验值)。使用一个或多个加密协议和/或算法,诸如但不限于DES、AES、RSA、Diffie-Hellman和/或DSA,可以使通信安全(例如,编码或加密)和/或解密/解码。也可以使用其他加密协议和/或算法,或者除了这里列出的协议和/或算法之外,还可以使用其他加密协议和/或算法来保护(然后解密/解码)通信。
一个或多个处理器903可以包括一个或多个通用处理器和/或一个或多个专用处理器(例如,数字信号处理器、图形处理单元、专用集成电路等)。一个或多个处理器903可以被配置为执行包含在数据存储装置904中的计算机可读程序指令906和/或本文所述的其他指令。
数据存储装置904可以包括一个或多个计算机可读存储介质,其可以被一个或多个处理器903中的至少一个读取和/或访问。一个或多个计算机可读存储介质可以包括易失性和/或非易失性存储组件,诸如光学、磁性、有机或其他存储器或盘存储,其可以全部或部分地与一个或多个处理器903中的至少一个集成。在一些实施例中,数据存储904可以使用单个物理设备(例如,一个光学、磁性、有机或其他存储器或盘存储单元)来实现,而在其他实施例中,数据存储904可以使用两个或更多物理设备来实现。
数据存储904可以包括计算机可读程序指令906和可能的附加数据。在一些实施例中,数据存储904可以另外包括执行这里描述的方法、场景和技术的至少一部分和/或这里描述的设备和网络的功能的至少一部分所需的存储。
在一些实施例中,计算设备900可以包括一个或多个传感器920。传感器920可以被配置成测量计算设备900的环境中的条件并提供关于该环境的数据。例如,传感器920可以包括以下一个或多个:(i)识别其他对象和/或设备的识别传感器,诸如但不限于RFID读取器、接近传感器、一维条形码读取器、二维条形码(例如快速响应(QR)码)读取器和激光跟踪器,其中,识别传感器可以被配置为读取标识符,诸如RFID标签、条形码、QR码和/或被配置为读取和提供至少识别信息的其他设备和/或对象;(ii)用于测量计算设备900的位置和/或移动的位置传感器,诸如但不限于陀螺仪、加速度计、多普勒传感器、全球定位系统(GPS)设备、声纳传感器、雷达设备、激光位移传感器和罗盘;(iii)用于获得指示计算设备900的环境的数据的环境传感器,诸如但不限于红外传感器、光学传感器、光传感器、照相机、生物传感器、电容传感器、触摸传感器、温度传感器、无线传感器、无线电传感器、运动传感器、麦克风、声音传感器、超声波传感器和/或烟雾传感器;以及(iv)力传感器,用于测量围绕计算设备900作用的一个或多个力(例如惯性力和/或G力),诸如但不限于测量以下的一个或多个传感器:一个或多个维度上的力、扭矩、地面力、摩擦力和/或识别ZMP和/或ZMP位置的零力矩点(ZMP)传感器。传感器920的许多其它示例也是可能的。
基于云的服务器
图9B描绘了根据示例实施例的被布置为基于云的服务器系统的计算集群909a、909b、909c的网络914。计算集群909a、909b、909c可以是存储基于云的应用和/或服务的程序逻辑和/或数据的基于云的设备;例如,执行编译器、JIT编译器、AOT编译器、运行时系统、计算设备102、网络806的至少一个功能,和/或与混合同步/异步去优化、优化技术、场景100、200、300、400、500、600、700和方法1000相关的至少一个功能。
在一些实施例中,计算集群909a、909b、909c可以是驻留在单个计算中心中的单个计算设备。在其他实施例中,计算集群909a、909b、909c可以包括单个计算中心中的多个计算设备,或者甚至包括位于不同地理位置的多个计算中心中的多个计算设备。例如,图9B描绘了驻留在不同物理位置的计算集群909a、909b和909c中的每一个。
在一些实施例中,计算集群909a、909b、909c处的数据和服务可以被编码为存储在非暂时性、有形的计算机可读介质(或计算机可读存储介质)中的计算机可读信息,并且可以由其他计算设备访问。在一些实施例中,计算集群909a、909b、909c可以存储在单个磁盘驱动器或其他有形存储介质上,或者可以在位于一个或多个不同地理位置的多个磁盘驱动器或其他有形存储介质上实现。
图9B描绘了根据示例实施例的基于云的服务器系统。在图9B中,编译器、JIT编译器、AOT编译器、运行时系统和/或计算设备的功能可以分布在计算集群909a、909b、909c中。计算集群909a可以包括由本地集群网络912a连接的一个或多个计算设备900a、集群存储阵列910a和集群路由器911a。类似地,计算集群909b可以包括由本地集群网络912b连接的一个或多个计算设备900b、集群存储阵列910b和集群路由器911b。同样,计算集群909c可以包括由本地集群网络912c连接的一个或多个计算设备900c、集群存储阵列910c和集群路由器911c。
在一些实施例中,计算集群909a、909b和909c中的每一个可以具有相等数目的计算设备、相等数目的集群存储阵列和相等数目的集群路由器。然而,在其他实施例中,每个计算集群可以具有不同数目的计算设备、不同数目的集群存储阵列和不同数目的集群路由器。每个计算集群中的计算设备、集群存储阵列和集群路由器的数目可以取决于分配给每个计算集群的一个或多个计算任务。
例如,在计算集群909a中,计算设备900a可以被配置为执行编译器、JIT编译器、AOT编译器、运行时系统和/或计算设备的各种计算任务。在一个实施例中,编译器、JIT编译器、AOT编译器、运行时系统和/或计算设备的各种功能可以分布在计算设备900a、900b、900c中一个或多个之中。相应计算集群909b和909c中的计算设备900b和900c可以类似于计算集群909a中的计算设备900a来配置。另一方面,在一些实施例中,计算设备900a、900b和900c可以被配置为执行不同的功能。
在一些实施例中,与编译器、JIT编译器、AOT编译器、运行时系统和/或计算设备相关联的计算任务和存储的数据可以至少部分基于编译器、JIT编译器、AOT编译器、运行时系统和/或计算设备的处理需求,计算设备900a、900b、900c的处理能力,每个计算集群中的计算设备之间以及计算集群本身之间的网络链接的时延,和/或可能有助于整个系统体系结构的成本、速度、容错性、弹性、效率和/或其他设计目标的其他因素和/或总系统体系结构的其它设计目标而在计算设备900a、900b和900c上分布。
计算集群909a、909b、909c的集群存储阵列910a、910b、910c可以是数据存储阵列,数据存储阵列包括磁盘阵列控制器,该磁盘阵列控制器被配置为管理对硬盘驱动器组的读写访问。单独或与它们相应的计算设备一起,磁盘阵列控制器还可以被配置为管理存储在集群存储阵列中的数据的备份或冗余副本,以防止磁盘驱动器或其他集群存储阵列故障和/或网络故障,这些故障阻止一个或多个计算设备访问一个或多个集群存储阵列。
类似于编译器、JIT编译器、AOT编译器、运行时系统和/或计算设备的功能可以分布在计算集群909a、909b、900c的计算设备900a、900b、900c上的方式,这些组件的各种活跃部分和/或备份部分可以分布在集群存储阵列910a、910b、910c上。例如,一些集群存储阵列可以被配置为存储编译器、JIT编译器、AOT编译器、运行时系统和/或计算设备的数据的一部分,而其他集群存储阵列可以存储编译器、JIT编译器、AOT编译器、运行时系统和/或计算设备的数据的其他部分。此外,一些集群存储阵列可以配置为存储在其他集群存储阵列中存储的数据的备份版本。
计算集群909a、909b、909c中的集群路由器911a、911b、911c可以包括被配置为向计算集群提供内部和外部通信的联网装备。例如,计算集群909a中的集群路由器911a可以包括一个或多个互联网交换和路由设备,互联网交换和路由设备被配置为提供(i)计算设备900a与集群存储阵列910a之间经由本地集群网络912a的局域网通信,以及(ii)计算集群909a与计算集群909b和909c之间经由广域网连接913a到网络806的广域网通信。集群路由器911b和911c可以包括类似于集群路由器911a的网络装备,并且集群路由器911b和911c可以为计算集群909b和909b执行类似于集群路由器911a为计算集群909a执行的联网功能。
在一些实施例中,集群路由器911a、911b、911c的配置可以至少部分基于计算设备和集群存储阵列的数据通信需求,集群路由器911a、911b、911c中的网络装备的数据通信能力,本地网络912a、912b、912c的时延和吞吐量,广域网链路913a、913b、913c的时延、吞吐量和成本,和/或可能有助于成本、速度、容错、弹性、效率的其他因素和/或节制系统体系结构的其它设计标准。
示例操作方法
图10是根据示例性实施例的方法1000的流程图。方法1000可以由计算设备诸如计算设备900执行。方法1000可以从框1010开始,其中计算设备可以接收使用将被编译成机器语言指令的一个或多个软件相关指令表达的软件,并且其中该软件包括特定方法调用,诸如以上至少在图1-7的场境中讨论的方法调用。
在一些实施例中,一个或多个软件相关指令可以包括不可由计算设备直接执行的一个或多个字节码,其中计算设备包括用于执行未编译的软件相关指令的解释器,其中解释器可以包括用于使用计算设备执行一个或多个字节码的软件,并且其中一个或多个机器语言指令可以由计算设备直接执行而不使用解释器,诸如以上至少在图1-7的场境中讨论的。
在框1020,计算设备可以执行软件的类层级分析,以确定与软件相关联的类层级,诸如以上至少在图1-7的场境中讨论的。
在框1030,计算设备可以基于类层级来确定特定方法调用是否将被校验作为虚拟方法调用执行,诸如以上至少在图1-7的场境中讨论的。在一些实施例中,基于类层级确定特定方法调用是否将被校验作为虚拟方法调用来执行可以包括基于类层级确定特定方法调用是否有资格作为直接方法调用来执行,诸如以上至少在图1-7的场境中讨论的。特别是在这些实施例中,特定方法调用可以与特定方法相关联,其中软件可以与虚拟方法表(vtable)相关联,vtable可以包括具有特定方法的标识符和对特定方法的引用的特定条目,并且其中特定方法的直接方法调用可以避免使用vtable,如上所讨论的那样。
在其他实施例中,特定方法调用可以与特定方法相关联。然后,基于类层级确定特定方法调用是否将被校验作为虚拟方法调用执行可以包括:使用类层级确定特定方法是否有一个实现;并且在确定特定方法有一个实现之后,确定特定方法调用将被校验作为虚拟方法调用来执行,诸如以上至少在图1-7的场境中讨论的。
在其他实施例中,计算设备包括用于执行未编译的软件相关指令的解释器。然后,其中确定特定方法调用是否作为虚拟方法调用执行包括确定特定方法调用是否将由解释器执行,例如以上至少在图1-7的场境中讨论的。
在框1040,计算设备可以在确定特定方法调用将被校验作为虚拟方法调用执行之后,确定一个或多个特定机器语言指令。一个或多个特定机器语言指令可以包括:一个或多个保护机器语言指令,用于执行去优化指示符的校验,以确定特定方法调用是否将作为虚拟方法调用来执行,其中去优化指示符在运行时是可修改的;以及用于特定方法调用的一个或多个方法调用机器语言指令,诸如以上至少在图1-7的场境中讨论。
在框1050,计算设备可以向计算设备的运行时系统提供一个或多个特定机器语言指令,诸如以上至少在图1和2的场境中所讨论。
在一些实施例中,方法1000还可以包括:在运行时期间将附加软件加载到运行时系统中;以及通过更新软件的类层级分析以考虑附加软件来确定更新的类层级分析,诸如以上至少在图2A和2B的场境中讨论的。
特别是在这些实施例中,去优化指示符可以被初始化为与允许优化相关联的值。然后,方法1000还可以包括:在将附加软件加载到运行时系统中之后,基于更新的类层级分析,将运行时期间的去优化指示符的值设置为与拒绝优化相关联的值,诸如以上至少在图2A和2B的场境中所讨论。
在这些实施例的更具体的实施例中,用于特定方法调用的一个或多个方法调用机器语言指令可以包括用于直接方法调用的一个或多个机器语言指令。然后,方法1000还可以包括:在加载附加软件之前,使用运行时系统执行一个或多个保护机器语言指令以用于执行去优化指示符的校验,以确定特定方法调用是否将作为虚拟方法调用来执行;基于具有与允许优化相关联的值的去优化指示符,确定执行用于直接方法调用的一个或多个机器语言指令;在更新类层级分析之后,使用运行时系统执行一个或多个保护机器语言指令,用于执行去优化指示符的校验,以确定特定方法调用是否将作为虚拟方法调用来执行;以及基于具有与拒绝优化相关联的值的去优化指示符,确定作为虚拟方法调用执行特定方法调用,诸如以上至少在图2A和2B的场境中讨论的。
在其他实施例中,方法1000还可以包括:通过使用计算设备的运行时系统来执行一个或多个特定机器语言指令来执行特定方法调用,诸如以上至少在图1、2A和2B的场境中所讨论。特别是在这些实施例中,使用计算设备的运行时系统来执行一个或多个机器语言指令可以包括:执行一个或多个保护机器语言指令以执行校验特定方法调用是否将作为虚拟方法调用来执行;基于校验确定特定方法调用将作为虚拟方法调用执行;以及,将特定方法调用作为虚拟方法调用来执行,如上面至少在图2A和2B的场境中所讨论。
在这些实施例的其他特定实施例中,使用计算设备的运行时系统来执行一个或多个特定机器语言指令可以包括:执行一个或多个保护机器语言指令来执行校验特定方法调用是否将作为虚拟方法调用来执行;基于校验,确定特定方法调用将不作为虚拟方法调用执行;以及使用运行时系统来执行一个或多个方法调用机器语言指令,诸如以上至少在图1、2A和2B的场境中所讨论。
在其他实施例中,软件可以包括与第一方法相关联的第一方法调用和与第二方法相关联的第二方法调用,其中第一方法调用可以与用于确定第一方法调用是否将作为虚拟方法调用执行的第一去优化指示符相关联,其中第二方法调用可以与用于确定第二方法调用是否将作为虚拟方法调用来执行的第二去优化指示符相关联,并且其中第一去优化指示符和第二去优化指示符可以在运行时被修改,如上所述。
在这些实施例中的特定实施例中,方法1000可以进一步包括:将第一去优化指示符和第二去优化指示符中的每一个初始化为与允许运行时优化相关联的值;在运行时期间将附加软件加载到运行时系统中;以及在加载附加软件之后,使用计算设备更新第一去优化指示符和第二去优化指示符以考虑附加软件,如上文所讨论。
在这些实施例的更具体的实施例中,软件可以包括第一方法的第一实现和第二方法的第一实现,其中附加软件可以包括第一方法的第二实现。然后,使用运行时系统更新第一去优化指示符和第二去优化指示符以考虑附加软件可以包括:确定软件和附加软件是否包括第一方法的多个实现;以及在确定软件和附加软件包括第一方法的第一实现和第二实现之后,将第一去优化指示符的值设置为与拒绝优化相关联的值,如上文所讨论。
在这些实施例的其他更具体的实施例中,软件和附加软件可以仅包括第二方法的第一实现。然后,使用运行时系统更新第一去优化指示符和第二去优化指示符以考虑附加软件可以包括:确定软件和附加软件是否包括第二方法的多个实现;并且在确定软件和附加软件仅包括第二方法的第一实现之后,将第二去优化指示符的值保持为与允许优化相关联的值,诸如以上至少在图1、2A和2B的场境中所讨论。
附加示例实施例
提供以下条款作为对本公开的进一步描述。
条款1-一种方法,包括:在计算设备处接收软件,所述软件使用将要编译成机器语言指令的一个或多个软件相关指令表达,其中软件包括特定方法调用;使用计算设备执行软件的类层级分析以确定与软件相关联的类层级;使用计算设备,基于类层级,确定是否特定方法调用将被校验作为虚拟方法调用执行;在确定特定方法调用将被校验作为虚拟方法调用执行之后,计算设备确定一个或多个特定机器语言指令,特定机器语言指令包括一个或多个保护机器语言指令和用于特定方法调用的一个或多个方法调用机器语言指令,保护机器语言指令用于执行去优化指示符的校验以确定特定方法调用是否将作为虚拟方法调用来执行,其中去优化指示符在运行时是可修改的;和,向计算设备的运行时系统提供一个或多个特定机器语言指令。
条款2-根据条款1的方法,进一步包括:在运行时期间将附加软件加载到运行时系统中;和,通过更新软件的类层级分析以考虑附加软件来确定更新的类层级分析。
条款3-根据条款2的方法,其中去优化指示符被初始化为与允许优化相关联的值,并且其中方法进一步包括:在将附加软件加载到运行时系统中之后,基于更新的类层级分析,将运行时期间的去优化指示符的值设置为与拒绝优化相关联的值。
条款4-根据条款3的方法,其中用于特定方法调用的一个或多个方法调用机器语言指令包括用于直接方法调用的一个或多个机器语言指令,并且其中该方法还包括:在加载附加软件之前,使用运行时系统执行一个或多个保护机器语言指令用于执行去优化指示符的校验以确定特定方法调用是否将作为虚拟方法调用来执行;基于具有与允许优化相关联的值的去优化指示符,确定执行用于直接方法调用的一个或多个机器语言指令;在更新类层级分析之后,使用运行时系统执行一个或多个保护机器语言指令用于执行去优化指示符的校验,以确定特定方法调用是否将作为虚拟方法调用来执行;和,基于具有与拒绝优化相关联的值的去优化指示符,确定作为虚拟方法调用执行特定方法调用。
条款5-根据条款1的方法,其中基于类层级确定特定方法调用是否将被校验作为虚拟方法调用执行包括基于类层级确定特定方法调用是否有资格作为直接方法调用执行。
条款6-根据条款5的方法,其中特定方法调用与特定方法相关联,其中软件与虚拟方法表(vtable)相关联,vtable包括特定条目,特定条目包括特定方法的标识符和对特定方法的引用,并且其中特定方法的直接方法调用避免使用vtable。
条款7-根据条款1的方法,其中一个或多个软件相关指令包括不可由计算设备直接执行的一个或多个字节码,其中计算设备包括用于执行未编译的软件相关指令的解释器,其中解释器包括用于使用计算设备执行一个或多个字节码的软件,并且其中一个或多个机器语言指令可由计算设备在不使用解释器的情况下直接执行。
条款8-根据条款1的方法,进一步包括:通过使用计算设备的运行时系统执行一个或多个特定机器语言指令来执行特定方法调用。
条款9-根据条款8的方法,其中使用计算设备的运行时系统来执行一个或多个机器语言指令包括:执行一个或多个保护机器语言指令以执行特定方法调用是否将作为虚拟方法调用执行的校验;基于校验确定特定方法调用将作为虚拟方法调用来执行;和,作为虚拟方法调用执行特定方法调用。
条款10-根据条款8的方法,其中使用计算设备的运行时系统来执行一个或多个特定机器语言指令包括:执行一个或多个保护机器语言指令以执行校验特定方法调用是否将作为虚拟方法调用执行;基于校验,确定特定方法调用将不作为虚拟方法调用执行;以及,使用运行时系统执行一个或多个方法调用机器语言指令。
条款11-根据条款1的方法,其中特定方法调用与特定方法相关联,并且其中,基于类层级来确定特定方法调用是否将被校验作为虚拟方法调用来执行包括:使用类层级确定是否存在特定方法的一个实现;和,在确定存在特定方法的一个实现之后,确定要校验特定方法调用作为虚拟方法调用执行。
条款12-根据条款1的方法,其中软件包括与第一方法相关联的第一方法调用和与第二方法相关联的第二方法调用,其中第一方法调用与用于确定第一方法调用是否将作为虚拟方法调用执行的第一去优化指示符相关联,其中第二方法调用与用于确定第二方法调用是否将作为虚拟方法调用执行的第二去优化指示符相关联,并且其中第一去优化指示符和第二去优化指示符在运行时是可修改的。
条款13-根据条款12的方法,还包括:将第一去优化指示符和第二去优化指示符中的每一个初始化为与在运行时允许优化相关联的值;在运行时期间将附加软件加载到运行时系统中;和,在加载附加软件之后,使用计算设备更新第一去优化指示符和第二去优化指示符以考虑附加软件。
条款14-条款13的方法,其中软件包括第一方法的第一实现和第二方法的第一实现,其中附加软件包括第一方法的第二实现,并且其中使用运行时系统更新第一去优化指示符和第二去优化指示符以说明附加软件包括:确定软件和附加软件是否包括第一方法的多个实现;和,在确定软件和附加软件包括第一方法的第一实现和第二实现之后,将第一去优化指示符的值设置为与拒绝优化相关联的值。
条款15-根据条款13的方法,其中软件和附加软件仅包括第二方法的第一实现,并且其中使用运行时系统更新第一去优化指示符和第二去优化指示符以考虑附加软件包括:确定软件和附加软件是否包括第二方法的多个实现;和,在确定软件和附加软件仅包括第二方法的第一实现之后,将第二去优化指示符的值保持为与允许优化相关联的值。
条款16-根据条款1的方法,其中计算设备包括用于执行未编译的软件相关指令的解释器,并且其中确定特定方法调用是否作为虚拟方法调用执行包括确定特定方法调用是否将由解释器执行。
条款17-一种计算设备,包括:一个或多个处理器;和,数据存储装置,至少包括存储在其上的计算机可执行指令,当由一个或多个处理器执行时,指令使得计算设备执行包括条款1-16中任一条款的方法。
条款18-一种上面存储有指令的非暂时性计算机可读介质,指令在被计算设备的一个或多个处理器执行时使计算设备执行包括条款1-16中任一条款的方法。
条款19-一种装置,包括:用于执行条款1-16中任一项方法的机构。
条款20–一种系统,包括第一计算设备,包括:一个或多个第一处理器;以及,第一数据存储,至少包括存储在其上的计算机可执行指令,所述计算机可执行指令在由一个或多个第一处理器执行时,使得第一计算设备执行第一功能,该第一功能包括发送使用一个或多个软件相关指令表达的第一软件;以及第二计算设备,包括:一个或多个第二处理器;以及,第二数据存储,至少包括存储在其上的计算机可执行指令,所述计算机可执行指令在由一个或多个第二处理器执行时,使得第二计算设备执行包括条款1-16中任一项的方法的第二功能,其中使用将要编译成机器语言指令的一个或多个软件相关指令表达的软件包括第一软件。
本公开不限于本申请中描述的特定实施例,这些实施例旨在作为各个方面的说明。在不脱离本领域技术人员显而易见的精神和范围的情况下,可以进行许多修改和变化。除了在此列举的那些之外,本公开范围内的功能等同的方法和装置对于本领域技术人员来说从前述描述中将是显而易见的。这些修改和变化旨在落入所附权利要求的范围内。
以上具体实施方式参考附图描述了所公开的系统、设备和方法的各种特征和功能。在附图中,除非上下文另有说明,相似的附图标记通常标识相似的组件。具体实施方式、附图和权利要求中描述的说明性实施例并不意味着限制。在不脱离本文中呈现的主题的精神或范围的情况下,可以利用其他实施例,并且可以进行其他改变。很容易理解的是,如在此总体描述的以及在附图中示出的本公开的各个方面可以以各种不同的配置来布置、替换、组合、分离和设计,所有这些都在此明确预期。
关于附图中的任何或所有梯形图、场景和流程图,如本文所讨论的,根据示例性实施例,每个框和/或通信可以表示信息的处理和/或信息的传输。替选实施例包括在这些示例性实施例的范围内。例如,在这些替选实施例中,根据所涉及的功能,被描述为框、传输、通信、请求、响应和/或消息的功能可以不按所示或所讨论的顺序执行,包括基本上并行或相反的顺序。此外,更多或更少的框和/或功能可以与这里讨论的梯形图、场景和流程图中的任何一起使用,并且这些梯形图、场景和流程图可以部分或全部彼此组合。
表示信息处理的框可以对应于可以被配置为执行这里描述的方法或技术的特定逻辑功能的电路。替选地或附加地,表示信息处理的框可以对应于模块、段或程序代码的一部分(包括相关数据)。程序代码可以包括可由处理器执行的一个或多个指令,用于执行方法或技术中的特定逻辑功能或动作。程序代码和/或相关数据可以存储在任何类型的计算机可读介质上,例如包括磁盘或硬盘驱动器或其他存储介质的存储设备。
计算机可读介质还可以包括非暂时性计算机可读介质,诸如像寄存器存储器、处理器高速缓存和随机存取存储器(RAM)这样的短期存储数据的非暂时性计算机可读介质。计算机可读介质还可以包括存储程序代码和/或数据更长时间的非暂时性计算机可读介质,例如二级或永久长期存储,如只读存储器(ROM)、光盘或磁盘、光盘只读存储器(CD-ROM)。计算机可读介质也可以是任何其他易失性或非易失性存储系统。计算机可读介质可以被认为是例如计算机可读存储介质或有形存储设备。
此外,表示一个或多个信息传输的框可以对应于同一物理设备中的软件和/或硬件模块之间的信息传输。然而,其他信息传输可以在不同物理设备中的软件模块和/或硬件模块之间进行。
虽然这里已经公开了各种方面和实施例,但是其他方面和实施例对本领域技术人员来说是显而易见的。这里公开的各种方面和实施例是为了解释目的而提供的,并不旨在限制,真正的范围由所附权利要求来指示。
Claims (20)
1.一种方法,包括:
在计算设备处接收软件,所述软件使用将要编译成机器语言指令的一个或多个软件相关指令表达,其中所述软件包括特定方法调用;
使用所述计算设备执行所述软件的类层级分析以确定与所述软件相关联的类层级;
使用所述计算设备基于所述类层级来确定所述特定方法调用是否将被校验作为虚拟方法调用执行;
在确定所述特定方法调用将要被校验作为虚拟方法调用执行之后,所述计算设备确定一个或多个特定机器语言指令,所述一个或多个特定机器语言指令包括:
一个或多个保护机器语言指令,用于执行去优化指示符的校验,以确定所述特定方法调用是否将作为虚拟方法调用来执行,其中所述去优化指示符在运行时是可修改的;以及
用于所述特定方法调用的一个或多个方法调用机器语言指令;以及
向所述计算设备的运行时系统提供所述一个或多个特定机器语言指令。
2.根据权利要求1所述的方法,进一步包括:
在运行时期间将附加软件加载到所述运行时系统中;以及
通过更新所述软件的所述类层级分析以考虑所述附加软件来确定更新的类层级分析。
3.根据权利要求2所述的方法,其中,所述去优化指示符被初始化为与允许优化相关联的值,并且其中,所述方法进一步包括:
在将所述附加软件加载到所述运行时系统中之后,基于所更新的类层级分析,将运行时期间的所述去优化指示符的值设置为与拒绝优化相关联的值。
4.根据权利要求3所述的方法,其中,用于所述特定方法调用的所述一个或多个方法调用机器语言指令包括用于直接方法调用的一个或多个机器语言指令,并且其中,所述方法进一步包括:
在加载所述附加软件之前,使用所述运行时系统执行所述一个或多个保护机器语言指令以用于执行所述去优化指示符的校验来确定所述特定方法调用是否将作为虚拟方法调用来执行;
基于具有与允许优化相关联的值的去优化指示符,确定执行用于直接方法调用的所述一个或多个机器语言指令;
在更新所述类层级分析之后,使用所述运行时系统执行所述一个或多个保护机器语言指令以用于执行所述去优化指示符的校验来确定所述特定方法调用是否将作为虚拟方法调用来执行;以及
基于具有与拒绝优化相关联的值的去优化指示符,确定作为虚拟方法调用执行所述特定方法调用。
5.根据权利要求1所述的方法,其中,基于所述类层级确定所述特定方法调用是否将被校验作为虚拟方法调用执行包括:基于所述类层级确定所述特定方法调用是否有资格作为直接方法调用执行。
6.根据权利要求5所述的方法,其中,所述特定方法调用与特定方法相关联,其中,所述软件与虚拟方法表vtable相关联,所述vtable包括特定条目,所述特定条目包括所述特定方法的标识符和对所述特定方法的引用,并且其中,所述特定方法的所述直接方法调用避免使用所述vtable。
7.根据权利要求1所述的方法,其中所述一个或多个软件相关指令包括不可由所述计算设备直接执行的一个或多个字节码,其中所述计算设备包括用于执行未编译的软件相关指令的解释器,其中所述解释器包括用于使用所述计算设备执行所述一个或多个字节码的软件,并且其中所述一个或多个机器语言指令可由所述计算设备在不使用所述解释器的情况下直接执行。
8.根据权利要求1所述的方法,进一步包括:
通过使用所述计算设备的所述运行时系统执行所述一个或多个特定机器语言指令来执行所述特定方法调用。
9.根据权利要求8所述的方法,其中,使用所述计算设备的所述运行时系统来执行所述一个或多个机器语言指令包括:
执行所述一个或多个保护机器语言指令以执行所述特定方法调用是否将作为虚拟方法调用执行的所述校验;
基于所述校验来确定所述特定方法调用将作为虚拟方法调用来执行;以及
作为虚拟方法调用执行所述特定方法调用。
10.根据权利要求8所述的方法,其中,使用所述计算设备的所述运行时系统来执行所述一个或多个特定机器语言指令包括:
执行所述一个或多个保护机器语言指令以执行所述特定方法调用是否将作为虚拟方法调用执行的所述校验;
基于所述校验,确定所述特定方法调用将不作为虚拟方法调用执行;以及
使用所述运行时系统执行所述一个或多个方法调用机器语言指令。
11.根据权利要求1所述的方法,其中,所述特定方法调用与特定方法相关联,并且其中,基于所述类层级来确定所述特定方法调用是否将要被校验作为虚拟方法调用来执行包括:
使用所述类层级确定是否存在所述特定方法的一个实现;以及
在确定存在所述特定方法的一个实现之后,确定所述特定方法调用将要被校验作为虚拟方法调用执行。
12.根据权利要求1所述的方法,其中所述软件包括与第一方法相关联的第一方法调用和与第二方法相关联的第二方法调用,其中所述第一方法调用与用于确定所述第一方法调用是否将作为虚拟方法调用执行的第一去优化指示符相关联,其中所述第二方法调用与用于确定所述第二方法调用是否将作为虚拟方法调用执行的第二去优化指示符相关联,并且其中所述第一去优化指示符和所述第二去优化指示符在运行时是可修改的。
13.根据权利要求12所述的方法,进一步包括:
将所述第一去优化指示符和所述第二去优化指示符中的每一个初始化为与在运行时允许优化相关联的值;
在运行时期间将附加软件加载到所述运行时系统中;以及
在加载所述附加软件之后,使用所述计算设备更新所述第一去优化指示符和所述第二去优化指示符以考虑所述附加软件。
14.根据权利要求13所述的方法,其中所述软件包括所述第一方法的第一实现和所述第二方法的第一实现,其中所述附加软件包括所述第一方法的第二实现,并且其中使用所述运行时系统更新所述第一去优化指示符和所述第二去优化指示符以考虑所述附加软件包括:
确定所述软件和所述附加软件是否包括所述第一方法的多个实现;以及
在确定所述软件和所述附加软件包括所述第一方法的第一实现和第二实现之后,将所述第一去优化指示符的值设置为与拒绝优化相关联的值。
15.根据权利要求13所述的方法,其中所述软件和所述附加软件仅包括所述第二方法的所述第一实现,并且其中使用所述运行时系统更新所述第一去优化指示符和所述第二去优化指示符以考虑所述附加软件包括:
确定所述软件和所述附加软件是否包括所述第二方法的多个实现;以及
在确定所述软件和所述附加软件仅包括所述第二方法的所述第一实现之后,将所述第二去优化指示符的值保持为与允许优化相关联的值。
16.根据权利要求1所述的方法,其中所述计算设备包括用于执行未编译的软件相关指令的解释器,并且其中确定所述特定方法调用是否将作为虚拟方法调用执行包括确定所述特定方法调用是否将被所述解释器执行。
17.根据权利要求1所述的方法,其中,基于所述类层级确定所述特定方法调用是否将要被校验作为虚拟方法调用执行包括:
确定所述特定方法调用是否在所述软件中没有发生线程挂起的部分中;
在确定所述特定方法调用是在所述软件中没有发生线程挂起的部分中之后,确定在所述软件中没有发生线程挂起的部分中是否已经执行了作为虚拟方法调用的先前执行校验;以及
在确定已经在所述软件中没有发生线程挂起的部分中执行了所述先前执行校验之后,确定不校验所述特定方法调用将被校验作为虚拟方法调用执行。
18.一种计算设备,包括:
一个或多个处理器;以及
数据存储装置,至少包括存储在其上的计算机可执行指令,所述计算机可执行指令在由所述一个或多个处理器执行时使得所述计算设备执行功能,所述功能包括:
接收软件,所述软件使用将要编译成机器语言指令的一个或多个软件相关指令表达,其中所述软件包括特定方法调用;
执行所述软件的类层级分析以确定与所述软件相关联的类层级;
基于所述类层级来确定所述特定方法调用是否将要被校验作为虚拟方法调用执行;
在确定所述特定方法调用将要被校验作为虚拟方法调用执行之后,确定一个或多个特定机器语言指令,所述特定机器语言指令包括:
一个或多个保护机器语言指令,用于执行去优化指示符的校验,以确定所述特定方法调用是否将作为虚拟方法调用执行,其中所述去优化指示符在运行时是可修改的;以及
用于所述特定方法调用的一个或多个方法调用机器语言指令;以及
向所述计算设备的运行时系统提供所述一个或多个特定机器语言指令。
19.根据权利要求18所述的计算设备,进一步包括:
在运行时期间将附加软件加载到所述运行时系统中;以及
通过更新所述软件的所述类层级分析以考虑所述附加软件来确定更新的类层级分析。
20.一种其上存储有指令的非暂时性计算机可读介质,所述指令在由计算设备的一个或多个处理器执行时使所述计算设备执行功能,所述功能包括:
接收软件,所述软件使用将要编译成机器语言指令的一个或多个软件相关指令表达,其中所述软件包括特定方法调用;
执行所述软件的类层级分析以确定与所述软件相关联的类层级;
基于所述类层级来确定所述特定方法调用是否将要被校验作为虚拟方法调用执行;
在确定所述特定方法调用将要被校验作为虚拟方法调用执行之后,确定一个或多个特定机器语言指令,所述特定机器语言指令包括:
一个或多个保护机器语言指令,用于执行去优化指示符的校验,以确定所述特定方法调用是否将作为虚拟方法调用执行,其中所述去优化指示符在运行时是可修改的;以及
用于所述特定方法调用的一个或多个方法调用机器语言指令;以及
向所述计算设备的运行时系统提供所述一个或多个特定机器语言指令。
Applications Claiming Priority (5)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US201662378502P | 2016-08-23 | 2016-08-23 | |
US62/378,502 | 2016-08-23 | ||
US15/407,186 | 2017-01-16 | ||
US15/407,186 US10466985B2 (en) | 2016-08-23 | 2017-01-16 | Hybrid deoptimization mechanism for class hierarchy analysis |
PCT/US2017/032572 WO2018038778A1 (en) | 2016-08-23 | 2017-05-13 | Hybrid deoptimization mechanism for class hierarchy analysis |
Publications (2)
Publication Number | Publication Date |
---|---|
CN109564521A true CN109564521A (zh) | 2019-04-02 |
CN109564521B CN109564521B (zh) | 2023-10-10 |
Family
ID=61242581
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201780047204.2A Active CN109564521B (zh) | 2016-08-23 | 2017-05-13 | 用于类层级分析的混合去优化机制 |
Country Status (4)
Country | Link |
---|---|
US (1) | US10466985B2 (zh) |
EP (1) | EP3504617B1 (zh) |
CN (1) | CN109564521B (zh) |
WO (1) | WO2018038778A1 (zh) |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111770116A (zh) * | 2020-08-31 | 2020-10-13 | 支付宝(杭州)信息技术有限公司 | 一种执行智能合约的方法、区块链节点、存储介质 |
CN111814202A (zh) * | 2020-08-31 | 2020-10-23 | 支付宝(杭州)信息技术有限公司 | 一种执行智能合约的方法、区块链节点和存储介质 |
Families Citing this family (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US10846196B1 (en) | 2017-06-09 | 2020-11-24 | Azul Systems, Inc. | Code optimization for connected managed runtime environments |
CN109189508B (zh) * | 2018-08-27 | 2021-11-16 | 四川爱创科技有限公司 | 碎片视图缓存的优化方法 |
US10783082B2 (en) | 2019-08-30 | 2020-09-22 | Alibaba Group Holding Limited | Deploying a smart contract |
US11972240B2 (en) | 2021-12-03 | 2024-04-30 | Samsung Electronics Co., Ltd. | Systems and methods for automapping source code to machine code |
US20240095052A1 (en) * | 2022-09-16 | 2024-03-21 | Meta Platforms, Inc. | Machine Learning with Dynamic Bytecode Transformation |
Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20030115584A1 (en) * | 2001-12-13 | 2003-06-19 | Brian Fahs | Method and system to instrument virtual function calls |
US20030172205A1 (en) * | 2002-01-11 | 2003-09-11 | Bastian Richard Henry | Methods and components for mechanical computer |
US6704927B1 (en) * | 1998-03-24 | 2004-03-09 | Sun Microsystems, Inc. | Static binding of dynamically-dispatched calls in the presence of dynamic linking and loading |
US20100192139A1 (en) * | 2009-01-23 | 2010-07-29 | Sun Microsystems, Inc. | Efficient per-thread safepoints and local access |
US20130205282A1 (en) * | 2012-02-07 | 2013-08-08 | Microsoft Corporation | Transferring program execution from compiled code to interpreted code |
US20160062878A1 (en) * | 2014-08-30 | 2016-03-03 | Oracle International Corporation | Speeding up dynamic language execution on a virtual machine with type speculation |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2016171866A1 (en) * | 2015-04-24 | 2016-10-27 | Optimum Semiconductor Technologies, Inc. | Computer processor with separate registers for addressing memory |
-
2017
- 2017-01-16 US US15/407,186 patent/US10466985B2/en active Active
- 2017-05-13 EP EP17725124.6A patent/EP3504617B1/en active Active
- 2017-05-13 CN CN201780047204.2A patent/CN109564521B/zh active Active
- 2017-05-13 WO PCT/US2017/032572 patent/WO2018038778A1/en unknown
Patent Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6704927B1 (en) * | 1998-03-24 | 2004-03-09 | Sun Microsystems, Inc. | Static binding of dynamically-dispatched calls in the presence of dynamic linking and loading |
US20030115584A1 (en) * | 2001-12-13 | 2003-06-19 | Brian Fahs | Method and system to instrument virtual function calls |
US20030172205A1 (en) * | 2002-01-11 | 2003-09-11 | Bastian Richard Henry | Methods and components for mechanical computer |
US20100192139A1 (en) * | 2009-01-23 | 2010-07-29 | Sun Microsystems, Inc. | Efficient per-thread safepoints and local access |
US20130205282A1 (en) * | 2012-02-07 | 2013-08-08 | Microsoft Corporation | Transferring program execution from compiled code to interpreted code |
US20160062878A1 (en) * | 2014-08-30 | 2016-03-03 | Oracle International Corporation | Speeding up dynamic language execution on a virtual machine with type speculation |
Non-Patent Citations (1)
Title |
---|
ELVIRA ALBERT等: ""Resource Usage Analysis and its Application to Resource Certification"", 《FOSAD》 * |
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111770116A (zh) * | 2020-08-31 | 2020-10-13 | 支付宝(杭州)信息技术有限公司 | 一种执行智能合约的方法、区块链节点、存储介质 |
CN111814202A (zh) * | 2020-08-31 | 2020-10-23 | 支付宝(杭州)信息技术有限公司 | 一种执行智能合约的方法、区块链节点和存储介质 |
CN111814202B (zh) * | 2020-08-31 | 2020-12-11 | 支付宝(杭州)信息技术有限公司 | 一种执行智能合约的方法、区块链节点和存储介质 |
US11513827B2 (en) | 2020-08-31 | 2022-11-29 | Alipay (Hangzhou) Information Technology Co., Ltd. | Methods, blockchain nodes and storage media for executing smart contracts |
Also Published As
Publication number | Publication date |
---|---|
CN109564521B (zh) | 2023-10-10 |
US10466985B2 (en) | 2019-11-05 |
EP3504617A1 (en) | 2019-07-03 |
WO2018038778A1 (en) | 2018-03-01 |
US20180060048A1 (en) | 2018-03-01 |
EP3504617B1 (en) | 2020-07-08 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN109564521A (zh) | 用于类层级分析的混合去优化机制 | |
Seifzadeh et al. | A survey of dynamic software updating | |
ES2291278T3 (es) | Aparato y metodo para catalogar datos simbolicos para su empleo en analisis de funcionamiento de programas de ordenador. | |
US11556348B2 (en) | Bootstrapping profile-guided compilation and verification | |
Pukall et al. | JavAdaptor—Flexible runtime updates of Java applications | |
CN110704063A (zh) | 编译和执行智能合约的方法及装置 | |
US20130024675A1 (en) | Return address optimisation for a dynamic code translator | |
US20070277165A1 (en) | Debugging Interpreted Input | |
CN114144764A (zh) | 使用影子栈的栈跟踪 | |
Tomasco et al. | Using shared memory abstractions to design eager sequentializations for weak memory models | |
US11915056B2 (en) | Combination of multiple data processing and machine learning frameworks for a target hardware | |
US9841982B2 (en) | Locating import class files at alternate locations than specified in classpath information | |
US20080115109A1 (en) | Enhanced Hover Help For Software Debuggers | |
US7707565B2 (en) | Method for consistent and efficient management of program configuration and customizing data | |
US10379885B2 (en) | Enhanced local commoning | |
US20230083849A1 (en) | Parsing tool for optimizing code for deployment on a serverless platform | |
US20190317877A1 (en) | Application state monitoring | |
US11442708B2 (en) | Compiler-generated alternate memory-mapped data access operations | |
US8695000B1 (en) | Data transfer protection in a multi-tasking modeling environment having a protection mechanism selected by user via user interface | |
US20120159247A1 (en) | Automatically changing parts in response to tests | |
US10936290B2 (en) | Compile-time folding of assumed constant values | |
CN104166633B (zh) | 用于存储器访问保护的方法和系统 | |
Fan et al. | Advanced memory checking frameworks for MPI parallel applications in Open MPI | |
Mlinarić | Challenges in dynamic software updating | |
US20240119656A1 (en) | Method of Operating Shared GPU Resource and a Shared GPU Device |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |