首页> 中国专利> 将泛型类分解成层

将泛型类分解成层

摘要

即使已有类的一些成员不支持扩展的泛型,已有泛型类的泛型域也可被扩展以便不仅包括引用类型,还包括原始类型和值类型。可创建类的细分版本,所述类的细分版本包括:泛型层,包括类成员的抽象版本;和引用特定层,包括在泛型层中抽象的类成员的非抽象版本。所述类的细分版本还可包括指示类成员属于哪个层的信息。存在问题的方法(例如,具有关于泛型域的内置假设的方法)可被移动到第二个引用特定层中,由此保留与当前将那些方法实例化或引用那些方法的类的兼容性并且同时仍然允许在扩展的泛型域内使用。

著录项

  • 公开/公告号CN106415488A

    专利类型发明专利

  • 公开/公告日2017-02-15

    原文格式PDF

  • 申请/专利权人 甲骨文国际公司;

    申请/专利号CN201580028016.6

  • 发明设计人 B·戈茨;J·R·罗斯;

    申请日2015-04-22

  • 分类号G06F9/44;G06F9/445;G06F9/45;

  • 代理机构中国国际贸易促进委员会专利商标事务所;

  • 代理人张鑫

  • 地址 美国加利福尼亚

  • 入库时间 2023-06-19 01:31:14

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2020-02-14

    授权

    授权

  • 2017-05-24

    实质审查的生效 IPC(主分类):G06F9/44 申请日:20150422

    实质审查的生效

  • 2017-02-15

    公开

    公开

说明书

背景技术

本发明一般地涉及软件开发,并且更具体地讲,涉及各种编程语言中的任何编程语言(诸如,作为一个示例,独立于平台的面向对象的编程语言)内的语言开发的各种方面。

许多编程语言支持参数多态,诸如Java、C#和Scala中的泛型类。经常利用关于泛型域的假设编写泛型类。经常地,这种假设在编程语言内是显式的,而其它假设是隐式的。例如,在Java编程语言内,传统上在假设类型变量仅在引用类型的范围上变化的情况下编写泛型类。这些假设经常被结合到这些类的实现方式。例如,对于具有声明List<T>的泛型类,开发者可在假设T必须是引用类型的情况下编写代码。然而,关于受限域的假设使得在更广泛的域(诸如,既包括引用类型又包括原始类型的域)上泛型化的能力更加困难或者成问题。

发明内容

这里描述了各种实施例,这些实施例增强面向对象的软件开发,以包括用于对泛型类执行分解的语言和/或运行时支持,从而支持将其泛型性扩展至更大的域,并且同时保持与已有实现方式和客户机的兼容性(例如,二进制、源和/或行为兼容性)。

这里描述的技术可涉及将泛型类“剥离”成多个层。例如,泛型类可被“剥离”为包括可在扩展域上被视为泛型的一个完全泛型层和可被限制于先前域的另一层(例如,作为一个示例,引用特定)。存在问题的方法(例如,具有关于泛型域的内置假设的方法)可被移动到与先前(例如,更加限制性的)泛型域对应的层中,由此保留与当前将这些方法实例化或引用这些方法的类的兼容性,并且同时仍然允许在扩展的泛型域内使用。

可通过允许创建类的细分版本来以兼容方式扩展已有泛型类型的泛型域,所述类的细分版本包括多个层,诸如支持扩展域的完全泛型层以及可能不完全支持扩展的泛型域的其它层。例如,Java编程语言可被增强以允许创建细分泛型类,所述细分泛型类包括支持除引用类型之外的类型的完全泛型层和支持先前(例如,仅引用)泛型域的层。

所述类的细分版本还可包括指示特定类成员位于哪个层中的信息。在一些实施例中,针对与扩展的泛型域对应的类型(例如,引用类型、原始类型、值类型、元组类型等)和与先前泛型域对应的类型(例如,在Java示例中,仅引用类型),可加载、实例化和/或特化单个细分泛型类。

因此,根据一些实施例,使用具有多个层的泛型类可允许将泛型域扩展为包括另外的类型(例如,不仅仅包括所有的引用类型,还包括原始类型和/或所有的值类型),同时保持与已有实现方式和客户机的兼容性。

附图说明

图1是表示根据各种实施例的用于编译和执行按照高级的面向对象的语言指定并且被配置为支持将泛型类分解成层的计算机程序的工作流程的逻辑方框图。

图2是表示根据一个实施例的包括多个层的细分泛型类的创建的逻辑方框图。

图3是表示根据一个实施例的用于创建既包括完全泛型层又包括引用特定层的细分类的方法的一个实施例的流程图。

图4是表示根据一个实施例的既包括完全泛型层又包括引用特定层的泛型类的一个示例的逻辑方框图。

图5是表示在一个实施例中的基于细分泛型类的类的实例化的逻辑方框图。

图6是表示根据一个实施例的用于加载细分泛型类的完全泛型版本的方法的一个实施例的流程图。

图7是表示根据一个实施例的用于加载细分泛型类的引用特定版本的方法的一个实施例的流程图。

图8是表示根据一个实施例的用于针对非引用类型参数化将细分泛型类特化的方法的一个实施例的流程图。

图9是表示根据一个实施例的适合实现将泛型类分解成层的示例性计算机系统的逻辑方框图。

具体实施方式

这里描述了各种实施例,这些实施例增强使用面向对象的语言的软件开发(诸如,增强JavaTM编程语言),以支持对泛型类执行分解,从而支持与已有实现方式和客户机的二进制、源和/或行为兼容性,并且同时仍然支持其泛型扩展至更大的域。根据一些实施例,泛型域可表示由泛型类支持的不同类型的范围。

一些实施例中,将泛型类分解成两个或更多个层可被称为“剥离”。例如,泛型类可被“剥离”成多个层,诸如可在扩展域上被视为泛型的一个泛型层(例如,完全泛型)和可被限制于先前域的一个层(例如,引用特定)。存在问题的方法(例如,具有关于泛型域的内置假设的方法)可被移动到第二个引用特定层中,由此保留与当前将那些方法实例化或引用那些方法的类的兼容性,并且同时仍然允许在扩展的泛型域内使用。

例如,在一些实施例中,编程语言可被增强以便通过支持包括多个层的类的细分版本的创建来以兼容方式扩展已有泛型类型的泛型域。例如,在一个实施例中,类可被细分为用于一个或多个类成员的抽象版本的泛型层和用于在泛型层中抽象的成员的非抽象版本的对象(或引用特定)层。类的细分版本可包括指示特定成员位于哪个层中的信息。另外,运行时环境可将细分泛型类加载、实例化和/或特化。在一些实施例中,对于引用类型和非引用类型,相同的细分泛型类可被加载、实例化和/或特化。

