先参考图1,系统100示出了依照本发明一个方面的标签化类型处理。一个或多个动态语言110被供给编译器120(例如,运行时编译执行的编译器(JustinTime compiler)),生成可由虚拟机130执行的中间语言指令124。动态语言110实质上包括任何类型的计算机语言,诸如Perl、Scheme、Ruby、Python和Smalltalk,例如,它们可由编译器120编译并由虚拟机130执行。这样的机器可包括例如,虚拟执行系统(Virtual Execution System)(VES)、通用语言运行时间(Common Language Runtime)(CLR)或Java虚拟机。当执行中间语言代码时,虚拟机130在单个或多个计算机系统(可以是本地和/或远程网络化系统)上运行一个或多个计算机应用134。在本发明的一个方面,动态语言110宣称并生成一个或多个标签化类型140,它们在虚拟机130上被编译并且随后被执行。标签化类型140表示将指针值与其它值诸如立即数据值区别开来的编码,并且常常由动态语言110使用。
标签化类型140在分叉的类结构中说明,所述分叉的类在类结构的一边或根具有标签化值,以及在另一边或根具有非标签化的或用户定义类型的值,由此这种类型的类结构将在下面参考图2更详细地描述。为了处理中间指令124和标签化类型140,虚拟机130和/或编译器120使用一组确认规则150,来帮助确保用户定义的数据类型不从标签化数据类型导出或继承。同样,各种堆栈执行规则160(下面描述)由堆栈异常处理修改并执行,以便处理标签化和非标签化值。通过提供新类的类型框架、确认规则150和/或堆栈异常处理程序160,本发明改善了虚拟机130的执行性能。这是通过依照代替和/或减少诸如将标签化值视为“封装的”变量这样的技术的类框架和规则处理标签化值来实现的。这些变量在这样的标准中描述,如定义通用语言基础结构(Common LanguageInfrastructure)(CLI)的“ECMA标准”。
通常,系统100遵守ECMA标准和通用语言基础结构(CLI),其中以多种高级语言编写的应用可在不同的系统环境中执行,而不需要重写应用以考虑这些环境的独特性。要理解,也可以依照本发明适应处理动态语言和/或虚拟执行环境的其它标准。ECMA标准包括几个可在因特网上容易地得到的部分,以便通过在它们各自部分中描述那些组件来促进理解各种组件。这些部分是:
部分I:体系结构
部分II:元数据定义和语义
部分III:CIL指令集
部分IV:简档和库
部分V:附录
通用语言基础结构(CLI)为可执行代码和它运行于其中的执行环境(虚拟执行系统(Virtual Execution System),或VES)提供了规范。可执行代码作为模块提供给VES。模块一般是单个文件,以规定的格式包含可执行内容。通常,在通用语言基础结构(CLI)的中心是一个单类型系统,即编译器、工具和CLI本身所共享的通用类型系统(Common Type System)(CTS)。正是这样一个模型,定义CLI在宣称、使用和管理类型时所遵循的规则。CTS建立一个框架,它允许交叉语言集成、类型安全,以及高性能代码执行。CLI包括下列基本组件:
通用类型系统。通用类型系统(CTS)提供一个丰富类型系统(rich typesystem),支持在许多编程语言中存在的类型和操作。通用类型系统想要支持宽广范围的编程语言的完全实现。
元数据。CLI使用元数据来描述和引用由通用类型系统定义的类型。以独立于任何特定编程语言的方式存储(“存留(persist)”)元数据。因而,元数据提供通用交换机制,在操纵程序的工具(编译器、调试器等)之间以及在这些工具和虚拟执行系统之间使用所述机制。
通用语言规范。通用语言规范是语言设计者和框架(类库)设计者之间的协议。它规定了CTS类型系统的子集和一组使用约定。语言通过实现至少是CLS部分的CTS的那些部分来为它们的用户提供访问框架的最大能力。同样地,将最广泛地使用框架,如果它们公开暴露的方面(类、接口、方法、字段等)使用是CLS的部分的类型并且遵守CLS约定。
虚拟执行系统。虚拟执行系统实现并实施CTS模型。VES负责加载和运行为CLI编写的程序。它提供执行受管理的代码和数据所需要的服务,使用元数据在运行时间将分别生成的模块连接在一起(后绑定)。
合起来,CLI的这些方面为设计、开发、部署和执行分布式组件和应用形成统一的框架。可从各种以CLI为目标的编程语言得到通用类型系统的适当的子集。基于语言的工具彼此通信,并且与使用元数据来定义和引用用来构造应用的类型的虚拟执行系统通信。虚拟执行系统使用元数据按需创建类型的实例,并为基础结构的其它部分提供数据类型信息(诸如远程服务、组装件(assembly)下载、安全等)。
现在转向图2,图200示出依照本发明一个方面的标签化类型层次结构。为了以类型安全方式支持标签化值,本发明为继承层次结构提供一种新的(抽象)根类型,标注为顶(Top)210,代表不透明的、自然的大小值。在这个新的根210下面,在一边宣称现有的System.Object层次220,而在另一边是(密封的)标签化(Tagged)类型230。顶类型210通常相应于如在ECMA部分III中提供的对象引用类型0的概念。主题发明提供O到第一类类型中,并添加新的标签化子类型230。在240,提供一个或多个元数据确认规则,它们禁止对定义为顶210和标签化类型230的元素的继承。这些规则在下面更详细地描述。同样,要意识到,尽管两个分支都绘于顶210之下,但也同样可提供其它分支(例如,在System.0bj和标签化类型旁边或下面定义的多个分支)。
在ECMA部分III中定义的对象引用(类型0)通常被认为是完全不透明的。一般没有算术指令允许对象引用作为操作数,尽管本发明为标签化类型提供算术运算,如下所述。所允许的比较运算是对象引用之间的相等(和不相等),在本发明提供测试类指令的情况下。在ECMA部分III中没有在对象引用上定义的转换运算,但是本发明提供标签化和非标签化值之间的转换。对象引用一般由某些CIL对象指令(例如,newobj和newarr)创建。例如,这些引用也能作为参量传递、作为局部变量存储、作为值返回,并可存储在数组中并作为对象字段。
本发明还为通用运行时间语言(CLR)提供明确的支持,它实际上促进使用CLR作为真正的多语言运行时间。本发明的一个特定方面提供了附加的扩展(例如,算术运算、确认规则)来同样支持动态语言(例如开放源应用)。本发明通过使用代表不透明的、自然大小值的、具有继承层次结构的抽象根类型(例如顶),以类型安全方式支持标签化值。本发明减少了与使用各种标签方案来克服在堆上分配小(例如字大小的)对象的开销的需求相关联的常规问题,但仍保持例如用于参数操作的值的统一表示法的好处。
图3-4和6-9示出依照本发明的各种方法。尽管为了简化说明的目的,将方法示出和描述为一系列动作,但要理解和意识到,本发明不受动作的顺序限制,因为依照本发明,某些动作可以以不同顺序和/或与来自在此所示和描述的其它动作进发地发生。例如,那些在本领域中熟练技术人员将理解和意识到,方法可供替换地表示为一系列相关的状态或事件,诸如在状态图中。此外,不要求所有例示的动作来实现依照本发明的方法。
现在参考图3,图300示出依照本发明一个方面的标签化类型处理。在进行310和320之前,注意可作为对ECMA部分II的修改提供这些过程。在310,至少定义两个新元素类型ELEMENT_TYPE_TAGGED和ELEMENT_TYPE_TOP作为层次化类结构的部分用于处理标签化值。在320,元数据确认规则扩展以保证用户定义类型不能从顶或标签化类型元素导出。如上面提到的,CLI使用元数据描述和引用由通用类型系统定义的类型。元数据以独立于特定编程语言的方式存储(“存留”)。这样,元数据提供通用交换机制,在操纵程序的工具(编译器、调试器等)之间以及在这些工具与虚拟执行系统之间使用所述机制。元数据令牌一般描述一个4字节值,例如它指定元数据表中的一行,或者在用户串(UserString)堆中的起始字节偏移。
在进行前,注意可作为对ECMA部分III的修改的部分提供下列内容。在330,通常所有带有.ref后缀的指令变量将在堆栈上加载顶(Top)类型的值,以便处理标签化类型值。在340,在本发明的一个可替换方面中,可以重新定义算术运算以在标签化值上计算。为了达到这一点,可扩展部分III的1.5节中的表(例如,修改操作数以对顶和标签(Tag)类型运算,扩展在算术运算过程中的确认规则)。下表说明来自ECMA部分III中的各种指令,所述指令可以被扩展成对标签化类型值操作。
表1:二进制数字运算
表2:一元数字运算
算符类型 |
整数32 |
整数64 |
原始整数 |
F |
× |
O |
结果类型 |
整数32 |
整数64 |
原始整数 |
F |
× |
× |
表3:二进制比较或分支运算
表4:整数运算
|
整数32 |
整数64 |
原始整数 |
F |
& |
O |
整数32 |
整数32 |
× |
原始整数 |
× |
× |
× |
整数64 |
× |
整数64 |
× |
× |
× |
× |
原始整数 |
原始整数 |
× |
原始整数 |
× |
× |
× |
F |
× |
× |
× |
× |
× |
× |
& |
× |
× |
× |
× |
× |
× |
0 |
× |
× |
× |
× |
× |
× |
表5:移位运算
|
按…移位 |
整数32 |
整数64 |
原始整数 |
F |
& |
O |
待移位的 |
整数32 |
整数32 |
× |
整数32 |
× |
× |
× |
整数64 |
整数64 |
× |
整数64 |
× |
× |
× |
原始整数 |
原始整数 |
× |
原始整数 |
× |
× |
× |
F |
× |
× |
× |
× |
× |
× |
& |
× |
× |
× |
× |
× |
× |
0 |
× |
× |
× |
× |
× |
× |
表6:溢出算术运算
表7:转换运算
转换成 |
输入(来自估计堆栈) |
整数32 |
整数64 |
原始整数 |
F |
& |
O |
整数8不带符号的整数8整数16unsigned int16 |
舍位 |
舍位 |
舍位 |
舍位至零2 |
X |
X |
整数32不带符号的整数32 | 无运算 | 舍位 | 舍位 | 舍位至零 | X | X |
整数64 | 符号扩展 | 无操作 | 符号扩展 | 舍位至零 |
停止GC跟踪 |
停止GC跟踪 |
不带符号的整数64 | 零扩展 | 无运算 | 零扩展 | 舍位至零 |
停止GC跟踪 |
停止GC跟踪 |
原始整数 | 符号扩展 | 舍位 | 无运算 | 舍位至零 |
停止GC跟踪 |
停止GC跟踪 |
原始不带符号的整数 |
零扩展 |
舍位 |
无运算 |
舍位至零 |
停止GC跟踪 |
停止GC跟踪 |
所有浮点类型 |
至浮点数 |
至浮点数 |
至浮点数 |
改变精度3 |
X |
X |
参考图4,图400示出依照本发明一个方面标签化类型指令执行的例子。尽管下面所述指令涉及到“加法”指令,但要意识到,任何关联于ECMA或其它标准的指令都可类似地被扩展和被应用到标签化类型处理或标签化和非标签化处理的组合。在410,声明类或函数元素。例如,具有加法指令(或其它操作数)的列表函数可编写为:
List{
Add(Top x);
在420,可以宣称标签化和非标签化类型,例如:
List{
Add(Top x);
private Top[]values;
private(int,i);
在430,执行标签化类型操作,例如:
List{
Add(Top x);
private Top[]values;
private(int,i);
Add(Top x){
values[i]=x;
i=i+1;
}
进到440,在标签化类型处理之前、期间和/或之后执行堆栈运算。在450,标签化类型运算或函数结束。这样,在这个例子中,最后的示例列表函数可呈现为:
List{
Add(Top x);
private Top[]values;
private(int,i);
Add(Top x){
values[i]=x;
i=i+1;
}
}
图5示出依照本发明一个方面的一个或多个执行规则500。在一个方面,强制转换类指令或规则可在520提供。这种类型的指令将对象强制转换到一个类,并且在下面参考图6更详细地描述。在另一个方面中,测试类指令或规则可以在524提供。这种类型的指令在对象上执行测试,以确定一个对象是否是类或接口的实例,并在下面参考图7更详细地描述。在又另一个方面中,将整数转换成对象引用的指令或规则可在530提供。这种类型的指令(例如,标签指令)将整数值转换成对象引用,并在下面参考图8更详细地描述。在又另一方面中,将对象引用转换成整数的指令或规则可在534提供。这种类型的指令(例如,非标签(untag)指令)将对象引用转换成整数值,并在下面参考图9更详细地描述。要意识到,其它指令或规则可同样地定义(例如,算术指令)。
在进行图6-9的讨论之前,提供以下内容来描述这里讲的堆栈概念。
堆栈转移图(Stack Transition Diagram)
堆栈转移图显示在指令执行前后的评估堆栈的状态。下面是一个典型的堆栈转移图。
…,value1,value2->…,result
这个示例图表示堆栈至少必须在其上具有两个元素,并且在定义中最上面的值(“栈顶”或“最近被压入的”)将称为value2(值2)且在下面的值(在value2之前被压入的)将称为value1(值1)。(在象这样的图中,堆栈沿着纸向右增长)。指令从堆栈中移走了这些值,并用另一个值取代它们,在描述中称为result(结果)。
图6是图600,示出依照本发明一个方面的强制转换(cast)类规则。
castclass(强制转换类)一指定对象到类
格式 |
汇编格式(assemblyformat) |
说明 |
74<T> |
Castclass类 |
强制转换对象为一个类 |
在610,为强制转换类定义堆栈转移如下:
Stack Transition(堆栈转移):
…,obj->…,obj2
在620,将强制转换类定义如下,其中斜体项示出对ECMA部分III的修改:
castclass指令试图强制转换一个对象(例如,顶)为一个类。类是元数据标记(token)(typeref或typedef),表示所希望的类。如果在类的顶上的对象是非标签化的并且T是标签化的,那么发出无效异常。如果在堆栈顶上的对象的类没有实现类(如果类是接口),且不是类的子类(如果类是正规的类),那么发出InvalidCastException(无效强制转换异常)。
注意:
1.数组继承自System.Array
2.如果Foo可以被强制转换为Bar,则Foo[]可被强制转换为Bar[]
3.为了上面的2,将enum(枚举类型)视为它们的基本类型:因而如果E1和E2共享基本类型,E1[]可以强制转换为E2[],
如果obj(对象)为空,castclass完成并返回空。这个行为不同于下面所述的isInst。
在630,将用于强制转换类的异常描述如下:
如果obj不能被强制转换为类,发出InvalidCastException。
如果不能找到类,则发出TypeLoadException(类型加载异常)。这一般在将CIL转换成本地代码时而不在运行时间检测。
在640,描述用于强制转换类的可检验性(Verifiability):
标准的CIL保证类是有效的TypeRef或TypeDef标记,且保证obj为空、对象引用或标签化立即值。
图7是图700,示出依照本发明一个方面的测试类规则。
isinst(是实例)—测试对象是否是类或接口的实例
格式 |
汇编格式 |
说明 |
75<T> |
Isinst类 |
测试obj是否是类的实例,返回NULL(空)或那个类或接口的实例 |
在710,为强制转换类定义堆栈转移如下:
Stack Transition(堆栈转移):
…,obj->…,result
在720,强制转换类如下定义,其中斜体项示出对ECMA部分III的修改:
isinst指令测试obj(type Top)是否是类的实例。类是表示所希望的类的元数据标记(typeref或typedef)。如果在堆栈顶上的对象是未标签化的以及T是标签化的,NULL(空)被压在堆栈上。如果在堆栈顶上的对象的类实现类(如果类是接口)或者类的子类(如果类是正规的类),那么它被强制转换为此类型的类并且结果被压在堆栈上—好象已经调用了castclass。否则,NULL被压在堆栈上。如果obj(对象)是NULL,则isinst返回NULL。
注意:
1.数组从System.Array继承
2.如果可以将Foo强制转换为Bar,那么Foo[]可以被强制转换为Bar[]
3.为了2,将enum视为它们的基本类型:因而如果E1和E2共享基本类型,则E1[]可以强制转换到E2[]
在730,将用于测试类的异常描述如下:
如果不能找到类,则发出TypeLoadException。这—般是在CIL被转换成本地代码时而不是在运行时间检测的。
在740,描述用于测试类的可检验性:
正确的CIL保证类是表示类的有效的typeref或typedef标记,且obj总是或者为空、或者为对象引用。
图8是图800,示出依照本发明一个方面的从整数到标签化类型的转换规则。
tag[.ovf]--将整数转换成对象引用
格式 |
汇编格式 |
说明 |
OPCODE_TAG |
Tag[.ovf] |
将整数i转换成标签化对象引用 |
在810,为标签类定义堆栈转移如下:
Stack Transition(堆栈转移):
…,i->…,obj
在820,定义tag如下:
tag指令将非标签化值i(原型整数)转换为类型顶(类型O)的实例。这通过在i中设置特殊标签位来完成。
在830,将用于tag的异常描述如下:
如果已经设置值标签位,则发出OverflowException(溢出异常)。
在840,描述用于tag的可检验性:
标准的CIL保证i是native int类型的。
图9是图900,示出依照本发明一个方面的从标签化类型到整数的转换规则。
untag[.ovf]一将对象引用转换成整数
格式 |
汇编格式 |
说明 |
OPCODE_UNTAG* |
UnTag |
将标签化对象引用转换成整数i |
*注:操作码OPCODE_TAG和OPCODE_UNTAG将从可用CLI操作码范围中分配(见ECMA部分III,1.2.1节)。
在910,为untag(非标签)类定义堆栈转移如下:
Stack Transition(堆栈转移):
…,obj->…,i
在920,定义untag如下:
untag指令将标签化对象引用转换成原型整数。这是通过清除在obj中的特殊标签位来完成的。
在930,描述用于untag的异常如下:
如果obj不是标签化值,则发出InvalidCastException.
如果obj是空,则发出NullReferenceException(空引用异常)。
在940,描述用于untag的可检测性:
正确的CIL保证obj是对象引用,即,类型Top的对象引用,并且代表标签化整数。
参考图10,用于实现本发明的各种方面的示例性环境1010包括计算机1012。计算机1012包括处理单元1014,系统存储器1016和系统总线1018。系统总线1018连接包括但不限于系统存储器1016的系统组件至处理单元1014。处理单元1014可以是任何各种可用的处理器。双微处理器和其它多处理器结构也可以使用作为处理单元1014。
系统总线1018可以是任何几种类型的总线结构,包括存储器总线或存储控制器,外设总线或外部总线,和/或使用任何各种可用总线结构的局部总线,包括但不限于,11-位总线,工业标准结构(ISA),微通道结构(MSA),扩展ISA(EISA),智能驱动器电子设备(IDE),VESA局部总线(VLB),外围组件互连(PCI),通用串行总线(USB),高级图形端口(AGP),个人计算机存储卡国际协会总线(PCMCIA),以及小型计算机系统接口(SCSI)。
系统存储器1016包括易失性存储器1020和非易失性存储器1022。基本输入/输出系统(BIOS),包含基本例程以在计算机1012内的元件之间传送信息,诸如在启动期间,存储在非易失存储器1022。作为说明,且不是限制,非易失性存储器1022可以包括只读存储器(ROM),可编程ROM(PROM),电可编程ROM(EPROM),电可擦除的ROM(EEPROM),或闪存。易失性存储器1020包括随机存取存储器(RAM),用作外部高速缓存。作为说明且不是限制,RAM可以以许多方式得到,诸如同步RAM(SRAM),动态RAM(DRAM),同步DRAM(SDRAM),两倍数据速率SDRAM(DDR SDRAM),增强型SDRAM(ESDRAM),同步链接DRAM(SLDRAM)以及直接存储器总线(Rambus)RAM(DRRAM)。
计算机1012还包括可移动/不可移动的、易失性/非易失性计算机存储介质。图10示出,例如盘存储器1024。盘存储器1024包括但不限于,象磁盘驱动器、软盘驱动器、带驱动器、Jaz驱动器、另外,盘存储器1024可以单独地包括存储介质或者组合其它存储介质,所述其它存储介质包括但不限于光盘驱动器,诸如紧致盘ROM设备(CD-ROM)、CD可记录驱动器(CD-R驱动器)、CD可重写驱动器(CD-RW驱动器)或者数字通用盘ROM驱动器(DVD-ROM)。为了方便盘存储器设备1024连接至系统总线1018,一般使用可移动或不可移动的接口诸如接口1026。
要意识到,图10描述了用作用户与在适当的操作环境1010中所述的基本计算机资源之间的媒介物的软件。这样的软件包括操作系统1028。可存储在盘存储器1024上的操作系统1028,用于控制和分配计算机系统1012的资源。系统应用1030通过存储在系统存储器1016中或者在盘存储器1024上的程序模块1032和程序数据1034,利用由操作系统1028管理的资源。要意识到,本发明可以由各种操作系统或操作系统的组合来实现。
用户通过输入设备1036将命令或信息输入到计算机1012中。输入设备1036包括但不限于,诸如鼠标之类的指点设备、轨迹球、输入笔、触摸板、键盘、话筒、游戏杆、游戏板、卫星天线、扫描仪、TV调谐器卡、数码照相机、数字摄像机、web照相机等等。这些和其它输入设备通过系统总线1018经由接口端口1038连接至处理单元1014。接口端口1038包括,例如,串行端口、并行端口、游戏端口以及通用串行总线(USB)。输出设备1040使用某些相同类型的端口作为输入设备1036。因而,例如,可使用USB端口提供输入至计算机1012,以及输出来自1012的信息至输出设备1040。提供输出适配器1042以说明存在某些输出设备1040,象监视器、扬声器和打印机,尤其是它们要求特殊的适配器。输出适配器1042包括,作为说明且不是限制,视频和声卡,它们提供输出设备1040与系统总线1018之间连接的装置。应该注意,其它设备和/或设备的系统提供输入和输出性能两者,诸如远程计算机1044。
计算机1012可以在使用逻辑连接至一个或多个远程计算机诸如远程计算机1044的网络化环境中运行。远程计算机1044可以是个人计算机、服务器、路由器、网络PC、工作站、基于微处理器的电器、对等设备或其它公共网络节点等等,以及一般包括许多或全部相对于计算机1012所述的元件。为了简短,只有一个存储器设备1046与远程计算机1044一起示出。远程计算机1044是逻辑地通过网络接口1048并且然后物理地通过通信连接1050连接至计算机1012。网络接口1048包括通信网络,诸如局域网(LAN)和广域网(WAN)。LAN技术包括光纤分布式数据接口(FDDI)、铜分布式数据接口(CDDI)、以太网/IEEE1102.3、令牌环/IEEE 1102.5等等。WAN技术包括但不限于,点对点链接、电路交换网络象综合数字业务网络(ISDN)以及上述的变体、包交换网络和数字订户线路(DSL)。
通信连接1050指用于连接网络接口1048至总线1018的硬件/软件。尽管为了说明清楚在计算机1012内示出通信连接1050,但它也可以在计算机1012之外。用于至网络接口1048的连接所需的硬件/软件包括,仅为示例性目的,内部和外部技术,诸如调制解调器,包括正规电话等级的调制解调器、线缆调制解调器和DSL调制解调器、ISDN适配器和以太网卡。
图11是示例计算环境1100的示意性方框图,本发明可以与所述环境交互。系统1100包括一个或多个客户机1110。客户机1110可以是硬件和/或软件(例如,线程、过程、计算设备)。系统1100还包括一个或多个服务器1130。服务器1130也可以是硬件和/或软件(例如,线程、过程、计算设备)。服务器1130可以容留例如通过使用本发明执行变换的线程。在客户机1110与服务器1130之间一个可能的通信可以是以适合于在两个或多个计算机过程之间传输的数据包形式的。系统1100包括通信框架1150,可以使用它促进客户机1100与服务器1130之间的通信。客户机1100有效地连接至一个或多个客户机数据存储器1160,可以使用它们存储客户机1100的本地信息。同样,服务器1130有效地连接至一个或多个服务器数据存储器1140,可以使用它们存储服务器1130的本地信息。
上面已经描述的内容包括本发明的例子。当然,不可能为了描述本发明,描述每个想得到组件或方法的组合,但一个本领域的普通熟练技术人员可认识到,还有许多本发明的组合和改变是可能的。因此,本发明是想要包括所有落在所附权利要求书的精神和范围内的这样的变更、修改和变体。而且,到在详细说明或权利要求书中都使用术语“包括(include)”的程度,这样的术语旨在以相似于术语“包括(comprising)”的方式包括的,如“包括”在权利要求中作为过渡词使用所解释的。