CN108139896A - 扩展虚拟机指令集体系架构 - Google Patents
扩展虚拟机指令集体系架构 Download PDFInfo
- Publication number
- CN108139896A CN108139896A CN201680046654.5A CN201680046654A CN108139896A CN 108139896 A CN108139896 A CN 108139896A CN 201680046654 A CN201680046654 A CN 201680046654A CN 108139896 A CN108139896 A CN 108139896A
- Authority
- CN
- China
- Prior art keywords
- virtual machine
- parameter
- machine instructions
- information
- type
- 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
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
- G06F8/37—Compiler construction; Parser generation
-
- 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/45508—Runtime interpretation or emulation, e g. emulator loops, bytecode interpretation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
- G06F8/31—Programming languages or programming paradigms
- G06F8/315—Object-oriented languages
-
- 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/447—Target code generation
-
- 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
-
- 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/43—Checking; Contextual analysis
- G06F8/436—Semantic checking
- G06F8/437—Type checking
Abstract
操作包括编译过程和运行时过程。编译器编译代码以生成虚拟机指令。编译器进一步生成引用目标虚拟机指令的参数的相应参数类型的信息。编译器将信息存储在目标虚拟机指令外部并且与目标虚拟机指令相关联地存储。信息可以包含在目标虚拟机指令之前的另一个虚拟机指令中。运行时环境基于存储在目标虚拟机指令外部并且与目标虚拟机指令相关联地存储的信息来处理目标虚拟机指令。由外部信息引用的参数类型覆盖(a)由目标虚拟机指令本身引用的(b)由运行时环境推断出的和/或(c)与参数值相关联地直接存储的参数类型。
Description
技术领域
本公开涉及扩展虚拟机指令集体系架构。具体地,本公开涉及(a)存储在虚拟机指令外部并且与虚拟机指令相关联地存储的以及(b)引用虚拟机指令的参数的参数类型的信息。
权益要求
本申请要求于2015年8月9日提交的美国临时申请62/202,909和于2016年1月25日提交的美国非临时申请15/005,448的权益和优先权。
通过引用并入
本申请由此通过引用以下专利申请中的每一个将其并入,通过引用如同包括在本文中一样:
(a)于2015年8月9日提交的标题为“Extending A Virtual Machine InstructionSet Architecture”的申请62/202,909;
(b)于2016年1月25日提交的标题为“Extending A Virtual MachineInstruction Set Architecture”的申请15/005,448;
(c)于2015年4月29日提交的标题为“Speeding Up Dynamic Language Executionon a Virtual Machine with Type Speculation”的申请14/699,141;
(d)于2015年4月29日提交的标题为“Handling Value Types”的申请14/699,129;
(e)于2015年3月17日提交的标题为“Metadata-Driven DynamicSpecialization”的申请14/660,143;
(f)于2015年3月17日提交的标题为“Structural identification ofDynamically Generated,Pattern-Instantiation,Generated Classes”的申请14/660,177。
(g)于2015年3月17日提交的标题为“Decomposing a Generic Class intoLayers”的申请14/660,604;
(h)于2015年4月13日提交的标题为“Target Typing-dependent CombinatorialCode Analysis”的申请14/685,386;
(i)于2015年4月21日提交的标题为“Dependency-driven Co-Specialization ofSpecialized Classes”的申请14/692,590;
(j)于2015年4月21日提交的标题为“Partial Specialization of GenericClasses”的申请14/692,592;
(k)于2015年4月21日提交的标题为“Manual Refinement of SpecializedClasses”的申请14/692,593;
(l)于2015年4月21日提交的标题为“Wholesale Replacement of SpecializedClasses”的申请14/692,601;以及
(m)于2015年6月18日提交的标题为“Optimistically Assuming Types in aDynamically Typed Language”的申请14/743,912。
背景技术
指令集或指令集体系架构(ISA)是与编程相关的计算机体系架构的一部分,包括本地数据类型、指令、寄存器、寻址模式、存储器体系架构、中断和异常处理以及外部I/O。ISA包括一组操作码(机器语言)的规范以及由特定处理器实现的本地命令。
Java字节码是由编译器(例如,javac编译器)生成的Java虚拟机(JVM)的指令集。每个字节码由一个或者在一些情况下由两个表示指令(操作码)的字节以及零个或多个用于传递参数的字节组成。一些操作码适用于特定的参数类型。例如,操作码“60”(助记符“iadd”)将两个整数类型的值相加。在另一个示例中,操作码“62”(助记符“fadd”)将两个浮点类型的值相加。关于JVM的结构的细节被包括在与本文一起的附录A中。关于JVM指令集的细节被包括在与本文一起的附录B中。
优化编译器是使可执行计算机程序的一些属性最小化或最大化的编译器。例如,可以配置优化编译器用于增加运行时性能或者减少由程序使用的存储器量。编译器优化通常是使用一系列优化变换来实现的,这些变换是取得程序并将其变换以产生使用更少资源或更快地执行的语义上等同的输出程序的算法。编译器优化可以被划分为多个类别,诸如循环优化、数据流优化、基于SSA的优化、代码生成器优化、边界检查消除、死代码限制等。
在本部分中描述的方法是可以实行的方法,但不一定是先前已经被构想或实行的方法。因此,除非另有说明,否则不应当假设在本部分中描述的任何方法仅凭其包括在本部分中就被认为是现有技术。
附图说明
在附图的图中,实施例是以示例的方式而非限制的方式进行图示的。应当注意的是,在本公开中对“实施例”或“一个实施例”的引用不一定是指相同的实施例,并且它们意味着至少一个。在附图中:
图1图示了可以实践本文所描述的技术的示例计算体系架构。
图2是图示适合于实现本文所描述的方法和特征的计算机系统的一个实施例的框图。
图3图示了根据一个或多个实施例的以框图形式的示例虚拟机存储器布局。
图4图示了根据一个或多个实施例的以框图形式的示例帧。
图5图示了根据一个或多个实施例的字节码。
图6图示了根据一个或多个实施例的用于处理虚拟机指令的一组操作。
图7示出了根据一个或多个实施例的系统。
具体实施方式
在以下描述中,为了解释的目的,阐述了许多具体细节以便提供透彻的理解。可以在没有这些具体细节的情况下实践一个或多个实施例。在一个实施例中描述的特征可以与在不同实施例中描述的特征组合。在一些示例中,参考框图形式来描述众所周知的结构和设备,以便避免不必要地模糊本发明。
1.总体概述
2.体系架构概述
2.1示例类文件结构
2.2示例虚拟机体系架构
2.3加载、链接和初始化
3.扩展虚拟机指令集体系架构
3.1引用虚拟机指令的参数类型
3.2基于外部引用的参数类型来处理虚拟机指令
3.3所引用的参数类型的示例使用
4.其它;扩展
5.硬件概述
1.总体概述
实施例涉及引用目标虚拟机指令的参数的参数类型的信息的生成和使用。该信息可以引用与存储在常量池中的特定位置(例如,索引)处的类型值相对应的变量。变量可以对应于与返回类型值的方法相关联的MethodHandle(方法句柄)。类型值在生成引用变量的信息时不一定是已知的。
在实施例中,编译器在代码编译过程中生成上述信息。编译器可以将信息存储在包括目标虚拟机指令的同一组字节码内。具体地,编译器可以生成包括(a)目标虚拟机指令和(b)存储在目标虚拟机指令外部并且与目标虚拟机指令相关联地存储的信息的字节码。作为示例,信息可以被包括在同一组字节码内的目标虚拟机指令之前的另一个虚拟机指令内。
在实施例中,运行时环境基于由存储在目标虚拟机指令外部并与目标虚拟机指令相关联地存储的信息所引用的相应参数类型来处理具有一个或多个参数的目标虚拟机指令。作为示例,运行时环境从数据结构中选择要用于基于参数类型来执行目标虚拟机指令的多个字节。运行时环境可以处理包括(a)与这样的(引用参数类型的)信息相关联的虚拟机指令和(b)不与这样的信息相关联的虚拟机指令两者的字节码。
取决于虚拟机指令是否与引用参数类型的外部信息相关联,相同的虚拟机指令可以由运行时环境以不同方式处理。由存储在目标虚拟机指令外部的信息所引用的参数类型可以覆盖(a)由目标虚拟机指令本身所引用的参数类型或者(b)由运行时环境基于先前执行的指令推断出的参数类型。
在本说明书中描述和/或在权利要求中所述的一个或多个实施例可能不包括在该总体概述部分中。
2.体系架构概述
图1图示了可以实践本文所描述的技术的示例体系架构。关于示例体系架构所描述的软件和/或硬件组件可以被省略或与不同于本文所描述的功能集合的功能集合相关联。根据一个或多个实施例,可以在环境内使用本文中未描述的软件和/或硬件组件。因此,示例环境不应当被解释为限制任何权利要求的范围。
如图1所示,计算体系架构100包括源代码文件101,源代码文件101由编译器102编译成表示将被执行的程序的类文件103。然后由执行平台112加载和执行类文件103,执行平台112包括运行时环境113、操作系统111以及使得在运行时环境113和操作系统之间能够通信的一个或多个应用编程接口(API)110。运行时环境112包括虚拟机104,虚拟机104包括各种组件,诸如(可以包括垃圾收集器的)存储器管理器105、检查类文件103的有效性的类文件验证器106、定位和构建类的存储器中表示的类加载器107、用于执行虚拟机104代码的解释器108以及用于产生优化的机器级代码的即时(JIT)编译器109。
在实施例中,计算体系架构100包括源代码文件101,源代码文件101包含已经用诸如Java、C、C++、C#、Ruby、Perl等特定编程语言编写的代码。因此,源代码文件101遵循针对关联语言的特定的一组句法和/或语义规则。例如,用Java编写的代码遵循Java语言规范。然而,由于规范随着时间被更新和修订,因此源代码文件101可能与指示源代码文件101遵循的规范的修订版的版本号相关联。用于编写源代码文件101的确切编程语言通常不是关键的。
在各种实施例中,编译器102将根据针对程序员的便利性的规范编写的源代码转换为可由特定机器环境直接执行的机器或目标代码,或者可由能够在各种特定机器环境之上运行的虚拟机104执行的诸如字节码的中间表示(“虚拟机代码/指令”)。虚拟机指令可由虚拟机104以比源代码更直接和高效的方式执行。将源代码转换为虚拟机指令包括将源代码功能从语言映射到利用底层资源(诸如数据结构)的虚拟机功能。通常,由程序员经由源代码在简单术语中呈现的功能被转换为更复杂的步骤,这些步骤更直接地映射到由虚拟机104所驻留的底层硬件所支持的指令集。
一般而言,程序作为编译的或者解释的程序来执行。当程序被编译时,在执行之前将代码从第一语言全局变换为第二语言。由于变换代码的工作是提前执行的,因此编译代码往往具有优异的运行时性能。此外,由于在执行之前全局进行变换,因此可以使用诸如常量合并(constant folding)、死代码消除(dead code elimination)、内联(inlining)等技术来分析和优化代码。然而,取决于正在被执行的程序,启动时间可能很长。此外,插入新代码将需要使程序下线、重新被编译和重新被执行。对于被设计为允许在程序的执行期间插入代码的许多动态语言(诸如Java),纯编译的方法可能是不合适的。当程序被解释时,逐行读取程序的代码,并且在程序执行的同时将程序的代码转换为机器级指令。结果,程序具有(可以几乎立即开始执行的)短的启动时间,但是运行时性能由于即时执行变换而降低。此外,由于每条指令被单独分析,因此无法执行依赖于对程序的更全面分析的许多优化。
在一些实施例中,虚拟机104包括解释器108和JIT编译器109(或实现这两者的方面的组件),并且使用解释和编译技术的组合来执行程序。例如,虚拟机104可以初始地通过经由解释器108解释表示程序的虚拟机指令来开始,同时跟踪与程序行为相关的统计信息,诸如不同的代码部分或代码块多久被虚拟机104执行一次。一旦代码块超过阈值(变“热”),虚拟机104就调用JIT编译器109来执行对该块的分析并且生成优化的机器级指令,优化的机器级指令代替“热”代码块用于未来执行。由于程序往往花费大部分时间执行整个代码的一小部分,因此只编译程序的“热”部分可以提供与完全编译代码相似的性能,但没有启动代价。此外,虽然优化分析被约束到正被代替的“热”块,但是仍然存在比单独转换每条指令大得多的优化潜力。在上述示例中存在多种变体,诸如分层编译。
为了提供清楚的示例,源代码文件101已经被图示为要由执行平台111执行的程序的“顶层”表示。虽然计算体系架构100将源代码文件101绘为“顶层”程序表示,但是在其它实施例中,源代码文件101可以是经由将不同语言的代码文件处理成源代码文件101的语言的“更高层”编译器所接收的中间表示。以下公开中的一些示例假设源代码文件101遵循基于类的面向对象的编程语言。然而,这不是对利用本文所描述的特征的要求。
在实施例中,编译器102接收源代码文件101作为输入,并且将源代码文件101转换为以由虚拟机104所期望的格式的类文件103。例如,在JVM的上下文中,Java虚拟机规范定义了预期类文件103要遵循的特定类文件格式。在一些实施例中,类文件103包含已从源代码文件101转换的虚拟机指令。然而,在其它实施例中,类文件103也可以包含其它结构,诸如标识常量值的表和/或与各种结构(类、字段、方法等)相关的元数据。
以下讨论假设类文件103中的每一个表示在源代码文件101中定义的(或由编译器102/虚拟机104动态生成的)相应的“类”。然而,前述假设不是严格的要求并且将取决于虚拟机104的实现。因此,无论类文件103的确切格式如何,仍然可以执行本文所描述的技术。在一些实施例中,类文件103被划分为一个或多个“库”或“包”,“库”或“包”中的每一个包括提供相关功能的类的集合。例如,库可以包含实现输入/输出(I/O)操作、数学工具、密码技术、图形实用工具等的一个或多个类文件。进一步地,一些类(或这些类内的字段/方法)可以包括将其使用限制在特定类/库/包内或限制到具有适当权限的类的访问限制。
2.1示例类文件结构
图2图示了根据实施例的以框图形式的类文件200的示例结构。为了提供清楚的示例,本公开的其余部分假设计算体系架构100的类文件103遵循本部分中所描述的示例类文件200的结构。然而,在实际环境中,类文件200的结构将取决于虚拟机104的实现。进一步地,本文所讨论的一个或多个特征可以修改类文件200的结构,以例如添加附加的结构类型。因此,类文件200的确切结构对于本文所描述的技术不是关键的。为了部分2.1的目的,“类”或“当前类”是指由类文件200表示的类。
在图2中,类文件200包括常量表201、字段结构208、类元数据204和方法结构209。在实施例中,常量表201是除了其它功能之外还充当类的符号表的数据结构。例如,常量表201可以存储与在源代码文件101中使用的各种标识符相关的数据,诸如类型、范围、内容和/或位置。常量表201具有针对值结构202(表示整型(int)、长整型(long)、双精度型(double)、浮点型(float)、字节型(byte)、字符串(string)等类型的常量值)、类信息结构203、名称和类型信息结构205、字段引用结构206以及由编译器102从源代码文件101导出的方法引用结构207的条目。在实施例中,常量表201被实现为将索引i映射到结构j的数组。然而,常量表201的确切实现不是关键的。
在一些实施例中,常量表201的条目包括对其它常量表201条目进行索引的结构。例如,针对值结构202中的表示字符串的一个值结构202的条目可以保持将该值结构的“类型”标识为字符串的标签以及指向常量表201的存储表示字符串的ASCII字符的字符型(char)值、字节型值或整型值的一个或多个其它值结构202的索引。
在实施例中,常量表201的字段引用结构206保持:指向常量表201中表示定义该字段的类的类信息结构203中的一个的索引,和指向常量表201中提供该字段的名称和描述符的名称和类型信息结构205中的一个的索引。常量表201的方法引用结构207保持:指向常量表201中表示定义该方法的类的类信息结构203中的一个的索引,和指向常量表201中提供方法的名称和描述符的名称和类型信息结构205中的一个的索引。类信息结构203保持指向常量表201中的值结构202中的保持相关联的类的名称的一个值结构202的索引。
名称和类型信息结构205保持:指向常量表201中的值结构202中的存储字段/方法的名称的一个值结构202的索引,和指向常量表201中的值结构202中的存储描述符的一个值结构202的索引。
在实施例中,类元数据204包括类的元数据,诸如(一个或多个)版本号、常量池中的条目数量、字段数量、方法数量、访问标志(类是否是公开的(public)、私有的(private)、最终的(final)、抽象的(abstract)等)、指向常量表201的类信息结构203中的标识当前类的一个类信息结构203的索引、指向常量表201的类信息结构203中的标识超类(superclass)(如果有的话)的一个类信息结构203的索引等。
在实施例中,字段结构208表示标识类的各种字段的一组结构。字段结构208为类的每个字段存储字段的访问器标志(字段是否是静态的(static)、公开的、私有的、最终的等)、指向常量表201中的值结构202中的保持字段的名称的一个值结构202的索引以及指向常量表201中的值结构202中的保持字段的描述符的一个值结构202的索引。
在实施例中,方法结构209表示标识类的各种方法的一组结构。方法结构209为类的每个方法存储方法的访问器标志(例如,方法是否是静态的、公开的、私有的、同步的(synchronized)等)、指向常量表201中的值结构202中的保持方法的名称的一个值结构202中的索引、指向常量表201中的值结构202中的保持方法的描述符的一个值结构202的索引以及与如源代码文件101中所定义的方法的主体相对应的虚拟机指令。
在实施例中,描述符表示字段或方法的类型。例如,描述符可以被实现为遵循特定语法的字符串。虽然确切的句法不是关键的,但以下将描述几个示例。
在描述符表示字段的类型的示例中,描述符标识由字段保持的数据的类型。在实施例中,字段可以保持基本类型、对象或数组。当字段保持基本类型时,描述符是标识基本类型的字符串(例如,“B”=byte、“C”=char、“D”=double、“F”=float、“I”=int、“J”=long int等)。当字段保持对象时,描述符是标识对象的类名称的字符串(例如,“LClassName”)。在这种情况下,“L”指示引用,因此“L ClassName”表示对类ClassName的对象的引用。当字段是数组时,描述符标识由数组保持的类型。例如,“[B”指示字节的数组,其中“[”指示数组并且“B”指示数组保持基本字节类型。然而,由于数组可以嵌套,因此数组的描述符也可以指示嵌套。例如,“[[L ClassName”指示数组,其中每个索引保持保持类ClassName的对象的数组。在一些实施例中,ClassName是完全限定(fully qualified)的,并且包括类的简单名称以及类的路径名。例如,ClassName可以指示文件存储在包、库或托管类文件200的文件系统中的位置。
在方法的情况下,描述符标识方法的参数和方法的返回类型。例如,方法描述符可以按照一般形式“({Parameter Descriptor})ReturnDescriptor”,其中{ParameterDescriptor}是表示参数的字段描述符的列表,并且ReturnDescriptor是标识返回类型的字段描述符。例如,字符串“V”可以用于表示空(void)返回类型。因此,在源代码文件101中定义为“Object m(int I,double d,Thread t){...}”的方法与描述符“(I D LThread)L Object”相匹配。
在实施例中,保持在方法结构209中的虚拟机指令包括引用常量表201的条目的操作。使用Java作为示例,考虑以下类:
在以上示例中,在类A中定义Java方法add12and13,该方法不采用参数并且返回整数。方法add12and13的主体调用类B的静态方法addTwo,该静态方法AddTwo采用常量整数值12和13作为参数,并且返回结果。因此,在常量表201中,编译器102除其它条目之外还包括与对方法B.addTwo的调用相对应的方法引用结构。在Java中,对方法的调用向下编译为JVM的字节码中的invoke命令(在这种情况下为invokestatic,因为addTwo是类B的静态方法)。向invoke命令提供指向常量表201中与方法引用结构相对应的索引,该方法引用结构标识定义addTwo的类“B”、addTwo的名称“addTwo”以及addTwo的描述符“(I I)I”。例如,假设前述方法引用被存储在索引4处,则字节码指令可以表现为“invokestatic#4”。
由于常量表201引用符号上具有携带标识信息的结构的类、方法和字段而不是直接引用存储器位置,因此常量表201的条目被称为“符号引用”。符号引用被用于类文件103的一个原因是因为在一些实施例中一旦类被加载到运行时环境112中,编译器102就不知道将如何存储类以及将类存储在哪里。如在部分2.3中将描述的,在所引用的类(及相关联的结构)已经被加载到运行时环境中并且分配到具体存储器位置之后,最终由虚拟机104将符号引用的运行时表示解析为实际存储器地址。
2.2示例虚拟机体系架构
图3图示了根据实施例的以框图形式的示例虚拟机存储器布局300。为了提供清楚的示例,其余的讨论将假设虚拟机104遵循图3中绘出的虚拟机存储器布局300。此外,虽然虚拟机存储器布局300的组件可以被称为存储器“区域”,但是不要求存储器区域是连续的。
在图3图示的示例中,虚拟机存储器布局300被划分为共享区域301和线程区域307。共享区域301表示在虚拟机104上执行的各种线程之间共享的结构被存储的存储器中的区域。共享区域301包括堆302和每个类的(per-class)区域303。在实施例中,堆302表示运行时数据区域,从该运行时数据区域分配用于类实例和数组的存储器。在实施例中,每个类的区域303表示存储与各个类有关的数据的存储器区域。在实施例中,对于每个加载的类,每个类的区域303包括表示来自类、字段和方法数据306的常量表201的数据(例如,以保持类的静态字段)的运行时常量池304,并且包括表示针对类的方法的虚拟机指令的方法代码305。
线程区域307表示存储特定于各个线程的结构的存储器区域。在图3中,线程区域307包括表示由不同线程利用的每个线程的(per-thread)结构的线程结构308和线程结构311。为了提供清楚的示例,图3中绘出的线程区域307假设虚拟机104上正在执行两个线程。然而,在实际环境中,虚拟机104可以执行任何任意数量的线程,其中线程结构的数量对应地缩放。
在实施例中,线程结构308包括程序计数器309和虚拟机堆栈310。类似地,线程结构311包括程序计数器312和虚拟机堆栈313。在实施例中,程序计数器309和程序计数器312存储由它们的相应线程正在执行的虚拟机指令的当前地址。
因此,当线程逐步运行指令时,更新程序计数器以维持指向当前指令的索引。在实施例中,虚拟机堆栈310和虚拟机堆栈313均存储保持局部变量和部分结果并且还用于方法调用和返回的针对虚拟机堆栈310和虚拟机堆栈313的相应线程的帧(frame)。
在实施例中,帧是用于存储数据和部分结果、返回方法的值以及执行动态链接的数据结构。每次调用方法时,创建新帧。当使得帧被生成的方法完成时,帧被销毁。因此,当线程执行方法调用时,虚拟机104生成新帧并将该帧推送到与线程相关联的虚拟机堆栈上。
当方法调用完成时,虚拟机104将方法调用的结果传递回到先前帧,并将当前帧从堆栈中弹出。在实施例中,对于给定的线程,一个帧在任何点处都是活动的。这种活动帧被称为当前帧,使得生成当前帧的方法被称为当前方法,并且当前方法所属的类被称为当前类。
图4图示了根据实施例的以框图形式的示例帧400。为了提供清楚的示例,其余的讨论将假设虚拟机堆栈310和虚拟机堆栈313的帧遵循帧400的结构。
在实施例中,帧400包括局部变量401、操作数堆栈402和运行时常量池引用表403。在实施例中,局部变量401被表示为变量数组,每个变量均保持值,例如,布尔型(Boolean)、字节型、字符型、短整型(short)、整型、浮点型或引用型(reference)。进一步地,一些值类型(诸如长整型或双精度型)可以由数组中的多于一个的条目表示。局部变量401用于在方法调用上传递参数并存储部分结果。例如,当响应于调用方法而生成帧400时,参数可以存储在局部变量401内的预定位置中,诸如与调用中的第1个至第N个参数相对应的索引1-N。
在实施例中,当虚拟机104创建帧400时,操作数堆栈402默认为空。然后,虚拟机104从当前方法的方法代码305中供给指令以将来自局部变量501的常量或值加载到操作数堆栈502上。其它指令从操作数堆栈402获取操作数、对操作数进行操作、并将结果推送回到操作数堆栈402上。此外,操作数堆栈402用于准备将被传递给方法并且接收方法结果的参数。例如,被调用的方法的参数可以在向方法发出调用之前被推送到操作数堆栈402上。然后,虚拟机104为方法调用生成新帧,其中先前帧的操作数堆栈402上的操作数被弹出并被加载到新帧的局部变量401中。当所调用的方法终止时,从虚拟机堆栈中弹出新帧并且将返回值推送到先前帧的操作数堆栈402上。
在实施例中,运行时常量池引用表403包含对当前类的运行时常量池304的引用。运行时常量池引用表403用于支持解析。解析是其中将常量池304中的符号引用转换为具体存储器地址的过程,从而根据需要来加载类以解析尚未定义的符号并将变量访问转换为存储结构中的与这些变量的运行时位置相关联的适当偏移。
2.3加载、链接和初始化
在实施例中,虚拟机104动态地加载、链接和初始化类。加载是找到具有特定名称的类并在运行时环境112的存储器内从该类的关联类文件200创建表示的过程。例如,为虚拟机存储器布局300的每个类的区域303内的类创建运行时常量池304、方法代码305以及字段和方法数据306。链接是取得类的存储器中表示并将该存储器中表示与虚拟机104的运行时状态组合使得可以执行类的方法的过程。初始化是执行类构造函数(constructor)以设置字段的开始状态和类的方法数据306和/或在堆302上针对初始化的类创建类实例的过程。
以下是可以由虚拟机104实现的加载、链接和初始化技术的示例。然而,在许多实施例中,可以交错这些步骤使得加载初始类,然后在链接期间加载第二个类以解析在第一个类中找到的符号引用,这进而导致第三个类被加载等。因此,在加载、链接和初始化阶段中的进展可能因类而异。进一步地,一些实施例可以延迟(“懒惰”执行)加载、链接和初始化过程的一个或多个功能,直到实际上需要该类。例如,可以延迟方法引用的解析,直到执行调用方法的虚拟机指令。因此,对于每个类,执行步骤的确切时间在实现方式之间可能有很大不同。
为了开始加载过程,虚拟机104通过调用加载初始类的类加载器107来启动。指定初始类的技术将因实施例而不同。例如,一种技术可以使虚拟机104在启动时接受指定初始类的命令行参量(argument)。
为了加载类,类加载器107对与该类相对应的类文件200进行句法分析,并且确定类文件200是否是良好构造的(满足虚拟机104的句法期望)。如果不是良好构造的,则类加载器107生成错误。例如,在Java中,可能以异常的形式生成错误,该异常被抛出给异常处理器用于处理。否则,类加载器107通过为每个类的区域303内的类分配运行时常量池304、方法代码305以及字段和方法数据306来生成类的存储器中表示。
在一些实施例中,当类加载器107加载类时,类加载器107还递归加载所加载的类的超类。例如,虚拟机104可以确保在继续进行特定类的加载、链接和初始化过程之前,加载、链接和/或初始化该特定类的超类。
在链接期间,虚拟机104验证类、准备类、并且执行在类的运行时常量池304中定义的符号引用的解析。
为了验证类,虚拟机104检查类的存储器中表示是否在结构上正确。例如,虚拟机104可以检查除通用类Object之外的每个类具有超类、检查最终类没有子类以及最终方法没有被覆盖、检查常量池条目是否彼此一致、检查当前类是否具有对常量池304中引用的类/字段/结构的正确访问许可、检查方法的虚拟机104代码将不会引起意外行为(例如,确保跳转指令不会将虚拟机104发送到超出该方法的结束范围)等。在验证期间执行的确切检查取决于虚拟机104的实现。在一些情况下,验证会导致将加载附加的类,但不一定要求这些类在继续进行之前也被链接。例如,假设类A包含对类B的静态字段的引用。在验证期间,虚拟机104可以检查类B以确保所引用的静态字段实际上存在,这可能导致类B的加载,但不一定导致类B的链接或初始化。然而,在一些实施例中,可以延迟某些验证检查直到以后的阶段,诸如在符号引用的解析期间被检查。例如,一些实施例可以延迟检查对符号引用的访问许可,直到这些引用被解析。
为了准备类,虚拟机104将位于字段内的静态字段和类的方法数据306初始化为默认值。在一些情况下,将静态字段设置为默认值可能与运行类的构造函数不同。例如,验证过程可以将静态字段清零或将其设置为构造函数期望这些字段在初始化期间所具有的值。
在解析期间,虚拟机104从包括在类的运行时常量池304中的符号引用动态地确定具体存储器地址。为了解析符号引用,虚拟机104利用类加载器107加载在符号引用中标识的类(如果尚未被加载)。一旦该类被加载,虚拟机104就知道所引用类及其字段/方法的每个类的区域303内的存储器位置。然后,虚拟机104用对所引用类、字段或方法的具体存储器位置的引用替换符号引用。在实施例中,虚拟机104对解析进行高速缓存,在当虚拟机104处理另一个类时遇到同样的类/名称/描述符的情况下将重用该解析。例如,在一些情况下,类A和类B可能调用类C的相同方法。因此,当对类A执行解析时,该结果可以被高速缓存并且在解析类B中的相同符号引用期间被重用以减少开销。
在一些实施例中,在链接期间解析符号引用的步骤是可选的。例如,实施例可以以“懒惰”的方式执行符号解析,从而延迟解析的步骤直到执行需要所引用类/方法/字段的虚拟机指令。
在初始化期间,虚拟机104执行类的构造函数以设置该类的开始状态。例如,初始化可以初始化类的字段和方法数据306并且生成/初始化由构造函数创建的堆302上的任何类实例。例如,针对类的类文件200可以指定特定方法为用于设置开始状态的构造函数。因此,在初始化期间,虚拟机104执行该构造函数的指令。
在一些实施例中,虚拟机104通过初始地检查是否在所引用类中定义字段/方法来执行字段和方法引用上的解析。除此之外,虚拟机104针对所引用字段/方法来递归地搜索所引用类的超类,直到定位该字段/方法或者到达顶层超类,在到达顶层超类的情况下生成错误。
3.扩展虚拟机指令集体系架构
如上所述,编译器可以将源代码转换为包括可由虚拟机执行的虚拟机指令的字节码。一个或多个实施例适用于可以对不同类型的参数进行操作的特定虚拟机指令。由Java虚拟机支持的可以对不同类型的参数进行操作的虚拟机指令的示例包括但不限于:aload、astore、areturn、aaload、aastore、anewarray、multianewarray和checkcast。
不同类型的参数包括原始类型(primitive type)的参数和引用类型(referencetype)的参数。原始类型包括字节型、短整型、整型、长整型、浮点型、双精度型、字符型、字符串型、对象型、布尔型和返回地址型(returnAddress)。引用类型包括类类型、数组类型和接口类型。
参数类型可以对应于或包括与虚拟机指令相关联的语义。在一个示例中,可以与“值类型”相关地使用参数类型。值类型可以表示用户定义的聚合类型,而不具有可以在源代码文件的语言和虚拟机的指令集中显露的在不牺牲封装的情况下支持存储器高效和局部高效的编程习惯用法的特性。
在实施例中,值类型是可以包含原始类型、引用类型或者甚至其它值类型的异构聚合。在一些实施例中,例如在Java中,用于类的许多定义和封装机制可以用于容易地且安全地构建基于新值类型构造的数据结构。例如,值类型可以被视为一种特殊标记的和限制的类定义形式。从语义的角度来看,值类型函数作为虚拟机用户的一种新的原始类型。“值类型”的详细描述被包括在与本文一起的附录C中。
3.1引用虚拟机指令的参数类型
图5图示了包括任何数量的虚拟机指令的字节码(例如,字节码502)的示例。每个虚拟机指令包括任何数量的参数。为了清楚起见,在图5中图示了并且在下面描述虚拟机指令506和参数508。信息504可以对应于与虚拟机指令506相关联的另一条虚拟机指令,如下面详细描述的。
在实施例中,编译器生成并存储引用虚拟机指令506的参数508的参数类型510的信息(例如,信息504)。编译器将信息504存储在与虚拟机指令506相同的一组字节码502内。编译器将信息504存储在虚拟机指令506外部并与虚拟机指令506相关联地存储。虚拟机基于参数类型510来处理虚拟机指令506,如下面参考图6所描述的。参数510覆盖由虚拟机指令506本身所引用的或者可以由虚拟机基于先前执行的虚拟机指令推断出的其它参数类型(例如,参数类型512)(下面参考图6详细描述)。
在实施例中,信息504和虚拟机指令506之间的关联可以由编译器至少基于信息504相对于虚拟机506的相邻关系和/或位置来指出(并且后面由虚拟机标识)。作为示例,可以将存储在虚拟机指令506外部并紧接在虚拟机指令506之前的信息确定为与虚拟机指令506相关联。在另一个实施方案中,可以将存储在虚拟机指令506外部并紧随其后的信息确定为与虚拟机指令506相关联。
在实施例中,信息504通过引用与参数类型510相对应的变量来引用参数类型510。变量的值(即,参数类型510)可以被存储在常量表的特定位置处。可替代地或附加地,可以指定常量表的特定位置用于存储变量的值。当引用变量的信息504(a)被生成并且(b)存储为与虚拟机指令506相关联并且在其外部时,变量的值可能是已知的或者可能是未知的。
在实施例中,信息504通过引用与方法句柄相对应的变量(参见Java API中的类MethodHandle)来引用参数类型510。方法句柄是对返回参数类型510的底层方法的类型化的直接可执行的引用。
在示例中,信息504包括对指示虚拟机指令506的参数508的参数类型510的常量池的元数据引用。元数据引用可以是例如指向与虚拟机指令506相对应的类的常量池的16位引用。所引用的常量池条目可以是描述类型的任何种类的条目。
在实施例中,信息504被实现为与虚拟机指令506相邻(例如,紧接在虚拟机指令506之前)被存储的第二虚拟机指令。第二虚拟机指令包括引用虚拟机指令506的参数508的参数类型510的参数。第二虚拟机指令的参数可以引用与虚拟机指令506的参数508的参数类型510相对应的变量。第二虚拟机指令的参数可以包括对指示虚拟机指令506的参数508的参数类型510的常量池的元数据引用。
在实施例中,特殊的关键字可以用于以信号形式告知对虚拟机指令506的参数508的参数类型510的引用。作为示例,信息504对应于包括特定关键字“类型化(typed)”的第二虚拟机指令。该特定关键字以信号形式向运行时环境告知第二虚拟机包括引用虚拟机指令506的参数508的参数类型510的信息。
作为示例,虚拟机指令506(被称为“操作码(opcode)”)之前是以以下示例格式中的一个的类型信息;
在以上示例格式中,“typed”是以信号形式告知<opcode>后面的类型信息的关键字。在格式1中,将<opcode>的参数(即,操作码对其进行操作的参数)存储为局部变量。<opcode>的示例(即,与格式1一起使用的指令)包括但不限于:aload_0,1,2,3、astore_0,1,2,3、dup、dup_x1、dup_x2、dup2、dup2_x1、dup2_x2、areturn、aalaod、aastore和cmp_eq。在格式2中,<opcode>的参数(即,操作码对其进行操作的参数)在<opcode>之后。<opcode>的示例(即,与格式2一起使用的指令)包括但不限于:aload、astore、anewarray、multinewarray和checkcast。
3.2基于外部引用的参数类型来处理虚拟机指令
图6图示了根据一个或多个实施例的用于处理具有至少一个参数的虚拟机指令的一组示例操作。例如,虚拟机指令可以对存储在数据结构(例如,由虚拟机维护的堆栈)中的参数进行操作。例如,将执行虚拟机指令的结果存储在堆栈中。接下来执行的虚拟机指令对与在堆栈中最后存储的值(来自先前执行的虚拟机指令的结果)相对应的参数进行操作。虚拟机指令可以指定操作码之后的参数。
可以重新排列、省略或修改以下参考图6所描述的操作。作为所描述的操作的替代或附加,可以执行下面未描述的附加操作。因此,如下所述的操作不应当被解释为限制本文所述的任何权利要求的范围。
一个或多个实施例包括确定对至少一个参数进行操作的虚拟机指令是否与引用相应参数类型的外部信息相关联地存储(操作602)。
处理虚拟机指令的虚拟机可以被配置为检测虚拟机指令外部的信息,该信息引用虚拟机指令的参数的参数类型。如上所述,这种信息可以被存储在与虚拟机指令相同的一组字节码内。此外,这种信息可以与虚拟机指令相关联地存储。
在实施例中,虚拟机基于与所定义的一组标准匹配的信息来检测引用参数类型的信息。标准可以要求例如(a)信息相对于虚拟机指令的位置或者(b)特定的关键字。作为示例,编译器将引用第一虚拟机指令的参数的参数类型的信息存储在(a)紧接在第一虚拟机指令之前以及(b)包括特定关键字“typed”的第二虚拟机指令中。虚拟机(或运行时环境)被配置为确定包括“typed”的虚拟机指令与引用紧接着虚拟机指令之后的参数的参数类型的信息相对应。在其它示例中,编译器可以包括以由虚拟机识别的其它格式的引用虚拟机指令的参数的参数类型的信息。
如果检测到引用虚拟机指令的参数的参数类型的外部信息,则虚拟机基于由外部信息引用的参数类型来处理虚拟机指令(操作604)。(基于由外部信息引用的参数类型将进行处理的)这个虚拟机指令可以是独立于(并且甚至不存在)由外部信息引用的参数类型的完整且完全可执行的指令。存储在第一虚拟机指令外部并且与第一虚拟机指令相关联地存储的信息为了如由外部信息所指示的更特定目的而对第一虚拟机指令的操作进行细化、裁剪或特定化。在没有外部信息的情况下,第一虚拟机指令仍然可以使用适用于包括特定目的的各种目的的一组类型来执行。
为了基于由外部信息引用的参数类型来处理虚拟机指令,必须首先确定参数类型。信息可以引用被访问以确定对应参数类型的存储器位置和/或变量。信息可以引用与被执行以返回参数类型的方法相关联的MethodHandle。
基于由外部信息引用的参数类型来处理虚拟机指令包括执行基于参数类型选择的动作。作为示例,可以基于由外部信息引用的参数类型来选择将从数据结构(例如,堆栈)进行处理的多个字节。字节可以用于数据移动操作、数据比较操作或者数据检索操作。作为其它示例,由外部信息引用的参数类型可以用于类型转换、泛型方法调用或任何其它种类的操作。
由外部信息引用的参数类型覆盖可以由虚拟机标识的其它参数类型。由存储在虚拟机指令外部并与虚拟机指令相关联地存储的信息所引用的参数类型覆盖由虚拟机指令本身引用的参数类型。由存储在虚拟机指令外部并与虚拟机指令相关联地存储的信息所引用的参数类型覆盖可以由虚拟机基于先前执行的指令推断出的其它参数类型。由存储在虚拟机指令外部并与虚拟机指令相关联地存储的信息所引用的参数类型覆盖与参数值一起存储在由虚拟机维护的数据结构(例如,堆栈)内的参数类型。
可以实施多个不同的技术用于覆盖参数类型。在一个示例中,如图6所示,可以由虚拟机确定的其它参数类型永远不会被标识。具体地,当检测到(a)存储在虚拟机指令外部并与虚拟机指令相关联地存储的以及(b)引用参数类型的信息时,省略与其它参数类型相关的操作608-610。
在其它示例中,首先确定(例如,由虚拟机基于先前执行的指令所推断出的或者由目标虚拟机指令本身所引用的)其它参数类型。此后,如果检测到(a)存储在虚拟机指令外部并且与虚拟机指令相关联地存储的以及(b)引用参数类型的信息,则丢弃/显式地覆盖过时的参数类型。
返回到图6,如果在操作602中未检测到引用参数类型的外部信息,则虚拟机可以基于由虚拟机基于先前执行的指令所推断出的或由目标虚拟机指令本身所引用的任何参数类型来处理虚拟机指令(操作608-610)。作为示例,先前执行的虚拟机指令将两个整数相加并将值存储在堆栈中。接下来执行的指令对最后存储的值作为参数进行操作。堆栈中最后存储的值已知是整数,因为它是通过相加两个整数生成的。因此,可以由虚拟机推断出来参数类型整数。此外,参数类型整数可以与最后存储的值相关联地存储在堆栈中。
如果没有为虚拟机指令标识参数类型信息,则可以生成错误或者可以使用基本类型作为用于处理虚拟机指令的参数类型(操作612)。生成错误或者使用基本类型可以取决于虚拟机指令、虚拟机的配置或任何其它因素。作为示例,可以使用“对象”类型作为用于处理具有参数而没有任何相关联的参数类型的虚拟机指令的参数类型。
3.3所引用的参数类型的示例使用
对于不同的虚拟机指令可以包括或不包括引用虚拟机指令的(一个或多个)参数的类型的信息。本文的实施例涉及生成和使用具有以下中的一个或两者的字节码:
(a)与引用虚拟机指令的参数的参数类型的(在虚拟机指令外部的)信息相关联地存储的虚拟机指令(参见操作604)。
(b)存储的不具有引用虚拟机指令的参数的参数类型的(在虚拟机指令外部的)信息的虚拟机指令(参见操作608-612)。
在实施例中,包括引用任何虚拟机指令的参数类型的信息的决定可以取决于任何数量的因素。该因素包括但不限于:虚拟机指令的参数的实际类型、虚拟机指令是否需要增强的通用性(例如,考虑到平台演进)以及(例如,针对新类型)是否需要以信号形式告知特定语义/特定语义是否是可适用的。
使用引用虚拟机指令的参数类型的信息可以帮助避免需要额外的值类型信息。使用前面的引用指令参数的类型的信息可以提供用于与执行引擎传送参数类型的增强方法。
泛型特定化:在不应当被解释为限制任何权利要求的范围的一个示例中,生成用于泛型类和方法的字节码使得当虚拟机指令对泛型类型的值进行操作时使用引用参数类型的信息。对泛型类或方法进行特定化包括对与虚拟机指令的参数的参数类型相关联的元数据进行特定化以包括正确的类型。以这种方式,与泛型类型特定化有关的虚拟机指令将被强制类型化。
添加类型:在实施例中,引用参数类型允许扩展指令的语义。参数类型向特定的虚拟机指令提供上下文并且可以用于映射到可适用于特定虚拟机指令的所有语义集合的特定语义集合。值类型(其元素可以消耗通常在Java类型中找到的多于一个或多个机器字的机器字)的新的语义可以通过引用常量池中处理值类型元素的指令的参数类型来表示。
动态语言实现:通过编译源语言函数来针对VM平台ISA的动态语言实现可以使用参数类型来生成关于发生类型的高度特定的字节码。
如上所述,一个或多个实施例适用于标识作为值类型的类型。在一个示例中,值类型必须由泛型类型系统支持。如上所述,灵活的泛型特定化方法可能是有帮助的。对泛型类型进行特定化包括修补由虚拟机指令之前的信息引用的常量池条目。
在一个示例中,内联是通过用所调用方法的主体代替调用来取代方法调用的优化。结果,虚拟机能够省略跳转指令,跳转指令往往是相当有代价的。此外,可以递归地执行内联(“深度内联”),因此如果方法A调用方法B,其中方法B进而调用方法C,则方法B和方法C两者的内容都可以被内联到方法A中。然而,当方法调用潜在地是多态的(诸如JVMinvokevirtual指令)时,虚拟机可能不确切地知道方法的哪个实现将在运行时期间被调用并因此应当被内联。
例如,考虑具有子类HouseCat和另一个子类Lion的抽象类Feline。HouseCat通过打印“喵”来实现方法speak,并且Lion通过打印“吼”来实现方法speak。假设方法C取类型Feline的参数对象并调用该对象的speak方法。方法C由方法A和方法B两者调用,其中方法A将类型HouseCat的参数传递给方法C并且方法B将类型Lion的参数传递给方法C。在这个示例中,如果虚拟机试图执行方法C到方法A中的深度内联,那么方法C中的speak调用的类型信息将指示类型Lion和HouseCat两者都已经被视为在程序中的该点处的接收者(假设方法A和方法B两者都已经被执行至少一次)。因此,虚拟机将不能解析speak的哪个实现要内联到方法C中并最终内联到方法A中。
为了解决这些问题,实施例依赖于调用的参数的类型。虚拟机访问指示传递参数的类型是HouseCat的从方法A到方法C的调用的参数的(由调用之前的信息引用的)参数类型。结果,代替基于假设参数具有声明的类型Feline和由于受到污染的简档而不能解析接收者的优化,与传递参数的类型相关的信息允许虚拟机确定:当从方法A进行调用时,speak调用的接收者是更具体的类型HouseCat。因此,参数类型基于引用参数类型的信息从调用者流向被调用者。一旦已经解析了更具体的类型,虚拟机就能够确定在编译和优化过程期间要内联speak的哪个实现。
4.其它;扩展
实施例针对具有包括硬件处理器并且被配置为执行本文所述和/或在以下任何权利要求中所述的任何操作的一个或多个设备的系统。
在实施例中,非瞬态计算机可读存储介质包括指令,该指令在由一个或多个硬件处理器执行时,使得执行本文所述和/或在任何权利要求中所述的任何操作。
可以根据一个或多个实施例来使用本文所述的特征和功能的任何组合。在前述说明书中,已经参考许多具体细节描述了各种实施例,这些具体细节可能因实施方案而不同。因此,应当在说明性而不是限制性的意义上看待说明书和附图。本发明范围的唯一且排他的指示以及申请人意在要作为本发明范围的是以由本申请产生的一组权利要求的具体形式的所产生权利要求的字面和等同范围,包括任何后续的校正。
5.硬件概述
根据一个实施例,本文所描述的技术由一个或多个专用计算设备实现。专用计算设备可以是硬连线的以执行技术,或者可以包括诸如被永久性地编程以执行技术的一个或多个专用集成电路(ASIC)或现场可编程门阵列(FPGA)的数字电子设备,或者可以包括被编程为按照固件、存储器、其它存储设备或者其组合中的程序指令来执行技术的一个或多个通用硬件处理器。这种专用计算设备还可以将定制的硬连线逻辑、ASIC或FPGA与定制的编程进行组合来实现技术。专用计算设备可以是台式计算机系统、便携式计算机系统、手持式设备、联网设备或者结合硬连线和/或程序逻辑来实现技术的任何其它设备。
例如,图7是图示了可以在其上实现本发明的实施例的计算机系统700的框图。计算机系统700包括用于传送信息的总线702或其它通信机制,以及与总线702耦合用于处理信息的硬件处理器704。硬件处理器704可以是例如通用微处理器。
计算机系统700还包括耦合到总线702用于存储信息和将由处理器704执行的指令的主存储器706,诸如随机存取存储器(RAM)或其它动态存储设备。主存储器706也可以用于在将由处理器704执行的指令的执行期间存储临时变量或其它中间信息。这些指令当被存储在处理器704可访问的非瞬态存储介质中时,使计算机系统700成为被定制以执行指令中指定的操作的专用机器。
计算机系统700进一步包括耦合到总线702用于存储静态信息和处理器704的指令的只读存储器(ROM)708或其它静态存储设备。提供了诸如磁盘或光盘的存储设备710,并且存储设备710被耦合到总线702用于存储信息和指令。
计算机系统700可以经由总线702耦合到诸如阴极射线管(CRT)的显示器712,用于向计算机用户显示信息。包括字母数字键和其它键的输入设备714耦合到总线702,用于向处理器704传送信息和命令选择。另一种类型的用户输入设备是光标控件716,诸如鼠标、轨迹球或光标方向键,用于向处理器704传送方向信息和命令选择并且用于控制显示器712上的光标移动。这种输入设备通常具有在两个轴(第一轴(例如,x)和第二轴(例如,y))上的两个自由度,这允许设备在平面中指定位置。
计算机系统700可以使用定制的硬连线逻辑、一个或多个ASIC或FPGA、固件和/或程序逻辑来实现本文所描述的技术,这些定制的硬连线逻辑、一个或多个ASIC或FPGA、固件和/或程序逻辑与计算机系统组合使计算机系统700成为或将计算机系统700编程为专用机器。根据一个实施例,本文技术由计算机系统700响应于处理器704执行包含在主存储器706中的一条或多条指令的一个或多个序列而执行。可以从另一个存储介质(诸如存储设备710)将这些指令读取到主存储器706中。执行包含在主存储器706中的指令的序列使处理器704执行本文所描述的处理步骤。在替代实施例中,可以使用硬连线电路系统代替软件指令或与软件指令组合使用。
如本文使用的术语“存储介质”是指存储使机器以特定方式操作的数据和/或指令的任何非瞬态介质。这种存储介质可以包括非易失性介质和/或易失性介质。非易失性介质包括例如光盘或磁盘,诸如存储设备710。易失性介质包括动态存储器,诸如主存储器706。存储介质的常见形式包括例如软盘、柔性盘、硬盘、固态驱动器、磁带或任何其它磁性数据存储介质、CD-ROM、任何其它光学数据存储介质、具有孔模式的任何物理介质、RAM、PROM和EPROM、FLASH-EPROM、NVRAM、任何其它存储器芯片或盒带。
存储介质与传输介质不同,但可以与传输介质结合使用。传输介质参与在存储介质之间传输信息。例如,传输介质包括同轴电缆、铜线和光纤,包括构成总线702的导线。传输介质还可以采取声波或光波的形式,诸如在无线电波和红外数据通信期间生成的那些波。
将一条或多条指令的一个或多个序列携带到处理器704以供执行可能涉及各种形式的介质。例如,最初可以在远程计算机的磁盘或固态驱动器上携带指令。远程计算机可以将指令加载到其动态存储器中并且使用调制解调器经电话线发送指令。计算机系统700本地的调制解调器可以在电话线上接收数据并使用红外发射器将数据转换为红外信号。红外检测器可以接收红外信号中携带的数据,并且适当的电路系统可以将数据放置在总线702上。总线702将数据携带到主存储器706,处理器704从主存储器706检索并执行指令。由主存储器706接收到的指令可以可选地在被处理器704执行之前或之后存储在存储设备710上。
计算机系统700还包括耦合到总线702的通信接口718。通信接口718提供耦合到网络链路720的双向数据通信,其中网络链路720连接到本地网络722。例如,通信接口718可以是向对应类型的电话线提供数据通信连接的综合业务数字网(ISDN)卡、电缆调制解调器、卫星调制解调器或调制解调器。作为另一个示例,通信接口718可以是提供到兼容的局域网(LAN)的数据通信连接的LAN卡。也可以实现无线链路。在任何这样的实现中,通信接口718发送和接收携带表示各种类型信息的数字数据流的电信号、电磁信号或光信号。
网络链路720通常通过一个或多个网络向其它数据设备提供数据通信。例如,网络链路720可以通过本地网络722提供到主机计算机724或到由互联网服务提供商(ISP)726操作的数据装置的连接。ISP 726进而通过现在通常被称为“互联网”728的世界范围的分组数据通信网络来提供数据通信服务。本地网络722和互联网728两者都使用携带数字数据流的电信号、电磁信号或光信号。通过各种网络的信号以及在网络链路720上并且通过通信接口718的信号是传输介质的示例形式,其中信号将数字数据携带到计算机系统700和从计算机系统700携带出去。
计算机系统700可以通过(一个或多个)网络、网络链路720和通信接口718发送消息和接收数据,包括程序代码。在互联网示例中,服务器730可以通过互联网728、ISP 726、本地网络722和通信接口718来传输对应用程序的请求代码。
接收到的代码可以在其被接收时由处理器704执行,和/或存储在存储设备710或其它非易失性存储设备中以供以后执行。
在前述说明书中,已经参考许多具体细节描述了本发明的实施例,这些具体细节可能因实施方案而不同。因此,应当在说明性而不是限制性的意义上看待说明书和附图。本发明范围的唯一且排他的指示以及申请人意在要作为本发明范围的是以由本申请产生的一组权利要求的具体形式的所产生权利要求的字面和等同范围,包括任何后续的校正。
Claims (15)
1.一种包括指令的非瞬态计算机可读介质,所述指令在由一个或多个硬件处理器执行时,使得执行包括以下的操作:
标识在代码编译过程期间生成的第一虚拟机指令,所述第一虚拟机指令包括第一组一个或多个参数;
标识存储在所述第一虚拟机指令外部并且与第一虚拟机指令相关联地存储的信息,所述信息引用与第一组参数中的每个参数的相应类型相对应的一个或多个变量;以及
基于由所述信息引用的所述第一组参数中的每个参数的相应类型来处理所述第一虚拟机指令。
2.如权利要求1所述的介质,其中标识所述信息是响应于检测到与所述第一虚拟机指令相邻的信息的。
3.如权利要求1所述的介质,其中在与所述第一虚拟机指令不同并且在第一虚拟机指令之前的第二虚拟机指令中指示引用所述一个或多个变量的所述信息。
4.如权利要求1所述的介质,其中所述信息是在所述代码编译过程期间生成的和/或通过在运行时期间执行返回所述信息的指令来标识的。
5.如权利要求1所述的介质,其中所述一个或多个变量对应于存储在常量池中的值。
6.如权利要求1所述的介质,其中所述信息引用与所述第一虚拟机指令相关联的语义。
7.如权利要求1所述的介质,其中所述第一虚拟机指令引用所述第一组参数中的特定参数的第一类型,所述第一组参数中的特定参数的第一类型被与由所述信息引用的变量相对应的第二类型覆盖。
8.如权利要求1所述的介质,其中所述第一虚拟机指令包括数据移动操作,并且其中基于所述第一组参数中的一个或多个参数的相应类型信息来确定在所述数据移动操作中移动的多个字节。
9.如权利要求1所述的介质,其中处理所述第一虚拟机指令包括以下中的一个或多个:
使用数据结构中的特定数量的字节来执行比较操作,其中基于所述第一组参数中的一个或多个参数的相应类型来确定所述特定数量;
至少通过确定如由所述信息经由所述一个或多个变量所引用的所述第一组参数中的特定参数的相应类型与包括在第二虚拟机指令中的第二参数的第二类型相匹配来验证类型一致性,其中所述特定参数和所述第二参数对应于相同的值。
10.如权利要求1所述的介质,其中如由所述信息引用的所述第一组参数的特定参数的相应类型是泛型类型。
11.如权利要求1所述的介质,其中所述第一组参数中的每个参数的相应类型在所述代码编译过程期间不是静态已知的。
12.如权利要求1所述的介质,其中用所述信息可执行所述第一虚拟机指令,并且其中在没有所述信息的情况下可执行所述第一虚拟机指令。
13.如权利要求1所述的介质,其中所述操作进一步包括:
标识包括第二组一个或多个参数的第二虚拟机指令,其中第二组参数中的每个参数的相应类型未在所述第二虚拟机指令外部的任何信息中标识;以及
处理所述第二虚拟机指令。
14.一种包括指令的非瞬态计算机可读介质,所述指令在由一个或多个硬件处理器执行时,使得执行包括以下的操作:
在代码编译过程期间生成包括第一组一个或多个参数的第一虚拟机指令;
在所述代码编译过程期间生成引用与第一组参数中的每个参数的相应类型相对应的一个或多个变量的信息;以及
将所述信息存储在所述第一虚拟机指令外部并且与所述第一虚拟机指令相关联地存储。
15.一种包括至少一个设备的系统,所述系统被配置为执行如权利要求1-14中任一项所述的操作中的一个或多个操作。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111225231.9A CN114003207A (zh) | 2015-08-09 | 2016-07-28 | 扩展虚拟机指令集体系架构 |
Applications Claiming Priority (5)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US201562202909P | 2015-08-09 | 2015-08-09 | |
US62/202,909 | 2015-08-09 | ||
US15/005,448 | 2016-01-25 | ||
US15/005,448 US10055208B2 (en) | 2015-08-09 | 2016-01-25 | Extending a virtual machine instruction set architecture |
PCT/US2016/044533 WO2017027228A1 (en) | 2015-08-09 | 2016-07-28 | Extending a virtual machine instruction set architecture |
Related Child Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202111225231.9A Division CN114003207A (zh) | 2015-08-09 | 2016-07-28 | 扩展虚拟机指令集体系架构 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN108139896A true CN108139896A (zh) | 2018-06-08 |
CN108139896B CN108139896B (zh) | 2021-10-19 |
Family
ID=56684747
Family Applications (2)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202111225231.9A Pending CN114003207A (zh) | 2015-08-09 | 2016-07-28 | 扩展虚拟机指令集体系架构 |
CN201680046654.5A Active CN108139896B (zh) | 2015-08-09 | 2016-07-28 | 扩展虚拟机指令集体系架构 |
Family Applications Before (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202111225231.9A Pending CN114003207A (zh) | 2015-08-09 | 2016-07-28 | 扩展虚拟机指令集体系架构 |
Country Status (4)
Country | Link |
---|---|
US (3) | US10055208B2 (zh) |
EP (3) | EP4099152B1 (zh) |
CN (2) | CN114003207A (zh) |
WO (1) | WO2017027228A1 (zh) |
Families Citing this family (19)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US10078497B2 (en) | 2015-07-24 | 2018-09-18 | Oracle International Corporation | Bridging a module system and a non-module system |
US9626171B2 (en) | 2015-07-24 | 2017-04-18 | Oracle International Corporation | Composing a module system and a non-module system |
US10055208B2 (en) | 2015-08-09 | 2018-08-21 | Oracle International Corporation | Extending a virtual machine instruction set architecture |
CN105183433B (zh) * | 2015-08-24 | 2018-02-06 | 上海兆芯集成电路有限公司 | 指令合并方法以及具有多数据通道的装置 |
US10158647B2 (en) * | 2015-08-25 | 2018-12-18 | Oracle International Corporation | Permissive access control for modular reflection |
US10466975B2 (en) * | 2015-10-23 | 2019-11-05 | Oracle International Corporation | Execution of parameterized classes on legacy virtual machines to generate instantiation metadata |
US10635472B2 (en) | 2015-10-23 | 2020-04-28 | Oracle International Corporation | Import mechanism for hardware intrinsics |
US10140119B2 (en) | 2016-03-17 | 2018-11-27 | Oracle International Corporation | Modular serialization |
US10394528B2 (en) | 2016-03-30 | 2019-08-27 | Oracle International Corporation | Returning a runtime type loaded from an archive in a module system |
US10191753B2 (en) | 2016-03-30 | 2019-01-29 | Oracle International Corporation | Generating verification metadata and verifying a runtime type based on verification metadata |
US10606614B2 (en) | 2016-07-31 | 2020-03-31 | Oracle International Corporation | Container-based language runtime using a variable-sized container for an isolated method |
US10282184B2 (en) | 2016-09-16 | 2019-05-07 | Oracle International Corporation | Metadata application constraints within a module system based on modular dependencies |
US10802855B2 (en) | 2016-09-16 | 2020-10-13 | Oracle International Corporation | Producing an internal representation of a type based on the type's source representation |
US10387142B2 (en) | 2016-09-16 | 2019-08-20 | Oracle International Corporation | Using annotation processors defined by modules with annotation processors defined by non-module code |
US10296363B2 (en) | 2016-09-16 | 2019-05-21 | Oracle International Corporation | Tuning a virtual machine startup parameter |
US10848410B2 (en) | 2017-03-29 | 2020-11-24 | Oracle International Corporation | Ranking service implementations for a service interface |
US11693719B2 (en) | 2021-03-19 | 2023-07-04 | Oracle International Corporation | Implementing a type restriction that restricts to a non-polymorphic layout type or a maximum value |
CN114070888B (zh) * | 2021-11-10 | 2024-04-12 | 中国联合网络通信集团有限公司 | 基于云终端的业务处理方法、服务器、设备及系统 |
CN116756589B (zh) * | 2023-08-16 | 2023-11-17 | 北京壁仞科技开发有限公司 | 匹配算子的方法、计算设备和计算机可读存储介质 |
Citations (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5740441A (en) * | 1994-12-20 | 1998-04-14 | Sun Microsystems, Inc. | Bytecode program interpreter apparatus and method with pre-verification of data type restrictions and object initialization |
US6618769B1 (en) * | 1999-05-27 | 2003-09-09 | Sun Microsystems, Inc. | Module-by-module verification |
US20100293342A1 (en) * | 2007-04-10 | 2010-11-18 | Morfey Alistair G | Data processing apparatus |
CN102622289A (zh) * | 2011-01-26 | 2012-08-01 | 阿里巴巴集团控股有限公司 | 程序设置方法、程序监控方法与装置、系统 |
WO2012107737A1 (en) * | 2011-02-07 | 2012-08-16 | Arm Limited | Controlling the execution of adjacent instructions that are dependent upon a same data condition |
CN102855127A (zh) * | 2011-06-28 | 2013-01-02 | 基信康信息技术(上海)有限公司 | 测试脚本的生成装置及方法 |
US20130212567A1 (en) * | 2012-02-13 | 2013-08-15 | Microsoft Corporation | Generating and caching software code |
CN103729235A (zh) * | 2013-12-24 | 2014-04-16 | 华为技术有限公司 | Java虚拟机的编译方法和Java虚拟机 |
CN104169877A (zh) * | 2012-03-15 | 2014-11-26 | 国际商业机器公司 | 将不相邻指令区分符变换为相邻指令区分符 |
CN104461471A (zh) * | 2014-12-19 | 2015-03-25 | 中国人民解放军国防科学技术大学 | 分簇vliw处理器上统一的指令调度和寄存器分配方法 |
CN104641351A (zh) * | 2012-10-25 | 2015-05-20 | 英特尔公司 | 部分向量化编译系统 |
Family Cites Families (17)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6003038A (en) | 1997-03-31 | 1999-12-14 | Sun Microsystems, Inc. | Object-oriented processor architecture and operating method |
US6766521B1 (en) * | 1999-05-27 | 2004-07-20 | Sun Microsystems, Inc. | Dataflow algorithm for symbolic computation of lowest upper bound type |
JP2003528390A (ja) | 2000-03-20 | 2003-09-24 | コーニンクレッカ フィリップス エレクトロニクス エヌ ヴィ | インタプリタによりコンピュータプログラムを実行する方法、コンピュータシステムならびにコンピュータプログラムプロダクト |
US6957428B2 (en) * | 2001-03-27 | 2005-10-18 | Sun Microsystems, Inc. | Enhanced virtual machine instructions |
US20050216920A1 (en) * | 2004-03-24 | 2005-09-29 | Vijay Tewari | Use of a virtual machine to emulate a hardware device |
US8205066B2 (en) * | 2008-10-31 | 2012-06-19 | Convey Computer | Dynamically configured coprocessor for different extended instruction set personality specific to application program with shared memory storing instructions invisibly dispatched from host processor |
JP2010272055A (ja) * | 2009-05-25 | 2010-12-02 | Sony Corp | 情報処理装置および方法、並びにプログラム |
US8555264B2 (en) * | 2011-01-14 | 2013-10-08 | Oracle International Corporation | System and method for efficient compilation and invocation of function type calls |
JP6350831B2 (ja) * | 2013-03-30 | 2018-07-04 | 日本電気株式会社 | アプリケーション特化仮想マシン生成システム、装置、方法およびプログラム |
US9201635B2 (en) * | 2013-12-30 | 2015-12-01 | Unisys Corporation | Just-in-time dynamic translation for translation, compilation, and execution of non-native instructions |
US9910680B2 (en) | 2014-04-22 | 2018-03-06 | Oracle International Corporation | Decomposing a generic class into layers |
US10261764B2 (en) | 2014-05-13 | 2019-04-16 | Oracle International Corporation | Handling value types |
US10540148B2 (en) | 2014-06-12 | 2020-01-21 | Oracle International Corporation | Complex constants |
US11030105B2 (en) * | 2014-07-14 | 2021-06-08 | Oracle International Corporation | Variable handles |
US9753707B2 (en) * | 2014-07-25 | 2017-09-05 | Qualcomm Innovation Center, Inc. | Context-free type recording for virtual machines of dynamic programming languages |
US10324741B2 (en) * | 2014-08-30 | 2019-06-18 | Oracle International Corporation | Speeding up dynamic language execution on a virtual machine with type speculation |
US10055208B2 (en) | 2015-08-09 | 2018-08-21 | Oracle International Corporation | Extending a virtual machine instruction set architecture |
-
2016
- 2016-01-25 US US15/005,448 patent/US10055208B2/en active Active
- 2016-07-28 EP EP22168051.5A patent/EP4099152B1/en active Active
- 2016-07-28 CN CN202111225231.9A patent/CN114003207A/zh active Pending
- 2016-07-28 WO PCT/US2016/044533 patent/WO2017027228A1/en active Application Filing
- 2016-07-28 EP EP16751414.0A patent/EP3314422B1/en active Active
- 2016-07-28 CN CN201680046654.5A patent/CN108139896B/zh active Active
- 2016-07-28 EP EP22168052.3A patent/EP4099153B1/en active Active
-
2018
- 2018-04-09 US US15/948,587 patent/US10802802B2/en active Active
-
2020
- 2020-08-21 US US16/999,062 patent/US11385872B2/en active Active
Patent Citations (12)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5740441A (en) * | 1994-12-20 | 1998-04-14 | Sun Microsystems, Inc. | Bytecode program interpreter apparatus and method with pre-verification of data type restrictions and object initialization |
US6618769B1 (en) * | 1999-05-27 | 2003-09-09 | Sun Microsystems, Inc. | Module-by-module verification |
US20100293342A1 (en) * | 2007-04-10 | 2010-11-18 | Morfey Alistair G | Data processing apparatus |
CN102622289A (zh) * | 2011-01-26 | 2012-08-01 | 阿里巴巴集团控股有限公司 | 程序设置方法、程序监控方法与装置、系统 |
WO2012107737A1 (en) * | 2011-02-07 | 2012-08-16 | Arm Limited | Controlling the execution of adjacent instructions that are dependent upon a same data condition |
CN103348318A (zh) * | 2011-02-07 | 2013-10-09 | Arm有限公司 | 控制依赖于相同数据条件的相邻指令的执行 |
CN102855127A (zh) * | 2011-06-28 | 2013-01-02 | 基信康信息技术(上海)有限公司 | 测试脚本的生成装置及方法 |
US20130212567A1 (en) * | 2012-02-13 | 2013-08-15 | Microsoft Corporation | Generating and caching software code |
CN104169877A (zh) * | 2012-03-15 | 2014-11-26 | 国际商业机器公司 | 将不相邻指令区分符变换为相邻指令区分符 |
CN104641351A (zh) * | 2012-10-25 | 2015-05-20 | 英特尔公司 | 部分向量化编译系统 |
CN103729235A (zh) * | 2013-12-24 | 2014-04-16 | 华为技术有限公司 | Java虚拟机的编译方法和Java虚拟机 |
CN104461471A (zh) * | 2014-12-19 | 2015-03-25 | 中国人民解放军国防科学技术大学 | 分簇vliw处理器上统一的指令调度和寄存器分配方法 |
Non-Patent Citations (2)
Title |
---|
BRIAN GOETZ: "State of the Specialization", 《HTTP://CR.OPENJDK.JAVA.NET/~BRIANGOETZ/VALHALLA/SPECIALIZATION-1.HTML》 * |
EVA ANDREASSON: "JVM优化系列-第二部分-编译器", 《HTTP://IFEVE.COM/JVM-OPTIMIZE-2/》 * |
Also Published As
Publication number | Publication date |
---|---|
CN108139896B (zh) | 2021-10-19 |
US20200379738A1 (en) | 2020-12-03 |
US20180232217A1 (en) | 2018-08-16 |
EP4099152A1 (en) | 2022-12-07 |
US20170039043A1 (en) | 2017-02-09 |
US10802802B2 (en) | 2020-10-13 |
CN114003207A (zh) | 2022-02-01 |
EP3314422A1 (en) | 2018-05-02 |
EP4099153B1 (en) | 2024-01-24 |
WO2017027228A1 (en) | 2017-02-16 |
EP4099153A1 (en) | 2022-12-07 |
US10055208B2 (en) | 2018-08-21 |
EP3314422B1 (en) | 2022-04-20 |
EP4099152B1 (en) | 2024-01-24 |
US11385872B2 (en) | 2022-07-12 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN108139896A (zh) | 扩展虚拟机指令集体系架构 | |
CN106462425B (zh) | 使用复常量的方法和系统 | |
CN107041158B (zh) | 用于模块化反射的限制性访问控制 | |
KR101143027B1 (ko) | 자기 기술적 소프트웨어 이미지 업데이트 컴포넌트 | |
CN107924326A (zh) | 对经更新的类型的迁移方法进行覆盖 | |
US8453128B2 (en) | Method and system for implementing a just-in-time compiler | |
US9047583B2 (en) | Ontology context logic at a key field level | |
CN106663019A (zh) | 处理值类型 | |
US10853096B2 (en) | Container-based language runtime loading an isolated method | |
US8141035B2 (en) | Method for accessing internal states of objects in object oriented programming | |
US20070271553A1 (en) | Method and system for translating assembler code to a target language | |
CN106843842B (zh) | 一种应用程序配置文件的更新方法及装置 | |
JP6241352B2 (ja) | コンパイラ、コンパイル方法、およびコンパイル装置 | |
CN113703779B (zh) | 一种跨平台的多语言编译方法和超轻量物联网虚拟机 | |
CN102289367A (zh) | 根据模式的命令行外壳命令生成 | |
CN112631656A (zh) | 一种基于源代码的智能合约优化方法及装置 | |
US20090037890A1 (en) | Method and system for generating an application | |
CN111737964A (zh) | 表格动态处理方法、设备及介质 | |
Mallo | A translator from BML annotated Java bytecode to BoogiePL | |
CN1839371A (zh) | 为计算机程序配置语言的方法和系统 | |
CN115328544A (zh) | 一种环境定制方法、计算设备及存储介质 | |
Lee et al. | Foundation Functions and Data Types | |
Kastinger | Piero Ploner (pploner@ cosy. sbg. ac. at), Michael Wallner (mwallner@ cosy. sbg. ac. at) University of Salzburg, Department of Computer Sciences | |
Lu et al. | METHOD FOR COMPRESSING A .NET FILE | |
JP2005292980A (ja) | 汎用入力データ検査装置及びプログラム |
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 |