因此,根据一些实施例,将泛型类剥离成多个层可允许将泛型域扩展为不仅包括所有的引用类型,还包括原始类型和/或所有的值类型,同时保持与已有实现方式和客户机的兼容性。例如,在一个实施例中,在Java编程语言内,如这里所述,剥离的使用可允许在T是引用类型、原始类型和/或值类型的情况下将泛型类List<T>特化。在另一实施例中,在支持类、函数和元组的三重系统(诸如,FortressTM系统)内,类可被细分为多个层以支持泛型的不同级别。例如,细分类可包括用于类、函数和/或元组的层以及更细粒度的层以便诸如支持特定情况(例如,int、numeric、“T>

在下面的详细描述中,阐述许多特定细节以提供对要求保护的主题的彻底的理解。然而,本领域技术人员将会理解,可在没有这些特定细节的情况下实施要求保护的主题。在其它实例中,因为本领域普通技术人员知道方法、设备或系统,所以以下未详细地描述所述方法、设备或系统以免模糊要求保护的主题。

尽管对于几个实施例和说明性附图作为示例在这里描述了各种实施例,但本领域技术人员将会意识到,实施例不限于描述的实施例或附图。应该理解,附图及其详细描述并不意图将实施例限制于公开的特定形式,而是相反地,意图包括落在本公开的精神和范围内的所有变型、等同物和替代物。这里使用的任何标题仅用于组织目的,而非意图用于限制该描述的范围。如在整个本申请中所使用,在许可意义(即,意味着具有可能性)而非强制性意义(即,意味着必须)上使用词语“可”。类似地,词语“包括”、“包含”和“具有”表示包括但不限于。

按照对存储在特定设备或专用计算装置或平台的存储器内的二进制数字信号的操作的算法或符号表示,提供下面的详细描述的一些部分。在这个特定说明书的上下文中,一旦通用计算机被编程为根据来自程序软件的指令执行特定功能,则术语特定设备等包括所述通用计算机。算法描述或符号表示是由信号处理或相关领域普通技术人员用于将他们的工作的实质传达给其他本领域技术人员的方法的示例。算法在这里通常被视为导致预期结果的前后一致的一系列操作或类似信号处理。在这种情况下,操作或处理涉及物理量的物理操纵。通常,但并非必然,这种量可采取能够被存储、传送、组合、比较或以其它方式操纵的电信号或磁信号的形式。有时,主要由于常用的原因,已证明将这种信号称为位、数据、值、元素、码元、字符、项、数、数字等是比较方便的。然而,应该理解,所有这些或类似术语应该与合适的物理量关联并且仅是方便的标签。除非另外具体地指出,否则从下面的讨论清楚可知,应该理解,在本说明书中,使用诸如“处理”、“计算”、“核算”、“确定”等的术语的讨论始终表示特定设备(诸如,专用计算机或类似专用电子计算装置)的动作或处理。因此,在本说明书的上下文中,专用计算机或类似专用电子计算装置能够操纵或变换在专用计算机或类似专用电子计算装置的存储器、寄存器或其它信息存储装置、传输装置或显示装置内通常表示为物理电子量或磁量的信号。

根据各种实施例,这里描述的方法和/或特征可涉及语言开发的各种方面,诸如例如包括用于在Java虚拟机(JVM)中描述动态派生类的基础支持、用于将语言级别概念翻译成JVM能够执行的字节码的Java编译器中的翻译机构、和用于表示以前不能表示的事物的在Java语言中暴露的特征。根据Java编程语言和/或使用利用Java编程语言的软件开发的特征讨论这里描述的方法、技术、特征和/或增强的各种实施例。然而,根据各种实施例,这里描述的方法、技术、特征和其它增强也可被与其它编程语言(诸如,C、C++、C#、Python)一起使用。

另外,如这里所提及,类可被视为用户定义的类型或数据结构,所述用户定义的类型或数据结构可包括数据、变量、函数、方法和/或其它属性作为成员并且代表用于创建特定类型的编程对象的定义、蓝图或模板。类可为数据成员提供初始值并且为成员函数和方法提供实现方式。类经常被包括在库中。如这里所提及,库可被视为由软件程序或应用使用的一批资源。根据一些实施例,库可包括各种类型的资源中的任何资源,包括但不限于数据、文件、类、子程序和/或类型规范。库可被组织以便由超过一个应用(可能同时)使用,并且可通过提供资源来提升可重用性,以使得应用可不必实现(或重新实现)相同行为。

现在参照图1,图1表示根据各种实施例的用于编译和执行按照高级的独立于平台的面向对象的语言指定的支持原始和引用数据类型以及关于如这里所述的将泛型类分解成层的各种方法、特征和增强的计算机程序的工作流程。为了说明的目的,主要在使用JavaTM编程语言的情况下提供下面的描述。然而,需要注意的是,描述的技术可被与在任何合适的情况下支持原始和引用类型和特化的几乎任何编程语言一起使用。

根据示出的实施例,当编译器(诸如,编译器120)接收到用于计算机程序的源代码(诸如,源代码文件110)时,工作流程可开始。在各种实施例中,可按照各种高级和/或独立于平台的面向对象的编程语言(诸如,JavaTM和/或其它语言)指定源代码文件110。例如,在使用JavaTM的实施例中,源代码可被提供作为一组.java文件。类似地,在使用C++的实施例中,源代码可被提供作为一组.cpp文件。在一些实施例中,可使用语言的组合指定源代码文件110,所述组合可包括一种或多种低级和/或中间语言(例如,汇编)。在一些实施例中,可最初按照动态类型的高级语言(诸如,Python或Ruby)编写至少一些源代码,而在其它实施例中,所有的源代码可以按照静态类型的语言(诸如,JavaTM)编写。

在描述的实施例中,编译器120可分析源代码文件110以产生字节码文件或程序的可执行版本,诸如类文件130(例如,在JavaTM的情况下的.class文件或.jar文件)。不同类型的可执行代码格式可被用于各种实施例;例如,可替代于字节码而使用二进制机器语言。在一些场景中,类文件130中的可执行代码的一部分可以是字节码,而其它部分是原生二进制机器语言。

根据一些实施例,作为将程序源代码文件110编译为类文件130的一部分,编译器120可执行一系列分析操作并且在产生可执行版本之前产生各种中间数据结构,以便诸如应用或实现将泛型类分解成层。例如,编译器可在创建类文件130时产生一个或多个细分类(例如,已被剥离成多个层的类)。如上所述,编程语言可被修改以允许泛型类被以兼容方式分解(或“剥离”)成多个层,一个层在扩展域上是泛型的(例如,完全泛型),并且一个层被限制于先前域(例如,引用特定)。因此,编译器120可被修改以通过实现各种编程语言特征来支持扩展的泛型域,允许开发者创建新类(或修改已有类),同时保持与已有实现方式的兼容性,所述新类(或已有类)包括多个泛型层,如以下更详细所讨论。

如图1中所示,类文件130可被传送给执行环境,诸如虚拟化运行时环境140,虚拟化运行时环境140在执行平台102上执行代码,由此创建各种输出数据和/或行为。根据各种实施例,虚拟化运行时环境140又可包括许多不同部件,诸如类加载器150、存储管理器160、字节码校验器170(例如,用于检查可执行代码的有效性)和/或解释器和/或即时(JIT)编译器180。在一些实施例中,JIT编译器可负责将一些或全部的字节码(例如,字节码的大量使用的部分)翻译成平台特定机器代码以提高程序执行的性能。在一些实施例中,虚拟化运行时环境140还可包括用于实现许多应用编程接口(API)库190的代码。在一些实施例中,虚拟化运行时环境140可在低层软件(诸如,操作系统192)上运行。

在不同实施例中,作为编译代码的执行的结果产生的输出或行为可包括存储在各种级别的系统存储器中的数据(例如,内存对象和/或数据结构)、存储在持久存储装置上的数据(例如,文件系统中的文件)等。所述行为还可包括各种程序功能,诸如在屏幕上显示输出、经网络发送消息和/或以其它方式与各种用户和/或部件交互。

面向对象的编程内的参数多态涉及泛型类型、方法和类。例如,在JavaTM编程语言内,泛型类型是由一组类型参数参数化的泛型类或接口。传统上,泛型类被定义为具有类型参数部分,所述类型参数部分跟随在类名后面,由角括号(<>)定界。所述参数部分指定类型参数(也被称为类型变量)。为了更新非泛型类以使用泛型,可通过引入类型变量T来创建泛型类型声明,能够在类内部的任何地方使用类型变量T。类声明内的Object的一个、一些或全部出现(例如,根据特定情况)可被T替换。类似地,泛型方法也可被一组类型参数参数化。传统上,类型变量能够是任何非原始类型(例如,任何类类型、任何接口类型、任何阵列类型甚至另一类型变量)。然而,通过应用这里描述的方法和/或技术,泛型域可被扩展为包括另外的类型(例如,原始类型、值类型、函数类型、元组类型等),同时保持与已有实现方式的兼容性。

如上所述,经常利用关于泛型域的假设编写泛型类。然而,如这里所述,根据各种实施例,该限制可被解除以允许泛型类型参数在无限的一组全部类型上或在受限的一组类型上变化,所述一组类型包括不在先前泛型域中的至少一个类型(例如,在基于Java的示例中,不是引用,诸如int)。在一些实施例中,解除这个限制可能需要通过提取(例如,分层和/或重构)应用于所有类型参数分派(诸如,int或float以及Object或String)的结构(例如,类成员),同时留下局限于仅对引用进行操作的那些结构(诸如,Object或String),来改进已对其泛型域做出显式假设的已有类型。

根据一些实施例,可对泛型类执行分解以支持与已有实现方式和客户机的兼容性,同时仍然支持其泛型扩展至更大的域。这个技术可在这里被称为“剥离”,因为它可采用泛型类并且将其剥离成多个层(例如,在扩展域上是泛型的一个层和被限制于先前域的一个(或多个)层)。因此,在一些实施例中,存在问题的方法可被移动到不同层中,由此保留与当前将它们实例化或引用它们的类的兼容性,并且同时仍然允许在扩展的泛型域内使用。

在一些实施例中,一些类可能不需要被细分,因为它们可能不包括关于更加受限的泛型域的假设(例如,被利用关于更加受限的泛型域的假设开发)。换句话说,一些类可能已经支持更广泛的泛型域。然而,其它类可能具有关于受限的泛型域的假设,并且因此可能需要大量修改(例如,细分)以支持扩展的泛型域。在其它实施例中,类可被开发为使得类的多数功能可被包括在任何细分层中,但某些方法可被包括(例如,“限制”)在引用层中,同时可在细分类内的一个或多个其它层中包括新的泛型方法以提供相同的功能。

因此,在一些实施例中,编译器120可被配置为通过允许创建类的细分版本来支持已有泛型类型的扩展的泛型域,所述类的细分版支持扩展的泛型并且也保持已有泛型类的兼容性(例如,源兼容性、二进制兼容性和/或行为兼容性)。在各种实施例中,可存在超过一种类型的兼容性,诸如源兼容性、二进制兼容性和/或行为兼容性。源兼容性可允许引用修改的类的源文件在已做出改变之后继续被编译。二进制兼容性可允许链接到修改的类的二进制文件在已做出改变之后继续合适地链接。行为兼容性可允许在修改类之前提供的功能与在修改类之后提供的功能相同。

如以下更详细所解释,根据一些实施例,类的细分版本可包括包含一个或多个类成员的版本的泛型层和与由可包括泛型层中的成员的其它版本的类支持的先前泛型域对应的层。在一个实施例中,编译器120可在类的细分版本中包括指示支持扩展的泛型的成员(例如,位于泛型层中的成员)和不支持扩展的泛型的至少一部分的成员(例如,位于对象层中的成员)的信息(例如,装饰(adornment)、属性、元数据等)。

在一些实施例中,虚拟化运行时环境140可被配置为将细分(例如,多层或剥离)的泛型类加载、实例化和/或特化。例如,在一些实施例中,虚拟化运行时环境140可被配置为将细分泛型类的完全泛型版本(例如,针对非引用类型实例化的泛型类的版本)加载和/或实例化。类似地,在另一实施例中,虚拟化运行时环境140可被配置为将与先前泛型域对应的相同的细分泛型类的版本加载和/或实例化(例如,针对引用类型实例化的泛型类的版本)。因此,根据各种实施例,虚拟化运行时环境140可被配置为既加载和/或实例化细分泛型类的完全泛型版本,又加载和/或实例化细分泛型类的不完全泛型版本。

另外,在一些实施例中,虚拟化运行时环境140可被配置为对于各种参数化的特化细分泛型类。例如,在一个实施例中,虚拟化运行时环境140可被配置为对于引用类型、原始类型、值类型和/或对于几乎任何类型特化单个细分泛型类。

作为一个示例,在一些实施例中,剥离(例如,将泛型类分解成多个层)可涉及将两个层引入到泛型类:完全泛型层和与先前泛型域对应的一个层(例如,特定于利用Textends Object的实例化的引用特定层),由此扩展类的泛型域,同时保持与已有实现方式的兼容性。剥离可被视为用于以兼容方式重写具有不完整或不一致的泛型的库类的技术。例如,传统泛型类是在假设它们将会仅应用于引用类型的情况下使用Java编程语言编写的。

在一些实施例中,将泛型类分解成多个层(例如,剥离)可包括:即使已有泛型类的一个或多个成员不支持扩展的泛型的至少一部分,也以兼容方式扩展所述类的泛型域。类的所述一个或多个成员可包括方法、字段、构造器和/或嵌套类型中的一个或多个。可创建在一个或多个层中包括类的所有成员的类的细分版本。

图2是表示根据一个实施例的包括多个层的细分泛型类的创建的逻辑方框图。如图2中所示,已有泛型类声明200可包括一个或多个类成员210。为了以兼容方式扩展泛型类的泛型域,如箭头220所指示,可产生细分泛型类声明230。例如,在一个实施例中,可在假设仅引用域的情况下,诸如在假设变量类型(用于泛型类的变量类型)仅在引用类型上变化的情况下,编写已有类声明200。为了将泛型域从仅引用域扩展到更大的域(例如,引用类型以及值类型),已有泛型类声明200可被重写以产生细分泛型类声明230。如上所述,细分类可包括多个层。根据由图2示出的实施例,细分泛型类声明230已被细分或“剥离”为包括泛型层240和与先前泛型域(例如,仅引用)对应的对象层250。

根据一个实施例,下面的示例性伪代码可代表已有泛型类声明200:

在以上的示例性代码中,可能已利用关于泛型域的假设编写方法void foo(T t),并且因此,方法void foo(T t)可能不支持扩展的泛型域。因此,像下面的示例性伪代码中一样,以上的示例性类可被分解或剥离成诸如由细分泛型类声明230表示的细分泛型类:

其接口和/或实现方式不适合(例如,不支持)扩展的泛型域的已有方法可被放到限制于先前域的层中。例如,在以上示例中,方法foo(T t)已被移动到引用特定层中。根据一些实施例,如以上示例中所示,可使用“layer”关键字指示类的不同层。然而,在其它实施例中,类的层可被以不同方式指示。例如,能够使用不同语法编写以上示例以指示引用特定层:

因此,如以下更详细所解释,在不同实施例中,可使用不同机制指示分解(例如,剥离)的类内的各个层。

泛型层240可包括完全泛型类成员260,当针对扩展的泛型域的类型(例如,除仅仅引用类型之外的类型)对泛型类进行实例化(或特化)时可使用完全泛型类成员260。在一个示例性实施例中,对象层250可以是包括受限方法成员270的引用特定层,受限方法成员270可被限制于针对引用类型对泛型类进行实例化(或特化)。尽管图2中示出的细分泛型类声明230包括两个层(例如,泛型层和对象层),但在其它实施例中,细分类可包括超过两个层以支持不同泛型域(例如,引用类型、原始类型、值类型、函数类型、元组类型等)。另外,细分泛型类内的不同层可包括不同类成员,诸如不同方法。例如,根据一些实施例,泛型层240可包括一个或多个类成员的抽象版本,而对象层250可包括在泛型层240中抽象的至少一些类成员的非抽象版本。

因此,在一些实施例中,编程语言可被增强以扩展泛型域,从而允许创建支持扩展的泛型并且同时保持与已有泛型类的兼容性(例如,源兼容性、二进制兼容性和/或行为兼容性)的类的细分版本。在一个实施例中,类信息(例如,装饰、属性、元数据等)的细分版本指示支持扩展的泛型的成员(例如,位于完全泛型层中的成员)和不支持扩展的泛型的至少一部分的成员(例如,位于与先前泛型域对应的层中的成员)。

图3是表示根据一个实施例的用于创建既包括完全泛型层又包括引用特定层的细分类的方法的一个实施例的流程图。如块300中所示,根据一些实施例,即使一个或多个类成员不支持扩展的泛型的至少一部分,包括一个或多个类成员的已有泛型类的泛型域也可被以兼容方式扩展。例如,如上所述,已有类声明200可包括一个或多个类成员210,所述一个或多个类成员210中的至少一个类成员可能不支持扩展的泛型。例如,可能已利用类将会仅在引用类型上是泛型的假设编写已有类声明200,并且因此,至少一个类成员可能不支持将泛型域扩展为包括原始(或其它非引用)类型。

根据各种实施例,如块310中所示,扩展已有类的泛型域可包括创建支持扩展的泛型并且保持与已有泛型类的兼容性的类的细分版本,并且还可涉及在类的细分版本中包括识别不支持扩展的泛型的至少一部分的所述一个或多个成员的一个或多个指示器,如块320中所示。例如,细分泛型类声明230可被产生,并且可包括识别类的完全泛型成员260和/或识别类的受限成员270的各种指示器。根据不同实施例,如以下参照图4更详细所解释,细分泛型类声明230可包括各种类型的指示器中的任何类型的指示器。

因此,根据一些实施例,可在逐个成员的基础上充分地区分不同层。另外,各种层还可通过子/超关系而合适地相关,在一些实施例中,这可能需要用于将超类型成员继承到子类型层中的详细规则。在一些实施例中,这种关系可允许软件重新使用的多个层。

例如,支持扩展的泛型域的新编写的程序可重新使用泛型层240(例如,扩展或超类型层),而能够接受先前泛型域(例如,仅引用限制)的已有程序(或代码库)可使用对象层250(例如,受限或子类型层),并且因此,可能不需要修改。例如,在一些实施例中,泛型类ArrayList<T>可与原始类型(诸如,int)以及与引用类型(诸如,String)一起使用。当如这里所述使用剥离时,泛型类(诸如,ArrayList)的泛型域可被扩展为包括原始和/或值类型,而不必重写在假设泛型类ArrayList可仅与引用类型一起使用(例如,利用引用类型实例化或特化)的情况下使用ArrayList的已有代码(例如,类、应用、库等)。

根据一些实施例,通过使与先前泛型域对应的层(例如,对象层或受限层)在功能上与泛型类的传统已有类型相同,可提供向后兼容。根据各种实施例,分层/分解的另外的应用还可提供其它益处,诸如用于旧(受限边界)和新(不受限)系统中的类型的特化的实现方式。

另外,在一些实施例中,类可包括类型特定的一个或多个层,如下面的示例性伪代码中所示:

类的细分版本还可包括用于不支持扩展的泛型的至少一部分的类成员的特殊处理的指令,并且类成员的特殊处理可保持与类的已有使用的兼容性(例如,源兼容性、二进制兼容性和/或行为兼容性)。在一些实施例中,例如,用于特殊处理的指令可至少部分地由类的过载方法的静态或动态类型的输入触发。

图4是表示根据一个实施例的具有多个层的泛型类的一个示例的逻辑图。如图4中所示,编译器120可被配置为支持从已有泛型类400产生(如箭头410所指示)细分泛型类420。例如,在一些实施例中,泛型类400(诸如,ListLike<T>)可在逻辑上被划分或“剥离”成两个层——泛型层430和引用特定或对象层440。泛型层430可在扩展的泛型上是泛型的,而对象层440可特定于类型变量的先前泛型域(例如,在由图4示出的实施例中,引用实例化),从而保持与已有实现方式和客户机的兼容性。

在一些实施例中,对于类使用多个层可以使得能够在特化内处理原始类型和引用类型之间(诸如,replace(int)和replace(T)之间)的潜在冲突。当将已有泛型类迁移到具体化、扩展或特化的泛型时,已有泛型类可能具有兼容性问题。例如,在使用扩展的泛型域进行特化的情况下,传统上有效的某些过载可能变得存在问题。例如,下面的示例性代码:

在假设T代表引用类型的情况下是非常好的,但当泛型被扩展以使得T可采用值或原始类型(例如,int)时,这可能变得存在问题,因为可能无法区分这两种remove方法。利用取决于用于引用T的ListLike<T>的代码的主体,在不破坏兼容性的情况下,以上示例中的remove方法都可能无法被去除或重新命名。然而,可能需要在特化侧(例如,产生什么方法)以及在过载选择(例如,调用哪个方法)上解决这些方法。换句话说,根据一些实施例,当产生特化的代码时以及当编译客户机代码时,都可消费(例如,使用)分层信息。

例如,考虑以上使用的List-like类示例中的过载对:

ListLike的传统(例如,旧)使用可隐含地取决于T的域不包括int(例如,因为int是非引用类型)的事实,并且因此,可仅包括引用实例化(例如,因为这可以是在以前仅允许的实例化)。因此,兼容性可能需要引用实例化具有全部这些方法,但可能不需要关于非引用实例化的任何事情(例如,因为可能在传统上全都不存在)。

然而,在一些实施例中,扩展泛型域可以使得能够在扩展的泛型域内处理原始类型和引用类型之间(诸如,replace(int)和replace(T)之间)的潜在冲突。例如,以上ListLike示例性代码在建设T代表引用类型的情况下是非常好的,但当泛型被扩展以使得T可采用值或原始类型(例如,int)时,这可能变得存在问题,因为可能无法区分这两种remove方法。例如,利用取决于用于引用T的ListLike<T>的代码的主体,在不破坏兼容性的情况下,以上示例中的remove方法都可能无法被去除或重新命名。

然而,在一些实施例中,剥离可允许示例性ListLike类被如图4中所示并且像下面的示例性代码中一样重写:

ListLike的细分版本可包括一个或多个指示器,所述一个或多个指示器指示哪些成员是完全泛型的以及哪些成员不支持ListLike的细分版本的扩展的泛型。根据各种实施例,各种方法中的任何方法可被用于指示方法(和/或类的其它成员)在所有类型上是泛型的以及它们被包括在泛型层430中。在一些实施例中,完全泛型层430中的方法(或方法声明)可被注释(例如,使用各种装饰中的任何装饰)以指示:它们在所有类型上是泛型的,而非仅在引用类型上是泛型的。在一个实施例中,所述方法声明可被利用一个或多个特殊标记、符号和/或关键字装饰,而在其它实施例中,特定元数据(例如,在实际方法声明内或与实际方法声明分开)可指示:特定方法声明在所有类型上是泛型的。在另一实施例中,另外的属性和/或元数据可被添加到所述类,指示哪些方法是完全泛型的。

另外,在一些实施例中,细分类420可包括识别位于与先前泛型域对应的层中的类成员的指示器。如上所述,根据各种实施例,各种方法、方式和/或语法中的任何方法、方式和/或语法可被用于指示方法(和/或类的其它成员)仅在先前(受限)泛型域内是泛型的并且它们被包括在对象层440中。例如,一些实施例中,对象层440中的方法(或方法声明)可被注释(例如,使用各种装饰中的任何装饰)以指示:它们仅对于引用类型是泛型的。在一个实施例中,所述方法声明可被利用一个或多个特殊标记、符号和/或关键字装饰,而在其它实施例中,特定元数据(例如,在实际方法声明内或与实际方法声明分开)可指示:所述特定方法声明仅在先前(受限)泛型域内是泛型的。在另一实施例中,另外的属性和/或元数据可被添加到所述类,指示哪些方法仅在先前泛型域内是泛型的。

在其它实施例中,指示器可被添加以识别仅在一个层中的成员(例如,其它层中的成员可被识别为不在指示的层中的那些成员)。另外,不同类型的指示器和/或语法可被用在不同实施例中并且用于指示同一个类内的不同类型的成员。

在一些实施例中,类的细分版本可包括包含类的一个或多个成员的抽象版本的泛型层和包括在泛型层中抽象的至少一个类成员的非抽象版本的与先前泛型域对应的层。泛型层430可包括抽象方法,诸如remove(T)和removeAt(int)。在一些实施例中,针对T=int新特化的类可对于这些抽象方法而言没有问题。引用特定(例如,对象)层440还可包括(或添加)抽象方法(诸如,示例性remove(int))以及来自泛型层的一个或多个方法的具体实现方式(诸如,remoteAt(int)方法)。在一些实施例中,使用ListLike<T>(其中T扩展了Object)的已有代码可看见熟悉的remove(Object)和remove(int)方法,由此提供兼容性。换句话说,已有类文件将会发现它们寻找的方法(例如,二进制兼容性),并且已有客户机和实现方式能够被针对更新的库重新编译而没有不良作用(例如,源兼容性)。另外,针对非引用类型(诸如,int)的ListLike<T>的特化可看见一对无问题的方法remove(T)和removeAt(int)。

已有实现方式(例如,不支持扩展的泛型域)可预期存在remove(T)和remove(int),并且可预期它们是抽象的,同时预期不会看见新的抽象方法(例如,所述新的抽象方法的存在可引起编译器错误)。根据一个示例性实施例,通过在引用层中包括remove(int)的声明和removeAt(int)的实现方式,可保持与已有实现方式的兼容性。换句话说,引用实例化可具有remove(T)和remove(int)以及新的removeAt(int),由此可确保兼容性,而特化可具有remove(T)和removeAt(int)的(非问题)过载。因此,根据一些实施例,ListLike的已有实现方式可继续编译(即使它们不支持扩展的泛型域),因为新方法removeAt(int)具有用于引用特化的默认值。然而,根据一些实施例,对于原始特化,removeAt可被视为抽象并且可能需要提供removeAt,但remove可能根本不存在。

在一些实施例中,对象层440中所包括的方法(或其它类成员)(例如,仅在引用类型上是泛型的那些方法(或其它类成员))可被视为抽象和不抽象。例如,使用以上的ListLike示例,一些方法(例如,以上示例中的remove)可在T是引用的情况下实现,但在T是值的情况下可能无法实现。

在一些实施例中,虚拟化运行时环境140可被配置为将细分(例如,多层或剥离)的泛型类加载、实例化和/或特化。例如,在一些实施例中,虚拟化运行时环境140可被配置为将细分泛型类的完全泛型版本(例如,针对非引用类型实例化的泛型类的版本)加载和/或实例化。类似地,在另一实施例中,虚拟化运行时环境140可被配置为将与先前泛型域对应的相同的细分泛型类的版本(例如,针对引用类型实例化的泛型类的版本)加载和/或实例化。因此,根据各种实施例,虚拟化运行时环境140可被配置为既加载和/或实例化细分泛型类的完全泛型版本,又加载和/或实例化细分泛型类的不完全泛型版本。

图5是表示在一个实施例中的基于细分泛型类的类的实例化的逻辑方框图。根据一些实施例,当细分(例如,多层)泛型类(诸如,细分类)500被加载时,运行时环境(例如,基于Java的系统中的VM)可分析所述类以确定哪些方法(或其它成员)被限制于特定参数化,并且可忽略不适用于所述特定实例化的那些方法。如上所述,细分类文件可包括指示器(例如,属性、装饰、元数据等),所述指示器可识别被限制于特定参数化(或完全泛型)的特定类成员,并且类加载器可使用这些指示器确定使用哪些类成员以及(可)忽略哪些类成员。

因此,在一个实施例中,当如箭头530所指示,细分类500被加载和/或实例化为类的完全泛型版本(例如,针对非引用类型实例化)时,类加载器可产生类的完全泛型版本,所述类的完全泛型版本包括来自泛型层510的那些类成员并且可不包括来自对象层520的那些类成员(例如,被指示为不支持特定的扩展的泛型),如完全泛型类声明550中所示。

另外,根据一个实施例,当如箭头540所指示,细分类500被加载和/或实例化为不支持扩展的泛型域的类的版本(例如,针对引用类型实例化)时,类加载器可产生类的引用特定版本,如引用特定类声明560所示,所述类的引用特定版本包括来自对象层520的那些类成员,而不包括来自泛型层的类成员,如引用特定类声明560中所示。需要注意的是,尽管图5表示使用与仅引用泛型域对应的先前泛型域的实施例并且根据使用与仅引用泛型域对应的先前泛型域的实施例描述图5,但在其它实施例中,不同类型(和或一组类型)可被包括在各种泛型域中的任何泛型域中(并且因此,被包括在细分泛型类的不同层中)。

图6是表示根据一个实施例的用于加载(和/或实例化)细分泛型类的完全泛型版本的方法的一个实施例的流程图。如块600中所示,根据一些实施例,类加载器(或运行时环境的其它部件)可加载细分类的完全泛型版本,所述细分类的完全泛型版本包括包含一个或多个类成员的抽象版本的泛型层和包括在泛型层中抽象的至少一个类成员的非抽象版本的引用特定层。

例如,如以上关于图5所述,类加载器可基于细分类500加载类。细分类500可包括泛型层510和对象或引用特定层520。在一些实施例中,用于加载类的完全泛型版本(例如,用于非引用类型的类的版本)的方法可涉及:在细分类的完全泛型版本中包括在泛型层中抽象的所述一个或多个类成员,如块610中所示。例如,细分类500的完全泛型版本可包括来自泛型层510的类成员remove(T)和removeAt(int),如完全泛型类声明550中所示。

用于加载类的完全泛型版本(例如,用于非引用类型的类的版本)的方法也可涉及:不在细分类的完全泛型版本中包括不支持扩展的泛型的至少一部分的一个或多个类成员,如块620中所示。例如,完全泛型类声明550可能不包括来自对象层520的类成员,如上所述,所述来自对象层520的类成员可能不在非引用类型上支持泛型。在一些实施例中,对象层中所包括的类成员(例如,仅在引用类型上是泛型的那些类成员)可被视为抽象和不抽象。因此,根据一些实施例,一些方法(例如,以上的ListLike示例中的remove)在T是引用的情况下可实现,但在T是值的情况下可能无法实现。需要注意的是,尽管图6表示使用与仅引用泛型域对应的先前泛型域的实施例并且根据使用与仅引用泛型域对应的先前泛型域的实施例描述图6,但在其它实施例中,不同类型(和或一组类型)可被包括在各种泛型域中的任何泛型域中(并且因此,被包括在细分泛型类的不同层中)。

图7是根据一个实施例的用于加载(和/或实例化)与先前泛型域对应并且不支持扩展的泛型域的细分泛型类的版本的方法的一个实施例的流程图。如块700中所示,在一个示例性实施例中,类加载器(或运行时环境的其它部件)可加载细分类的引用特定版本。如上所述,类的已有实现方式(例如,不支持扩展的泛型域)可预期存在某些方法,并且可预期它们是抽象的,同时预期不会看见新的抽象方法(例如,所述新的抽象方法的存在可引起编译器错误)。因此,根据一些实施例,与以上关于图6描述的加载类的完全泛型版本一样,所述细分类可包括包含一个或多个类成员的抽象版本的泛型层和包括在泛型层中抽象的至少一个类成员的非抽象版本的引用特定层。

根据一些实施例,如块710中所示,用于加载细分类的引用特定版本的方法可涉及:不在细分类的引用特定版本中包括在泛型层中抽象的所述一个或多个类成员。例如,如引用特定类声明560中所示,类的引用特定版本可不包括来自泛型层510的抽象成员(例如,引用特定类声明560不包括来自泛型层的抽象方法remove(T))。用于加载细分类的引用特定版本的方法也可涉及:在细分类的引用特定版本中包括不支持扩展的泛型的至少一部分的类成员,如块720中所示。例如,如引用特定类声明560中所示,类的引用特定版本可包括来自对象层520的那些类成员,所述来自对象层520的那些类成员(引用特定)不支持扩展的泛型(例如,它们不在非引用类型上支持泛型)。

需要注意的是,尽管图7表示使用与仅引用泛型域对应的先前泛型域的实施例并且根据使用与仅引用泛型域对应的先前泛型域的实施例描述图7,但在其它实施例中,不同类型(和或一组类型)可被包括在各种泛型域中的任何泛型域中(并且因此,被包括在细分泛型类的不同层中)。

当对类进行特化时,也可使用细分类的多个层。例如,当细分类被特化时,特化器可使用类文件作为输入以产生新的类文件,将输入类文件的每个方法(或其它类成员)变换成所述新的类文件的对应方法(或其它成员)。然而,在一些实施例中,特化器可(在所述新的类文件中)不包括不适用于正在执行的特定特化的某些方法/成员。与类加载器一样,特化器可使用各种类型的指示器中的任何类型的指示器确定对哪些类成员进行特化以及在所述新的类文件中不包括哪些类成员。

图8是表示根据一个实施例的用于将用于非引用类型参数化的细分泛型类特化的方法的一个实施例的流程图。如块800中所示,用于对用于非引用类型参数化的细分泛型类进行特化的方法可包括:创建包括在泛型层中抽象的一个或多个类成员的细分类的特化版本,如块810中所示,而不包括不支持扩展的泛型的至少一部分的一个或多个类成员,如块820中所示。

例如,用于非引用类型(例如,int)的细分类500的特化可涉及创建包括来自泛型层510的抽象成员(诸如,remove(T))的类的特化版本,但可不包括来自对象层520的引用特定成员,所述来自对象层520的引用特定成员可不在非引用类型上支持特化。

另外,在一些实施例中,某些类可具有这样的方法:所述方法的签名“错误地”包括关于先前泛型域的假设。例如,尽管从一批对象去除等于给定对象的对象的方法的自然声明可能是remove(T),但开发者经常将这种方法声明编码为remove(object),当隐式泛型域对应于T extends Object(例如,仅引用泛型域)时,这是无害的,但当泛型域被扩展时,这可变得存在问题。例如,Collection类可具有remove(T)方法,所述remove(T)方法可被声明为remove(Object),但当类被特化时,这些方法可能也需要被特化(例如,Collection.remove的实参类型是Object,而不是T)。因此,在一些实施例中,根据一些实施例,注释(或其它指示器)可被用于指示该方法应该被特化,就好像这个类型参数被声明为T。不同形式的注释可被用在不同实施例中。例如,在一些实施例中,可使用@SpecializeAsFullyGeneric形式的注释。

另外,将泛型类分解成多个层也可被应用以便可消除针对某些类型的可null的结果的问题。例如,null可被视为每个引用类型的有效值,并且可因此被用于代表这样的事实:没有什么东西位于正在引用的位置,或者所述引用不表示任何位置。然而,原始类型和值类型可能不具有null的类似物。这可被视为对某些方法(诸如,被定义为返回null的方法)的挑战。例如,在一个实施例中,方法Map.get可被定义为在不能在map中找到指定键的情况下返回null。

根据一些实施例,利用null的某些操作(例如,分派null和与null比较)可被分派特定语义。例如,在一些实施例中,分派null可被视为分派零值。零可被视为未初始化的字段和阵列元素被设置的值(例如,数字类型的零、boolean的false等)。类似地,在一些实施例中,与null的比较可被视为与零值的比较。然而,在其它实施例中,这种处理可能引入模糊性,其中可能无法区分没有值(例如,引用null)和等于零的值(例如,未初始化的数字或布尔类型)。类似地,使用Map.get的传统行为,返回值null能够意味着“没有映射”或者能够意味着“映射到null”。替代地,在一些实施例中,null的某些使用可被禁止,这可不利地影响一些类(诸如,Java中的HashMap类)的某些使用(例如,可特化性)。

在一些实施例中,将泛型类分解多个层可被用于潜在地消除原始类型(或不支持扩展的泛型域的其它类型)的可null结果的问题。例如,Map.get可被移动到引用特定层中(例如,用于特化),并且原始实例化可使用getOrDefault方法(例如,在完全泛型层中)。例如:

类似于以上的ListLike示例,示例性类Map<K,V>可包括多个层,诸如完全泛型层和与先前泛型域对应的层。完全泛型层可包括抽象方法getOrDefault(K key,VdefaultValue)。在一些实施例中,对于这个抽象方法,针对值类型的新特化的类可能没有问题。与先前泛型域对应的层可包括(或添加)抽象方法(诸如,示例性getK key))以及来自泛型层的方法的具体实现方式(诸如,getOrDefault(K key,V defaultValue))方法。

当针对非引用类型对以上示例性Map类进行特化时,通过如上所述包括来自泛型层的抽象方法而不包括来自对象层的方法,特化器可产生Map类。替代地,根据一些实施例,当针对非引用类型对以上示例性Map类进行特化时,通过包括来自对象层的方法而不包括(例如,忽略)来自泛型层的抽象方法,特化器可产生Map类。

因此,在一些实施例中,Map<K,V>(其中T扩展了Object)的已有客户机可看见remove(Object)和remove(int)方法(例如,当Map针对引用类型而被特化时),由此可保持二进制兼容性,同时针对非引用类型(诸如,int)的ListLike<T>的特化可看见一对无问题的方法remove(T)和removeAt(int)。

在至少一些实施例中,实现这里描述的一种或多种技术的一部分或全部的计算机系统可包括通用计算机系统,所述通用计算机系统包括一个或多个计算机可读介质或被配置为访问一个或多个计算机可读介质。图9表示适合实现这里描述的方法、特征和增强的这种通用计算装置3000。在示出的实施例中,计算装置3000包括经输入/输出(I/O)接口3030耦合到系统存储器3020的一个或多个处理器3010。计算装置3000还包括耦合到I/O接口3030的网络接口3040。

在各种实施例中,计算装置3000可以是包括一个处理器3010的单处理器系统或包括几个处理器3010(例如,两个、四个、八个或另一合适的数量)的多处理器系统。处理器3010可包括能够执行指令的任何合适的处理器。例如,在各种实施例中,处理器3010可以是执行各种指令集架构(ISA)中的任何指令集架构(ISA)(诸如,x86、PowerPC、SPARC或MIPSISA或任何其它合适的ISA)的通用或嵌入式处理器。在多处理器系统中,每个处理器3010可通常但并不必然执行相同的ISA。

系统存储器3020可被配置为存储可由处理器3010访问的程序指令和数据。在各种实施例中,可使用任何合适的存储技术(诸如,静态随机存取存储器(SRAM)、同步动态RAM(SDRAM)、非易失性/闪存类型存储器或任何其它类型的存储器)实现系统存储器3020。在示出的实施例中,实现一个或多个预期功能的程序指令和数据(诸如,上述那些方法、技术和数据)被示出为在系统存储器3020内存储为代码(即,程序指令)3025和数据3026。例如,在一个实施例中,存储器3020以及代码3025和数据3026可存储用于实现上述编译器120和/或虚拟化运行时环境140的程序指令和数据。

在各种实施例中,编译器120和/或虚拟化运行时环境140(和/或其任何个体子模块)可分别被按照各种编程语言或方法中的任何编程语言或方法实现。例如,在一个实施例中,可按照C、C++、汇编、JAVA或其它通用编程语言中的任何编程语言编写编译器120和/或虚拟化运行时环境140,而在另一实施例中,可使用不同的更加专业的编程语言编写编译器120和/或虚拟化运行时环境140中的一个或多个。此外,在一些实施例中,可不使用相同的编程语言实现编译器120和/或虚拟化运行时环境140(和/或其各种子模块)。

在一个实施例中,I/O接口3030可被配置为协调处理器3010、系统存储器3020和所述装置中的任何外围装置(包括网络接口3040或其它外围接口)之间的I/O业务。在一些实施例中,I/O接口3030可执行任何必要的协议、定时或其它数据变换以将来自一个部件(例如,系统存储器3020)的数据信号转换成适合由另一部件(例如,处理器3010)使用的格式。在一些实施例中,I/O接口3030可包括对通过各种类型的外围总线(诸如,例如外围部件互连(PCI)总线标准或通用串行总线(USB)标准的变型)连接的装置的支持。此外,在一些实施例中,I/O接口3030的一些或全部功能(诸如,与系统存储器3020的接口)可被直接包括在处理器3010中。

网络接口3040可被配置为允许在计算装置3000和连接到一个或多个网络3050的其它装置3060之间交换数据。在各种实施例中,网络接口3040可支持经任何合适的有线或无线通用数据网络(诸如,例如以太网网络的类型)的通信。

在一些实施例中,系统存储器3020可以是计算机可读(例如,计算机可访问)介质的一个实施例,所述计算机可读介质被配置为存储用于实现对应方法和设备的实施例的如以上参照图1-8所述的程序指令和数据。然而,在其它实施例中,可在不同类型的计算机可读介质上接收、发送或存储程序指令和/或数据。一般而言,计算机可读介质可包括经I/O接口3030耦合到计算装置3000的非暂态存储介质或存储器介质,诸如磁介质或光学介质(例如,盘或DVD/CD)。非暂态计算机可读存储介质还可包括任何易失性或非易失性介质,诸如RAM(例如,SDRAM、DDR SDRAM、RDRAM、SRAM等)、ROM等,所述任何易失性或非易失性介质可被包括在计算装置3000的一些实施例中作为系统存储器3020或另一类型的存储器。

另外,计算机可读介质可包括经通信介质(诸如,网络和/或无线链路)传送的传输介质或信号(诸如,电信号、电磁信号或数字信号),诸如可经网络接口3040实现。在各种实施例中,多个计算装置(诸如,图9中示出的计算装置)中的一部分或全部可被用于实现描述的功能;例如,在各种不同装置和服务器上运行的软件部件可合作以提供所述功能。在一些实施例中,除了使用通用计算机系统实现描述的功能的一部分之外或替代于使用通用计算机系统实现描述的功能的一部分,可使用存储装置、网络装置或专用计算机系统实现描述的功能的一部分。如这里所使用,术语“计算装置”表示至少所有这些类型的装置,但不限于这些类型的装置。

各种实施例还可包括接收、发送或存储根据前面的描述在计算机可读介质上实现的指令和/或数据。一般而言,计算机可读介质可包括存储介质或存储器介质,诸如磁介质或光学介质(例如,盘或DVD/CD-ROM)、易失性介质或非易失性介质(诸如,RAM(例如,SDRAM、DDR、RDRAM、SRAM等)、ROM等)。在一些实施例中,计算机可读介质还可包括经通信介质(诸如,网络和/或无线链路)传送的传输介质或信号(诸如,电信号、电磁信号或数字信号)。

如附图中所示并且如这里所述的各种方法代表方法的示例性实施例。所述方法可被实现于软件、硬件或者其组合。在各种方法中,步骤的次序可被改变,并且各种元件可被添加、重新排序、组合、省略、修改等。各种步骤可被自动地(例如,不通过用户输入来直接提示)和/或以编程方式(例如,根据程序指令)执行。

尽管已在这里参照特定实施例并且在特定实施例的情况下描述各种系统和方法,但将会理解,这些实施例是说明性的并且本公开的范围不限于这些特定实施例。可实现许多变化、修改、添加和改进。例如,在描述中识别的块和逻辑单元用于理解描述的实施例,而非意图限制本公开。例如,在一些实施例中,这里描述为由编译器120执行的动作、处理、方法、任务或功能可由虚拟化运行时环境140执行,反之亦然。另外,在这里描述或利用不同术语描述的系统和方法的各种实现中,可按照不同方式在块中分离或组合功能。

这些实施例应该是说明性的,而非限制性的。因此,可为这里描述的部件提供多个实例作为单个实例。各种部件、操作和数据仓库之间的边界是稍微任意的,并且在特定说明性结构的情况下示出特定操作。可设想功能的其它分配,并且所述功能的其它分配可落在下面的示例的范围内。最后,在示例性结构中作为分立部件提供的结构和功能可被实现为组合结构或部件。

虽然已详细地描述以上实施例,但一旦充分理解以上公开,许多变化和修改将会变得清楚。下面的权利要求应该被解释为包括所有这种变化和修改。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号