动态地产生的基于模式的类的结构识别的制作方法

文档序号:12287759阅读:222来源:国知局
本发明一般地涉及软件开发,并且更具体地讲,涉及各种编程语言中的任何编程语言(诸如,作为一个示例,独立于平台的面向对象的编程语言)内的语言开发的各种方面。在面向对象的编程中,传统上通过名称来引用类。如果两个类引用具有相同名称(并且具有相同起源,诸如被从同一类加载器或存储库加载),则它们被视为相同。另外,通过将模式或模板实例化来产生类是常见的开发技术。例如,这种实例化可采用由开发者执行的手动编码或由工具执行的机械模板扩展的形式。尽管基于模式或模板产生的类可提供更多的可表达性和可读性,但机械模板实例化经常依赖于类的功能的描述和类的名称之间的脆弱的映射,从而频繁地将难看的机器产生的“弄糟”的名称暴露给用户,同时在该处理中丢弃信息(例如,类Account$ImmutableWrapper是将“immutablewrapper”模板应用于类型“Account”的结果)。如果描述和类名之间的映射变化,则具有相同名称的两个类引用可能不二进制兼容,因为它们可能不再执行相同功能。技术实现要素:可使用结构描述来使用动态地产生的模式实例化类的结构识别,以便诸如扩展在运行时环境中描述类的方式。替代于仅通过名称来描述类并且使用该名称定位该类(例如,在盘上的类文件中),类可被引用为代码生成器函数和可能的一些实参的组合。换句话说,在一些实施例中,可通过结构描述来描述类,所述结构描述指定生成器函数和针对该生成器函数的可能的一个或多个形参。在一些实施例中,对于可使用类名的几乎任何情况(例如,实参类型、返回类型、字段类型、超类型、instanceof或cast操作符的操作数等),结构描述可被视为类名(例如,可替代于类名而使用结构描述)。例如,编译器和/或虚拟化运行时环境可被配置为允许使用结构描述的类的描述。另外,结构描述可被视为对用于产生类的制法进行编码。可使用类的结构描述将类进行比较。更一般地讲,能够按照结构机械方式针对两个类描述比较等同性。附图说明图1是表示根据各种实施例的用于编译和执行按照高级的面向对象的语言指定并且被配置为支持类的结构描述的计算机程序的工作流程的逻辑方框图。图2是表示根据一个实施例的如这里所述的类的结构描述的逻辑方框图。图3是表示根据一个实施例的基于结构描述的类的产生的逻辑方框图。图4是表示如这里所述的用于基于类的结构描述产生类的方法的一个实施例的流程图。图5是表示如这里所述的用于基于两个类的结构描述比较所述两个类的方法的一个实施例的流程图。图6是表示根据一个实施例的以递归方式使用的结构描述的逻辑图。图7是表示根据一个实施例的适合使用结构描述实现动态地产生的模式实例化产生的类的结构识别的示例性计算机系统的逻辑方框图。具体实施方式这里描述使用独立于平台的面向对象的语言(诸如,JavaTM编程语言)支持各种特征(诸如,使用类的结构描述的动态地产生的模式实例化产生的类的结构识别)的软件开发的增强的各种实施例。根据一些实施例,可使用结构描述来使用动态地产生的模式实例化类的结构识别,以便诸如扩展在运行时环境中描述类的方式。替代于仅通过名称来描述类并且使用该名称找到该类(例如,在盘上的类文件中),类可被引用为字节码生成器函数以及一些静态实参的组合。换句话说,在一些实施例中,可通过结构描述来描述类,所述结构描述指定生成器函数(例如,“从T到U的函数”、“T的数组”、“T和U的元组”、“用于接口I的远程代理”等)和针对该生成器函数的可能的一个或多个形参。在一些实施例中,对于使用类名的几乎任何情况,结构描述可被视为(例如,可被用作)类名。例如,用于类的结构描述可包括对模式的引用(通过名称或通过对实现所述模式的类或方法的引用)和针对模式的实例化的形参。在一些实施例中,结构描述可包括指示生成器函数的信息和针对该生成器函数的一个或多个形参。在一些实施例中,如果两个结构引用具有相同的模式和形参,则所述两个结构引用可被视为同一个类(或引用同一个类)。因此,在一些实施例中,可按照传统上使用类的各自类名对类进行比较的相同的方式使用类的各自结构描述对类进行比较。事实上,在一些实施例中,类的结构描述可被视为类名,并且可替代于类名而使用类的结构描述,并且因此,可使用类的类名(所述类名可以是结构描述)对类进行比较。在一些实施例中,可在两个类的比较中涉及在类的结构描述中识别的生成器函数。例如,生成器函数可按照可允许生成器函数确定两个实例化是否相同的方式使用(例如,执行)。因此,在一些实施例中,生成器函数可被配置为参与“我是与他相同的实例化吗”的判断,因为在一些情况下,针对实例化的形参可能是可交换的(例如,用于多个接口的动态代理),而在其它情况下,它们可能不是可交换的。根据一些实施例,类的结构描述可在纯粹名称上的VM(例如,未被配置为支持作为类名的结构描述的VM)中出现在类名原本能够出现的任何地方。例如,类的结构描述可作为实参类型、返回类型、字段类型、超类型、instanceof或cast操作符的操作数而出现,或替代于实参类型、返回类型、字段类型、超类型、instanceof或cast操作符的操作数而出现,并且通常出现在可使用类名的任何地方。在下面的详细描述中,阐述许多特定细节以提供对要求保护的主题的彻底的理解。然而,本领域技术人员将会理解,可在没有这些特定细节的情况下实施要求保护的主题。在其它实例中,因为本领域普通技术人员知道方法、设备或系统,所以以下未详细地描述所述方法、设备或系统以免模糊要求保护的主题。尽管对于几个实施例和说明性附图作为示例在这里描述了各种实施例,但本领域技术人员将会意识到,实施例不限于描述的实施例或附图。应该理解,附图及其详细描述并不意图将实施例限制于公开的特定形式,而是相反地,意图包括落在本公开的精神和范围内的所有变型、等同物和替代物。这里使用的任何标题仅用于组织目的,而非意图用于限制该描述的范围。如在整个本申请中所使用,在许可意义(即,意味着具有可能性)而非强制性意义(即,意味着必须)上使用词语“可”。类似地,词语“包括”、“包含”和“具有”表示包括但不限于。按照对存储在特定设备或专用计算装置或平台的存储器内的二进制数字信号的操作的算法或符号表示提供下面的详细描述的一些部分。在这个特定说明书的上下文中,一旦通用计算机被编程为根据来自程序软件的指令执行特定功能,则术语特定设备等包括所述通用计算机。算法描述或符号表示是由信号处理或相关领域普通技术人员用于将他们的工作的实质传达给其他本领域技术人员的方法的示例。算法在这里通常被视为导致预期结果的前后一致的一系列操作或类似信号处理。在这种情况下,操作或处理涉及物理量的物理操纵。通常,但并非必然,这种量可采取能够被存储、传送、组合、比较或以其它方式操纵的电信号或磁信号的形式。有时,主要由于常用的原因,已证明将这种信号称为位、数据、值、元素、码元、字符、项、数、数字等是比较方便的。然而,应该理解,所有这些或类似术语应该与合适的物理量关联并且仅是方便的标签。除非另外具体地指出,否则从下面的讨论清楚可知,应该理解,在本说明书中,使用诸如“处理”、“计算”、“核算”、“确定”等的术语的讨论始终表示特定设备(诸如,专用计算机或类似专用电子计算装置)的动作或处理。因此,在本说明书的上下文中,专用计算机或类似专用电子计算装置能够操纵或变换在专用计算机或类似专用电子计算装置的存储器、寄存器或其它信息存储装置、传输装置或显示装置内通常表示为物理电子量或磁量的信号。根据各种实施例,这里描述的方法和/或特征可涉及语言开发的各种方面,诸如例如包括用于在Java虚拟机(JVM)中描述动态地获得的类的基础支持、用于将语言级别概念翻译成JVM能够执行的字节码的Java编译器中的翻译机构和用于表示以前不能表示的事物的在Java语言中暴露的特征。根据Java编程语言和/或使用利用Java编程语言的软件开发的特征讨论这里描述的方法、技术、特征和/或增强的各种实施例。然而,根据各种实施例,这里描述的方法、技术、特征和其它增强也可被与其它编程语言(诸如,C、C++、C#、Python)一起使用。现在参照图1,图1表示根据各种实施例的用于编译和执行按照高级的独立于平台的面向对象的语言指定的计算机程序的工作流程以及关于如这里所述的类的结构描述的各种方法、特征和增强。为了说明的目的,主要在使用JavaTM编程语言的情况下提供下面的描述。然而,需要注意的是,描述的技术可被与支持在名称上描述的用户定义的类的几乎任何编程语言一起使用。通常,类可被视为用户定义的类型或数据结构,所述用户定义的类型或数据结构可包括数据、变量、函数、方法和/或其它属性作为成员并且代表用于创建特定类型的编程对象的定义、蓝图或模板。类可为数据成员提供初始值并且为成员函数和方法提供实现方式。类经常被包括在库中。库可被视为由软件程序或应用使用的一批资源。根据一些实施例,库可包括各种类型的资源中的任何资源,包括但不限于数据、文件、类、子程序和/或类型规范。库可被组织以便由超过一个应用(可能同时)使用,并且可通过提供资源来提升可重用性,以使得应用可不必实现(或重新实现)相同行为。根据示出的实施例,当编译器(诸如,编译器120)接收到用于计算机程序的源代码(诸如,源代码文件110)时,工作流程可开始。在各种实施例中,可按照各种高级和/或独立于平台的面向对象的编程语言(诸如,JavaTM和/或其它语言)指定源代码文件110。例如,在使用JavaTM的实施例中,源代码可被提供作为一组.java文件。在一些实施例中,可使用语言的组合指定源代码文件110,所述组合可包括一种或多种低级和/或中间语言(例如,汇编)。在一些实施例中,可初始地按照动态类型的高级语言(诸如,Python或Ruby)编写至少一些源代码,而在其它实施例中,所有的源代码可具有静态类型的语言(诸如,JavaTM)。在描述的实施例中,编译器120可分析源代码文件110以产生程序的可执行版本或字节码文件,诸如类文件130(例如,在JavaTM的情况下的.class文件或.jar文件)。不同类型的可执行代码格式可被用于各种实施例;例如,可替代于字节码而使用二进制机器语言。在一些场景中,类文件130中的可执行代码的一部分可以是字节码,而其它部分是原生二进制机器语言。根据一些实施例,作为将程序源代码文件110编译为类文件130的一部分,编译器120可执行一系列分析操作并且在产生可执行版本之前产生各种中间数据结构,以便诸如应用或实现类的结构描述。例如,编译器可在创建类文件130时添加或包括类的一个或多个结构描述。如上所述,结构描述可包括指示生成器函数的信息和针对该生成器函数的一个或多个形参。如图1中所示,类文件130可被传送给执行环境,诸如虚拟化运行时环境140,虚拟化运行时环境140在执行平台102上执行代码,由此创建各种输出数据和/或行为。根据各种实施例,虚拟化运行时环境140又可包括许多不同部件,诸如类加载器150、存储管理器160、字节码校验器170(例如,用于检查可执行代码的有效性)和/或解释器和/或即时(JIT)编译器180。在一些实施例中,JIT编译器可负责将一些或全部的字节码(例如,字节码的大量使用的部分)翻译成平台特定机器代码以提高程序执行的性能。在一些实施例中,虚拟化运行时环境140还可包括用于实现许多应用编程接口(API)库190的代码。在一些实施例中,虚拟化运行时环境140可在低层软件(诸如,操作系统192)上运行。在不同实施例中,作为编译代码的执行的结果产生的输出或行为可包括存储在各种级别的系统存储器中的数据(例如,内存对象和/或数据结构)、存储在持久存储器上的数据(例如,文件系统中的文件)等。所述行为还可包括各种程序功能,诸如在屏幕上显示输出、经网络发送消息和/或以其它方式与各种用户和/或部件交互。在一些实施例中,虚拟化运行时环境140可使用由编译器120产生的类文件130实现类的结构描述。根据一些实施例,实现类的结构描述的虚拟化运行时环境140可在加载类时使用来自类文件130的结构描述(以及针对结构描述的形参),并且可产生新的类,所述新的类可以是将生成器函数(如结构描述中所指定)应用于形参(也在结构描述中指定)的结果。动态地产生的模式实例化的结构识别。根据一些实施例,可使用结构描述来使用动态地产生的模式实例化类的结构识别以便诸如扩展在运行时环境中描述类的方式。替代于仅通过名称来描述类并且使用该名称找到所述类(例如,在盘上的类文件中),类可被引用为代码生成器函数以及一些静态实参的组合。换句话说,在一些实施例中,可通过结构描述来描述类,所述结构描述指定生成器函数和针对该生成器函数的可能的一个或多个形参。在一些实施例中,对于使用类名的几乎任何情况,结构描述可被视为(例如,可被用作)类名。因此,根据一些实施例,软件系统(例如,编译器和/或虚拟运行时环境)可被加强以允许通过使用可对用于产生类的制法(recipe)或准则(formula)进行编码的结构描述来描述类。结构描述可包括生成器函数的识别(诸如,对模式的引用(例如,通过名称或通过对实现所述模式的类或方法的引用))和针对生成器函数的形参(例如,针对模式的实例化的形参)(如果存在任何所述形参的话)。因此,根据一些实施例,也可使用指定生成器函数和(可能的)一个或多个实参的结构描述来引用作为将某个生成器函数应用于一些实参的结果的类。例如,在特化的情况下,生成器函数可采用将要被特化的类及其特化实参作为实参。因此,可利用元组(例如,generator=JavaGenericSpecializer,args=ArrayList,int)引用常数池中的“合成类”。根据一些实施例,可在源代码、类文件和/或产生的代码内使用用于合成类的结构描述。在一些实施例中,诸如当类被解析时,由运行时环境执行用于合成类的代码的产生。作为结果,合成类可在类被引用的任何时间出现在代码中。根据各种实施例,结构描述可被用于类的几乎任何机械变换或产生。可使用结构描述的一些情况可包括(例如):-特化(例如,将List<T>特化为T=int)-用于接口I的动态代理-用于接口I的转发代理,其方法可指派I的基础实例-具有指定的部件类型的元组类型-具有指定的实参和返回类型的函数类型经常地,源代码(例如,手写的代码)可包括可能从形式“实例化具有形参A、B和C的XYZ模式”的描述以机械方式(例如,自动地)产生的已有模式的实例化。针对模式的形参可以是其它类型或类(例如,“aDecoratoraroundActionListener”),并且在一些实施例中,与手动将模式实例化相比,以机械方式(例如,自动地)产生这个代码可以比较简单并且不那么容易出错,但更重要地,在读者清晰性(例如,阅读所述代码的人)和其它部件(例如,在VM或平台库代码内)仔细检查类的结构描述并且确定关于它的语义的信息的能力方面,以声明方式引用所述结果(“用于接口列表的动态代理”)可以更清楚。使用结构描述作为用于描述类的基本方法不仅可允许类的产生,还可在无论类型将会出现在类文件中的什么地方的情况下允许结构描述的使用。例如,结构描述可被用于实现:classfooextendsTuple<int,int>、instanceof测试(例如,确定特定元素是否是Tuple<int,int>),或者转换为例如Tuple<int,int>。因此,VM可使用与在源语言中使用的类描述相同的类描述——与传统编程语言形成对比,其可在产生用于在运行时使用的名称弄糟的代码的同时使用源语言中的一个表示。因此,在一些实施例中,结构描述可被视为用于描述(和产生)类的一般机制。另外,使用结构描述还可增加运行时环境的表达性,因为可在类名可出现在类文件中的任何地方使用结构描述。在一些实施例中,结构描述的使用可被视为用于描述将要被加载的类的间接层。例如,替代于使用类名作为文件系统中的路径或作为用于产生将要被加载的类文件的数据库中的钥匙,类被描述(使用结构描述)为通过运行具有某些形参的特定生成器而获得的类或通过以特定方法变换类而获得的类。因此,替代于通过描述如何通过在文件系统中查询类(例如,通过类名)来找到类而识别类,通过描述如何使用准则(或制法)并且随后使用准则的实例化产生类来识别类。在一些实施例中,替代于类文件中的实际类名,使用特定准则(例如,生成器函数)和针对该准则的形参的组合。因此,除了能够通过名称来引用类之外,也可通过准则或制法(例如,通过使用结构描述)来引用类。换句话说,可在名称上或在结构上识别和/或引用类。当由结构描述识别的类将要被加载时,可意识到所述类由结构描述识别的事实,并且所述特定生成器函数可随后被用于产生所述类。在一些实施例中,类的结构描述可被视为(和用作)该类的唯一(例如,正式)类名。因此,如果两个不同类中的两个结构描述都指定用于List的动态代理,则编译器或虚拟化运行时环境可意识到:所述两个结构描述用于同一个类,并且将会重新使用以前使用所述结构描述之一产生的类。换句话说,根据一些实施例,类的结构描述可被视为可被与其它结构描述进行比较的类的具体描述。例如,动态类可以是可采用零或更多形参作为输入的一个生成器函数(或准则/制法)。在一些实施例中,针对生成器函数的一个形参可以是已有类的类名,对于所述已有类,代码将会被修改(例如,由生成器函数变换)以便产生新类。另外,在一些实施例中,类的结构描述能够用作用于另一结构描述的实参,并且因此,可被作为实参传送给生成器函数。通常,根据各种实施例,生成器函数可采用各种类型的形参,包括但不限于:方法名、值、数字、常数、类名和/或用于类的结构描述。针对生成器函数的输入实参的精确性质和类型可根据生成器函数而不同,并且根据实施例而不同。因此,在一些实施例中,结构描述可由一些部件基于其结构并且不必基于该描述的各部分的特定含义而使用。例如,在一个实施例中,通过发送特定生成器函数作为语言的运行时库的一部分,编译器可将特定含义给予结构描述(例如,编译器知道该结构描述用于产生特定类)。然而,其它部件可简单地利用结构描述工作,而不需要了解该描述的各部分的特定含义。例如,在某些情况下并且根据一些实施例,虚拟化运行时环境的一个或多个部件可被配置为在没有关于正在产生的类的细节的任何特定知识的情况下定位并且执行由结构描述指定的生成器函数。因此,在实施例中,结构描述的使用可被视为由虚拟化运行时环境提供的特征,该特征允许编译器将源构造映射到合理的运行时表示,而高级语言的用户不必知道运行时表示是什么(例如,程序员可仅看见语言的类型系统,而看不见运行时表示)。在一些实施例中,结构描述的使用可被视为具有用于开发编译器的特征的工具箱的一部分,以使得用户的程序的表示能够映射到运行时环境能够高效地管理的事物。实现结构描述可涉及多个参与者和多个间接层。例如,运行时环境可使用结构描述为语言编译器提供自然表示,以使得当程序员以高级语言编写代码时,可存在直截了当的表示的映射,以便诸如可确保良好的性能和可预测的行为。在一些实施例中,虚拟化运行时环境可被动态地链接。因此,如果来自特定类X的代码调用另一个类Y的方法,则编译器可检索类Y的类文件,产生对类Y的调用,并且在X的类文件中放入签名。然而,为了在运行时合适地执行代码,同一个类Y将会需要具有编译器使用的同一个签名。类似地,当使用结构描述时,可首先(例如,使用结构描述)产生类,然后在编译时检查所述类。然后,在一些实施例中,产生的类可被丢弃,而结构描述被保留在代码中。为了使代码在运行时合适地执行,同一个生成器函数将会必须为兼容的类产生相同的签名。因此,当实现结构描述时,编译器可不必产生整个类,而是可以能够通过仅使用结构描述来发送类。在一些实施例中,可存在一个或多个预产生的生成器函数,诸如语言运行时库的一部分。在一个基于Java的示例中,根据一些实施例,结构描述可被用于产生元组,并且因此,可在合适的运行时库中提供元组生成器函数。在一些实施例中,运行时库可包括可在需要产生元组类时使用的元组生成器类。在这种示例中,Java编译器可精确地知道元组生成器函数将要产生什么。然而,在其它实施例中,可存在作为另一语言的运行时的一部分的其它生成器函数,除了如何调用在结构描述中指定的特定生成器函数以产生类(并且随后正常地使用产生的类)之外,特定编译器可能不知道关于所述其它生成器函数的(任何细节)。类似地,根据一些实施例,语言可使用结构描述实现特化,并且因此,可在运行时库内提供特化生成器函数(和/或特化生成器类)。在一些实施例中,运行时环境(诸如,虚拟化运行时环境140)可能不知道关于生成器函数的语义或正在使用的各个制法、准则或模式的任何事。替代地,当需要加载类时,运行时环境可简单地使用由结构描述指定的生成器函数作为代码生成器。例如,在一个实施例中,运行时环境可首先执行代码生成器(例如,生成器函数)以产生类,并且随后使用类加载器(诸如,类加载器150)加载所述类。在其它实施例中,运行时环境可依赖于类加载器以便既执行生成器函数又加载所获得的类。因此,在一些实施例中,结构描述的使用可被视为编译器和运行时库之间关于类的产生的协议(例如,基于结构描述),运行时环境可能仅理解如何产生类,而不理解所述特定类和/或生成器函数的细节。将类表示为结构描述(例如,诸如模式的参数化实例化)可为程序员提供更多的可表达性和可读性,因为与创建或理解实现用于List的动态代理的代码相比,可更容易说和理解“用于List的动态代理”。另外,与手动将模式实例化相比,用于使用所述模式的代码不仅更紧凑并且可读,而且它也可对于变化更加鲁棒。例如,如果手动编写用于类C的代理并且C随后被修改以具有新方法,则手写代理将不会包括该方法。然而,通过在运行时检查目标类来选择代理哪些方法的在运行时产生的代理将会保持与类C同步。图2是表示根据一个实施例的如这里所述的类的结构描述的逻辑方框图。如上所述,类名可由结构描述(诸如,结构描述200)表示。例如,运行时环境(诸如,虚拟化运行时环境140)可被配置为允许由结构描述200描述类,在一些实施例中,结构描述200可被视为对用于产生类的制法进行编码。例如,结构描述200可包括生成器函数标识符210和用于生成器函数的一个或多个形参220,如图2中所示。根据不同实施例,生成器函数标识符210可代表识别生成器函数的各种方式中任何方式。例如,在一个实施例中,生成器函数标识符210可代表被配置为使用形参220产生特定类型的类的生成器函数的名称。在另一实施例中,生成器函数标识符210可代表对被配置为实现该特定生成器函数的类或方法的引用。因此,根据各种实施例,由生成器函数标识符210识别的生成器函数可代表逻辑生成器函数或实际程序函数(或方法)。例如,在一个实施例中,结构描述可包括对模式的引用(例如,通过名称或通过对实现所述模式的类或方法的引用)和针对模式的实例化的形参。虚拟化运行时环境可在名称上(例如,通过类名)引用类。例如,如果两个类引用具有相同名称,则所述两个类引用可被视为相同。在一些实施例中,可基于模式的实例化产生类。这种实例化可采用各种类型的实参。例如,“用于X接口的转发代理”或“用于Y接口的工厂”可分别代表将要基于模式的实例化产生的类。根据一个示例性实施例,用于将要基于“用于X接口的转发代理”的示例性模式的实例化产生的类的结构描述200可包括识别转发代理生成器函数的生成器函数标识符210,并且可包括代表所述特定X接口的形参220。类似地,根据一个示例性实施例,用于将要基于“用于Y接口的工厂”的示例性模式的实例化产生的类的结构描述200可包括识别工厂生成器函数的生成器函数标识符210,并且可包括代表所述特定Y接口的形参220。如上所述,在一些实施例中,可基于生成器函数(例如,模式的实例化)产生类。图3是表示根据一个实施例的基于结构描述的类的产生的逻辑方框图。如图3中所示,虚拟化运行时环境(诸如,虚拟化运行时环境140(或虚拟化运行时环境140的部件(诸如,类加载器150)))可遇到(例如,识别、发现等)结构描述(诸如,类文件300中的结构描述310)。例如,虚拟化运行时环境140可执行来自类文件300的代码,并且可识别类文件300的代码内的结构描述310。为了产生由结构描述310描述的类,虚拟化运行时环境140可识别和定位合适的生成器函数(诸如,生成器函数330)。在一些实施例中,虚拟化运行时环境140可基于结构描述310内的信息(诸如,以上讨论的生成器函数标识符)识别生成器函数330。根据一些实施例,生成器函数可位于各种位置中的任何位置,诸如位于虚拟化运行时环境140可访问的运行时库内。在一些实施例中,生成器函数330可代表被配置为基于结构描述产生类的方法或类。虚拟化运行时环境140可被配置为执行生成器函数330以便产生与结构描述310对应的类,并且可将来自结构描述310的一个或多个形参传送给生成器函数330(例如,作为针对执行的方法的实参)。在一个实施例中,替代于将各个形参传送给生成器函数330,虚拟化运行时环境140可被配置为将结构描述310作为实参传送给生成器函数330。当产生与结构描述310对应(例如,由结构描述310描述)的类时,生成器函数330可随后使用结构描述310中的信息。例如,生成器函数330可使用来自结构描述310的一个或多个形参。根据各种实施例,生成器函数330可产生与由结构描述310描述的类对应或可用于产生由结构描述310描述的类的结果或输出(诸如,生成器函数结果340)。例如,在一个实施例中,生成器函数结果340可以是定义或声明类的源代码,并且源代码可适合由虚拟化运行时环境140编译和/或以其它方式使用。在另一实施例中,生成器函数结果340可包括用于由结构描述310描述的类的已经编译的代码(例如,诸如字节码)。例如,结构描述310可描述可通过对另一已经编译的类的字节码进行简单变换而产生的类,并且因此,生成器函数330可以能够将类的可执行字节码版本提供给虚拟化运行时环境140。根据不同实施例,虚拟化运行时环境140可被配置为以各种方式中的任何方式使用生成器函数结果340。例如,在一个实施例中,虚拟化运行时环境140可被配置为将产生的类(例如,基于生成器函数结果340)存储到内存或盘中的类文件。尽管以上被描述为由虚拟化运行时环境执行,但根据各种实施例,类也可由软件开发和/或执行环境的其它部件产生。例如,在一个实施例中,如以下参照图4更详细所讨论,编译器可被配置为基于结构描述产生类。图4是表示如这里所述的用于基于类的结构描述产生类的方法的一个实施例的流程图。如块400中所示,可在类文件中识别结构描述,并且结构描述可包括识别生成器函数的信息和用于生成器函数的一个或多个形参。例如,在一个实施例中,编译器120可被配置为识别由结构描述(诸如,类文件300中的结构描述310,以上参照图3描述了类文件300和结构描述310)描述的类。尽管图3示出由虚拟化运行时环境140产生类,但在一些实施例中,编译器120也可被配置为如以上参照虚拟化运行时环境140所述执行类产生。通常,如这里所述并且根据各种实施例,软件开发和/或执行环境的各种部件中的任何部件可被配置为使用类的结构描述。现在返回图4,如块400中所示,在一个实施例中,编译器120可识别类文件300内的结构描述310。结构描述310可包括识别生成器函数的信息和用于该生成器函数的一个或多个形参。例如,根据示例性实施例,分别被配置为产生转发代理类和接口工厂类的两个生成器函数可分别采用代表将要与所获得的类一起使用的接口的特定类型的一个或多个实参。在一些实施例中,编译器120可被配置为使用结构描述作为类名,并且可在识别由结构描述描述的类(例如,在类文件中)之后执行在结构描述中指定的生成器函数,并且可将一个或多个形参作为输入实参提供给生成器函数,如块410所示。例如,编译器120可被配置为执行生成器函数330并且将一个或多个形参作为实参传送给生成器函数330。通常,根据不同实施例,当执行生成器用作实现结构描述的一部分时,可使用提供输入形参的任何合适的方法。在一些实施例中,替代于向生成器函数提供各个形参,结构描述自身可被作为输入提供给生成器函数,生成器函数可从结构描述获得各个形参。例如,根据一个示例,当执行生成器函数330时,编译器120可提供结构描述310作为输入实参。在执行识别的生成器函数之后,编译器还可被配置为至少部分地基于来自生成器函数的结果(例如,输出)产生与由结构描述描述的类对应的类,如块420中所示。例如,根据各种实施例,生成器函数330可产生生成器函数结果340,生成器函数结果340包括可用于创建类的信息,并且编译器120可采用生成器函数结果340并且创建对应类(诸如,通过将生成器函数结果340保存到类文件350)。如上所述,结构描述的一个示例性使用是产生针对特定数据类型特化(例如,参数化)的类。例如,生成器函数可采用将要被特化的类及其特化实参作为实参。例如,下面的示例性Box类可使用结构描述利用T=int特化。编译器(和/或虚拟化运行时环境的部件)可遇到源代码,所述源代码包括结构描述,所述结构描述指示Box类应该被针对T=int特化,诸如可由下面的示例性源代码表示:newBox<Integer>();当编译器遇到以上源代码时,它可意识到:Box类应该被使用结构描述针对T=int特化,所述结构描述指定特化生成器函数并且使用Box类和整数类型(例如,int)作为形参。因此,编译器可定位和执行特化生成器函数,传送(作为实参)形参,所述形参指定Box类(作为一个示例,可能是类名“Box”)和数据类型int。作为响应,诸如在下面的示例中,特化生成器函数可产生实现针对T=int特化的Box类的源代码:classBox$T=intextendsjava.lang.Object{privatefinalintt;publicBox$T=int(int);Code:0:aload_01:invokespecial#1;//方法java/lang/Object."<init>":()V4:aload_05:iload_16:putfield#2;//字段t:int;9:returnpublicintget();Code:0:aload_01:getfield#2;//字段t:int;4:ireturn}编译器可随后采用生成器函数的结果(例如,产生的类源代码),并且根据需要使用(例如,编译和/或将其保存在类文件中等)。类似地,编译器120可在源代码内遇到诸如由下面的示例性代码表示的指定元组生成器函数和两个形参的结构描述:newTuple<T1,T2>;在以上示例中,结构描述包括关键字“Tuple”以及括号中的两个形参类型(例如,T1和T2)。响应于遇到结构描述,编译器可执行元组生成器函数,传送所述两个类型作为输入形参。生成器函数的结果可包括针对所述两个类型实现元组类的另外的源代码。例如,如果以上示例中的T1表示整数类型并且以上示例中的T2表示字符串类型,则像下面的示例性源代码中一样,元组生成器函数可产生用于实现具有整数和字符串的元组的源代码:与以上的特化示例相比,元组示例表示生成器函数可如何产生新的源代码,而非简单地将作为输入提供的类特化。然而,在其它实施例中,可作为特化生成器函数的特殊情况实现以上元组示例。由生成器函数输出的代码(例如,生成器函数的结果)可随后由编译器使用(例如,它可被编译和/或保存在类文件内等)。在一些实施例中,开发者可能看不见通过使用结构描述而产生的所获得的类(或者开发者无法使用所获得的类)。替代地,它可被视为位于所述系统内部,并且替代于结构描述而使用它。例如,在以上元组示例中,开发者可使用和引用Tuple<T1,T2>类(或对象),但可能永远无法看见响应于结构描述的使用而产生的内部Tuple$98456表示。尽管以上参照编译器进行了描述,但由图4示出的方法可由软件开发或执行环境的各种部件中的任何部件执行,诸如由虚拟化运行时环境执行和/或由虚拟化运行时环境内的类加载器执行。虚拟化运行时环境(诸如,基于Java的虚拟机(VM))可在名称上(例如,通过名称)引用类。传统上,像下面的示例部分常数池仓库中一样,可仅通过名称来引用类:常数池:#3=Class#13//java/lang/Object#13=Utf8java/lang/Object在以上示例中,“类”常数表示描述类名的字符串常数。字节码中的各种使用(超类名称、拥有将要被调用的方法的类的名称、instanceof操作数)可按照这种方式在名称上引用类。如果两个类引用具有相同名称,则所述两个类引用可被视为相同。这可假设每个类具有唯一的已知的稳定的名称,并且还可通常要求每个类被静态地产生(手动或通过机器)并且存储在文件系统中。但作为将特定生成器函数(例如,特定产生、变换和/或模式)应用于特定输入或形参的实例,存在可更好地描述(和比较)的许多类。因此,在一些实施例中,可使用结构描述描述类(例如,在类文件中),所述结构描述包括生成器函数,当所述生成器函数被应用于它的实参时,所述生成器函数产生类和(可能的)描述想要的实例化的一组实参。替代于通过其名称来比较等同性,可通过具有相同的生成器函数和实参来针对这种结构类比较等同性。在一些实施例中,可在不调用生成器函数来产生所获得的类的情况下对结构描述进行比较。替代地,可在结构上(诸如,通过比较它们的各个成员)对结构描述进行比较。例如,如果一个结构描述指定对List类使用动态代理生成器,并且另一结构描述也指定对List类使用动态代理生成器,则可通过首先比较指定的生成器函数来对它们进行比较,并且如果它们相同,则比较传送给各生成器函数的特定形参。另外,根据一些实施例,可基于两个类的各自结构描述比较所述两个类。图5是表示如这里所述的用于基于两个类的结构描述比较所述两个类的方法的一个实施例的流程图。例如,如果两个结构描述(例如,对模式的两个结构引用)使用相同的生成器函数和形参(例如,相同的模式和形参),则所述两个结构描述可被视为(或代表)相同的类。如块500中所示,基于两个类的结构描述比较所述两个类可包括比较用于所述两个类的生成器函数,如块510中所示。例如,在一个实施例中,编译器120可被配置为通过比较结构描述中识别生成器函数的信息来比较两个类的生成器函数。例如,根据一个实施例,如果两个结构描述包括生成器函数的名称并且二者都包括相同的名称,则所述两个结构描述可被视为识别相同的生成器函数。如果如判定块520的肯定输出所指示,所述两个生成器函数相同(例如,两个结构描述识别相同的生成器函数),则用于该生成器函数的形参可被比较,如块530中所示。例如,根据一些实施例,如果两个类基于将不同形参传送给相同的生成器函数,则所述两个类可被视为不同。例如,如果都基于元组生成器函数的两个类将不同形参传送给生成器函数(例如,一个类指定两个整数,而另一个类指定字符串和整数作为形参),则它们可被视为不同。如果如判定块540的肯定输出所指示,由所述两个结构描述指定的形参相同,则所述两个结构描述可被视为代表相同的类,如块550中所示。然而,如果如判定块520的否定输出所指示生成器函数不同或者如判定块540的否定输出所指示形参不匹配,则所述两个结构描述可被视为代表两个不同的类,如块560中所示。根据一些实施例,结构描述的各个部分(例如,生成器函数标识符、形参)可被比较,但可不产生所获得的类。在一些实施例中,作为比较两个结构描述的一部分而执行的各个比较可涉及在名称上(例如,按照文字、通过名称)比较事物,但在其它实施例中,可不在名称上比较事物。例如,在一个实施例中,生成器函数可由结构描述内的名称指定,并且因此,可在名称上比较生成器函数标识符(例如,因为它们是生成器函数名称)。在其它实施例中,结构描述的各个部分可被以其它方式比较(例如,通过比较数字、引用等)。在一些实施例中,可仅由库函数和/或库类执行比较两个结构描述的各个部分,而非使程序员/开发者比较结构描述的各个部分。在一些实施例中,生成器函数可被允许参与使用它们的结构描述的类的比较。例如,在结构描述中指示的生成器函数可被允许参与判断两个类是否相同。因此,在一些实施例中,当基于两个类的结构描述比较所述两个类时,编译器120可被配置为调用与在用于正被比较的类的结构描述之一中识别的生成器函数关联的方法。编译器可将正被比较的一个或多个结构描述传送给调用的方法,并且所述方法可随后确定(例如,诸如通过比较结构描述中的信息)结构描述是否代表相同的类。例如,在一些情况下,针对生成器函数(例如,针对模式的实例化)的形参可能是可交换的(例如,用于多个接口的动态代理),而在其它情况下,它们可能不是可交换的。这种结构描述(例如,模式实例化的结构描述)可出现在类名原本能够出现的任何地方。例如,类的结构描述可作为实参类型、返回类型、字段类型、超类型、instanceof或cast操作符的操作数而出现,或作为实参类型、返回类型、字段类型、超类型、instanceof或cast操作符的操作数的一部分而出现,或者出现在可使用类名的几乎任何地方。在一些实施例中,结构描述的使用可以是递归的。例如,将要在产生类时用作生成器函数的输入的一个或多个形参可以是用于类的结构描述。图6是表示根据一个实施例的以递归方式使用的结构描述的逻辑图。如图2中所示,上述结构描述(诸如,结构描述200)可包括生成器函数标识符和用于识别的生成器函数的一个或多个形参。在一些实施例中,针对生成器函数的一个或多个形参可以是类,并且这些类可由结构描述表示(例如,描述)。因此,根据一个示例性实施例,结构描述200的形参220可以是(或者可表示)结构描述600。结构描述600可包括生成器函数标识符610和一个或多个形参。根据不同实施例,生成器函数标识符610可识别与由生成器函数标识符210识别的生成器函数相同或不同的生成器函数。因此,在一些实施例中,生成器函数(或代表生成器函数的类)可被配置为以递归方式执行。当产生由结构描述200表示的类时,编译器120可被配置为首先产生由结构描述600表示的类并且随后将该类作为一个输入传送给用于结构描述200的生成器函数。因此,在一些实施例中,编译器120可被配置为检查结构描述的所有形参以便确定是否任何形参代表将要被产生的类。在其它实施例中,生成器函数自身可被配置为识别输入形参可以是结构描述,并且还可被配置为基于该结构描述产生类并且使用所述产生的类作为用于产生它自己的类的输入。诸如由图6示出的一系列结构描述可包括多个递归层。例如,结构描述600的形参620可以是(或者可引用)结构描述640,结构描述640可包括生成器函数标识符650和形参660。生成器函数标识符650可代表由生成器函数标识符210识别的同一生成器函数,或者可代表由生成器函数标识符610识别的同一生成器函数,或者可代表不同的生成器函数。类似地,结构描述600的形参630可以是(或者可引用)结构描述670,结构描述670可包括生成器函数标识符680和形参690。另外,根据各种实施例,使用结构描述比较类可涉及通过多层的结构描述的递归。例如,由一个或多个结构描述指定的各个形参可能自身是结构描述。因此,比较可能需要递归通过多层的结构描述,直至各个形参自身不是结构描述。如果正被比较的两个原始结构描述包括相同层的结构描述(在每个递归层指定相同的生成器函数和形参),则正被比较的所述两个原始结构描述(并且因此,所述两个原始类)可被视为相同。通常,结构描述可被用于从一个类型到另一个类型的几乎任何机械变换。例如,根据各种实施例,结构描述可被用于针对T=int将泛型类List<T>特化,从而实现用于一个或多个接口的动态代理,实现用于一个或多个接口的转发代理,实现代表具有给定部件类型的元组的类;以及用于实现代表用于给定实参和返回类型的结构功能类型的类。根据各种实施例,适合使用结构描述的情况的示例可包括:泛型特化适合使用结构描述的变换的一个示例可包括实现泛型特化。当使用结构描述实现特化时,生成器函数可采用将要被特化(部分地或完全地)的类和将要被用于特化的特化类型实参作为实参。例如,通过根据特化规则改变注释的签名和指令并且不改变别的事物,指定利用T=int"将List<T>特化的结构描述可产生作为变换类List<T>的结果的类。因此,由运行时库提供的一个生成器函数可以是特化函数,所述特化函数的实参可指定要特化的类和类型实参的特化。例如,如果将要产生int的ArrayList,则结构描述指定通过利用ArrayList和int作为实参执行特化生成器函数而获得的动态类的产生。在一些实施例中,特化生成器函数可读取将要被特化的类的类文件并且产生新的类文件。根据一些实施例,使用旧的类文件的结构,特化生成器函数可将一些项直接传送给新的类文件,同时利用int替换object的使用,以便诸如将字段、方法签名的类型等特化。用于接口的动态代理根据一些实施例,适合使用结构描述的变换的另一示例可包括实现用于一个或多个接口的动态代理。例如,生成器函数可采用与代理的一组接口作为实参,并且可产生实现所有那些接口的类,所述类的方法分派给调用处理程序,所述调用处理程序被传送给所获得的类的构造器。因此,根据一个实施例,指定动态代理的产生的结构描述可包括动态代理生成器函数的标识,并且可指定一个或多个接口类型作为形参。例如,开发者可能希望实现实现List接口的类的实例,从而当类的get方法被调用时,处理程序方法也被调用,所述处理程序方法指示在对get方法的调用中使用什么形参(例如,以使得get方法调用可被拦截)。换句话说,开发者可能希望实现用于List接口的动态代理。为了实现动态代理,结构描述可将该接口(例如,List接口)指定为将要在执行动态代理生成器函数时使用的形参。用于接口的转发代理类似地,根据一些实施例,结构描述可被用于实现用于一个或多个接口的转发代理。例如,生成器函数可采用与代理的一组接口作为形参,并且可产生实现所有这些接口的类,以便诸如实现网络或远程代理类(例如,用于与Corba或EnterpriseJavaBeans或远程方法调用等一起使用)。替代于如以上关于动态代理所述分派给调用处理程序,方法调用可被转发给基础对象,所述基础对象实现这些接口并且可被提供给所获得的类的构造器。因此,结构描述可指定转发代理生成器函数和一个或多个接口作为形参。元组类型根据一些实施例,适合使用结构描述的变换的另一示例可包括具有指定的部件类型的元组类型。例如,可提供元组生成器函数,所述元组生成器函数采用字段的类型作为实参并且输出代表该特定元组并且具有指定的类型的成员的类。例如,诸如在下面的示例中,开发者可编写实现用于两个数据类型T1和T2的元组的源代码:newTuple<T1,T2>;编译器可使用指定元组生成器函数以及类型T1和T2作为形参的结构描述。例如,该结构描述可包括识别特定生成器函数的关键字(例如,“元组”)以及两个形参类型(例如,T1和T2)。在运行时,当使用该结构描述时,运行时环境可识别、定位和执行该生成器函数,传送所述两个数据类型作为实参。像下面的示例性代码中一样,元组生成器函数可随后输出使用所述两个指定的数据类型定义元组类的字节码:classTuple$98456{publicfinalT1_1;publicfinalT2_2;publicTuple$98456(T1t1,T2t2){this._1=t1;this._2=t2;}}缩窄代理适合使用结构描述的变换的另一示例可包括缩窄代理。例如,类C可实现接口I。类C可被传送给某个其它方法,但可能希望仅接口I的方法可见(即,可能不希望C向下转换成某个其它类型)。传统上,像下面的示例性代码中一样,将会编写手动适配器:在一些实施例中,可编写生成器函数,所述生成器函数采用类I作为实参并且产生IAdapter。通过这种机制,可能不再需要手动为每个I编写适配器,而是替代地,可根据需要使用结构描述产生它们。例如,结构描述可指定缩窄代理生成器函数和类I作为形参。像以上示例中一样,当执行时,产生的缩窄代理可产生IAdapter类。在编译时的产生的类的内省另外,在一些实施例中,类可在编译时被内省。例如,当动态地产生“classFooextendsList<int>”,List<int>时,编译器可能需要运行生成器以识别List\<int>的成员,并且使用其做出编译决定。相同的类可在随后的运行时被重新特化。另外,在一些实施例中,如果“classFooextendsList<int>”,其中使用结构描述实现List<int>(例如,表示为模式的实例化而非名称上的类)/当“classFooextendsList<int>”,其中使用结构描述实现List<int>(例如,表示为模式的实例化而非名称上的类)时,编译器可能需要知道超类的结构和成员。例如,编译器120可随后执行对应生成器函数以产生List<int>类,反射性地内省该List<int>类,并且搜集需要的数据。当实际使用特化的类时,可随后在运行时重新产生所述特化的类。产生的类上的反射(reflection)产生的类可能具有“难看的”(例如,复杂的)名称(或没有名称)。然而,用户可能希望在这个类上进行反射。因此,在一些实施例中,产生的(例如,复杂的或“难看的”)名称可重新连接到编译类型静态类型系统的反射视图。另外,即使产生的类可实际上具有更复杂的名称(诸如,例如Generated$List$$23$T=int),也可重构产生的类的名称的人类可阅读(例如,人类友好)的描述。在一些实施例中,实现结构描述可提供将产生的类连接回至用于创建它的特定生成器(例如,特定变换、制法、准则等)的方法。因此,在一些实施例中,结构描述可提供以人类可阅读的文本形式呈现使用的特定生成器的方式。另外,在一些实施例中,实现结构描述还可提供用于将特定结构描述映射回至最初使用的语言的类型系统的机制。例如,尽管运行时环境可提供结构描述作为用于引用类的低级机制,但高级语言(例如,Java)可提供类型系统并且可使用结构描述作为代表各种类型的高级语言的方式。当使用反射机制时,可能希望可按照映射到高级语言的类型系统的方式在反射层中描述高级语言中的每个类型(这可不同于由运行时环境使用的类型系统)。因此,在一些实施例中,语言的原生类型系统到结构描述的语言特定映射可被逆转,以使得结构描述中的类型可连接回至原始类型系统(例如,高级语言的类型系统)。需要注意的是,尽管以上讨论已描述对类、方法等做出的手动改变,但上述编译器(诸如,编译器120)或虚拟化运行时环境(诸如,虚拟化运行时环境140)也可被配置为理解、分析或以其它方式处理以上描述为手动执行的特征。例如,尽管以上关于类和方法的手动改进的部分可表示手动添加或修改类或方法,但编译器或虚拟机可被配置为接受和处理手动修改的代码(或字节码),以便诸如例如合适地将类特化。通常,尽管可在这里使用对代码的手动修改描述各种方法、特征和/或增强,但这种描述是为了方便解释,并且这种方法、特征和/或增强的实现方式还可涉及编译器和/或虚拟机。尽管以上主要参照仅静态类型进行了描述,但这里描述的方法、特征和/或增强不限于仅静态类型。在一些实施例中,这里描述的方法、特征和/或增强也可被应用于动态类型。例如,已检查但未充分特化的表达式(诸如,List<???>ls=...;Numbern=ls.sum())(例如,其中如果列表的类型形参违反类型边界,则某种运行时异常将会适用)也可经这里描述的方法、特征和/或增强而被执行。在至少一些实施例中,实现这里描述的一种或多种技术的一部分或全部的计算机系统可包括通用计算机系统,所述通用计算机系统包括一个或多个计算机可读介质或被配置为访问一个或多个计算机可读介质。图7表示适合实现这里描述的方法、特征和增强的这种通用计算装置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-6所述的程序指令和数据。然而,在其它实施例中,可在不同类型的计算机可读介质上接收、发送或存储程序指令和/或数据。一般而言,计算机可读介质可包括经I/O接口3030耦合到计算装置3000的非暂态存储介质或存储器介质,诸如磁介质或光学介质(例如,盘或DVD/CD)。非暂态计算机可读存储介质还可包括任何易失性或非易失性介质,诸如RAM(例如,SDRAM、DDRSDRAM、RDRAM、SRAM等)、ROM等,所述任何易失性或非易失性介质可被包括在计算装置3000的一些实施例中作为系统存储器3020或另一类型的存储器。另外,计算机可读介质可包括经通信介质(诸如,网络和/或无线链路)传送的传输介质或信号(诸如,电信号、电磁信号或数字信号),诸如可经网络接口3040实现。在各种实施例中,多个计算装置(诸如,图7中示出的计算装置)中的一部分或全部可被用于实现描述的功能;例如,在各种不同装置和服务器上运行的软件部件可合作以提供所述功能。在一些实施例中,除了使用通用计算机系统实现描述的功能的一部分之外或替代于使用通用计算机系统实现描述的功能的一部分,可使用存储装置、网络装置或专用计算机系统实现描述的功能的一部分。如这里所使用,术语“计算装置”表示至少所有这些类型的装置,但不限于这些类型的装置。各种实施例还可包括接收、发送或存储根据前面的描述在计算机可读介质上实现的指令和/或数据。一般而言,计算机可读介质可包括存储介质或存储器介质,诸如磁介质或光学介质(例如,盘或DVD/CD-ROM)、易失性介质或非易失性介质(诸如,RAM(例如,SDRAM、DDR、RDRAM、SRAM等)、ROM等)。在一些实施例中,计算机可读介质还可包括经通信介质(诸如,网络和/或无线链路)传送的传输介质或信号(诸如,电信号、电磁信号或数字信号)。如附图中所示并且如这里所述的各种方法代表方法的示例性实施例。所述方法可被实现于软件、硬件或者其组合。在各种方法中,步骤的次序可被改变,并且各种元件可被添加、重新排序、组合、省略、修改等。各种步骤可被自动地(例如,不通过用户输入来直接提示)和/或以编程方式(例如,根据程序指令)执行。尽管已在这里参照特定实施例并且在特定实施例的情况下描述各种系统和方法,但将会理解,这些实施例是说明性的并且本公开的范围不限于这些特定实施例。可实现许多变化、修改、添加和改进。例如,在描述中识别的块和逻辑单元用于理解描述的实施例,而非意图限制本公开。例如,在一些实施例中,这里描述为由编译器120执行的动作、处理、方法、任务或功能可由虚拟化运行时环境140执行,反之亦然。另外,在这里描述或利用不同术语描述的系统和方法的各种实现中,可按照不同方式在块中分离或组合功能。这些实施例应该是说明性的,而非限制性的。因此,可为这里描述的部件提供多个实例作为单个实例。各种部件、操作和数据仓库之间的边界是稍微任意的,并且在特定说明性结构的情况下示出特定操作。可设想功能的其它分配,并且所述功能的其它分配可落在下面的示例的范围内。最后,在示例性结构中作为分立部件提供的结构和功能可被实现为组合结构或部件。虽然已详细地描述以上实施例,但一旦充分理解以上公开,许多变化和修改将会变得清楚。下面的权利要求应该被解释为包括所有这种变化和修改。当前第1页1 2 3 当前第1页1 2 3 
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1