实现快速类型检查的方法 【技术领域】
本发明一般地涉及面向对象的语言的数据结构,更具体地说,涉及提供更快的数据结构类型检查的方法和装置。
背景技术
面向对象的计算机编程语言例如JAVA和C#一般采用类型层次结构(type hierarchy)(在此文献中,互换使用概念“类型”(type)和“类”(class))。在计算机语言中,类型用来描述给定的实体。例如,计算机语言可以采用具有多个字段的数据结构来描述对象类型。包含在所述字段中的信息唯一地定义了该类型。一般地,类型具有层次结构,即一种类型可能是另一种类型的子类型或超类型,例如,类型“苹果”是类型“水果”的子类型,并且是类型“红苹果”的超类型。在计算机存储器中为某些数据确定了类型之后,可能必须确定该类型是否是另一个类型的子类型。类型层次结构可以看作为一个类型树,具有根类型基础、根类型的子类型以及子类型的子类型等等。在运行时,这些语言确定一种类型是否是另一个类型的子类型。类型检查是面向对象的语言中非常常见的操作。这一检查是通过使用运行时指令来完成的,例如在虚拟机中完成。
图1示出了根据现有技术的类型检查处理。图1所示的系统100包括数据结构105到109。一般地,除其他数据之外,存储在计算机存储器中的数据结构还包含类型字段和指向超类型字段地指针。为了确定数据结构105的类型,检查类型字段105A,并确定数据结构105具有类型E。还可能必须确定类型E是否是另一个类型的子类型,例如可能需要确定类型E是否是类型B的子类型。这是通过检查数据结构105的超类型指针字段105B来完成的。超类型指针字段105B提供了指向类型E的超类型的指针。反引用(dereference)该指针以获得类型E的超类型(即位于数据结构106的类型字段106A处的类型D)。类似地,通过获得指向D的超类型的指针并反引用该指针,确定类型D的超类型。继续这个处理,直到确定类型B是类型E的超类型(或者反过来说类型E是类型B的子类型)。一般地,递归执行这一处理,直到确定给定类型(例如类型E)是另一个类型(例如类型B)的子类型,或者直到到达了根类型。在系统100中,类型A是根类型,即类型A不是任意其他类型的子类型。这由超类型指针字段109B是空来表示。
在系统100中,每次获得超类型指针并反引用该指针都需要存储器访问。这种递归式存储器访问加重了处理资源的负载并且非常耗时。
【附图说明】
附图以示例而非限制性的方式描述了本发明,其中相似的标号表示相似的元件,并且:
图1示出了根据现有技术的类型检查处理;
图2示出了示例性计算系统200,用于实现根据本发明实施例的快速类型检查方法;
图3示出了根据本发明的一个实施例的类型层次结构树和对应的数据结构;并且
图4是根据本发明的一个实施例的处理流程图。
【具体实施方式】
本发明提供了多种方法和装置,用于实现更快的数据结构类型检查。在一个实施例中,现有技术的数据结构由包含子树日志的数据结构所取代,其中所述现有技术的数据结构包括类型字段,并包括用于存储指向该数据结构类型的超类型的指针的字段,所述子树日志用来存储所述数据结构类型层次结构的连续的超类型(类型层次结构引用)。或者,所述类型数据结构可以不包含子树日志,而是可以包含指向子树日志的指针。目前,典型的应用程序最多具有7个类型层次结构引用,大多数应用程序具有不多于3个的类型层次结构引用。这意味着通过在数据结构内实现存储6个层次结构引用的子树日志,几乎可对所有的典型的应用程序进行类型检查,而无需求助于递归式的现有技术的方法。在一个实施例中,3个字段用来存储对给定类型的超类型层次结构的3个连续引用。在另一个实施例中,对给定类型的超类型层次结构的所有引用可以都存储在类型数据结构中。在另一个实施例中,所使用的超类型引用的数量对于给定的应用程序可以在运行时动态确定。
图2示出了示例性计算系统200,用于实现根据本发明实施例的快速类型检查方法。可以实现一种包含多个连续的类型层次结构元素的数据结构,并在计算系统200中使用,该系统可以表示通用计算机、便携式计算机或其他类似的设备。计算系统200的组件是示例性的,其中可省略或添加一个或多个组件。例如,可对计算系统200使用一个或多个存储设备。
参考图2,计算系统200包括通过总线201耦合到显示电路205、主存储器204、静态存储器206和大容量存储设备207的中央处理单元(CPU)202和信号处理器203。计算系统200还可以通过总线201耦合到显示器221、键盘输入222、光标控制223、硬拷贝设备224、输入/输出(I/O)设备225和音频/语音设备226。
总线201是用于传送信息和信号的标准系统总线。CPU 202和信号处理器203是计算系统200的处理单元。CPU 202或信号处理器203(或者二者)可以用来处理计算系统200的信息和/或信号。CPU 202包括控制单元231、算术逻辑单元(ALU)232以及若干寄存器233,用来处理信息和信号。信号处理器203还可包括与CPU 202类似的组件。
主存储器204可以是例如随机访问存储器(RAM)或某种其他的动态存储设备,用来存储信息或指令(程序代码),为CPU 202或信号处理器203所用。在CPU 202或信号处理器203执行指令时,主存储器204可存储临时变量或其他中间信息。静态存储器206可以是例如只读存储器(ROM)和/或其他静态存储设备,用来存储信息或指令,也可为CPU202或信号处理器203所用。大容量存储设备207可以是例如硬盘或软盘驱动器,或者是光盘驱动器,用来为计算系统200存储信息或指令。
显示器221可以是例如阴极射线管(CRT)或液晶显示器(LCD)。显示设备221向用户显示信息或图形。计算系统200可以通过显示电路205与显示器221接口。键盘输入222是字母数字输入设备,带有模数转换器。光标控制223可以是例如鼠标、轨迹球或光标方向键,用来控制目标在显示器221上的移动。硬拷贝设备224可以是例如激光打印机,用来在纸面、胶卷或其他类似介质上打印信息。多个输入/输出设备225可以耦合到计算系统200。根据本发明,包含多个类型层次结构引用的数据结构可以由包含在计算系统200内的硬件和/或软件来实现。例如,CPU 202或信号处理器203可以执行存储在机器可读介质例如主存储器204中的代码或指令。
所述机器可读介质可包括一种机构,其以机器(例如计算机或数字处理设备)可读的形式提供(即,存储和/或传输)信息。例如,机器可读介质可包括只读存储器(ROM)、随机访问存储器(RAM)、磁盘存储介质、光存储介质、闪存设备。所述代码或指令可由载波信号、红外信号、数字信号或其他类似信号表示。
图3示出了根据本发明一个实施例的类型层次结构树及对应的类型数据结构。图3所示的系统300包含类型层次结构树310,其中类型A是根类型。类型层次结构树310还可以图示更大的类型层次结构树的一部分。如该类型层次结构树所示,类型A是类型B的超类型,类型B是类型C的超类型,类型C是类型D的超类型,而类型D是类型E的超类型。如图所示,类型A也是类型S的超类型。在诸如JAVA和C#的语言中,一个给定的类型可能具有多个子类,但每种类型最多具有一个超类。即不允许多重继承,一种类型最多可继承一个超类。
根据本发明的实施例,在运行时,具有类型E的对象由数据结构320表示,该数据结构包含多个对类型层次结构树的引用。使用了一小块存储器来缓存所述引用。在一个实施例中,缓存可包含整个类型层次结构树的某个子集,例如3个引用。或者,可缓存对类型E的超类型的所有引用。
因此,在一个实施例中,本发明可实现类型层次结构的快速确定。例如,如果需要确定类型B是否是类型E的超类型,则只需检查E的数据结构,该数据结构包含3个超类型引用级别,包括类型B。如果所要检查的超类型级别大于包含在所述类型数据结构内的级别,则可使用递归处理。例如,如果需要确定类型A是否是类型E的超类型,则检查类型E的数据结构。类型B被确定为类型E所引用的最高的超类型。然后检查类型B的数据结构,确定类型A是类型B的超类型,因此类型A也被确定为是类型E的超类型。
经验上发现,对于多数应用程序来说,包含3个类型层次结构引用级别的数据结构就足以实现无需求助于递归处理的类型检查。大多数典型的应用程序的类型层次结构树包含的级别不超过7个。因此,包含具有6个引用的根树日志的数据结构可能就足以提供无需参考中间超类型的数据结构的快速类型检查。
可以认识到,本发明的方法考虑了使用任意数量的根树日志引用,所实现的数量依赖于具体应用程序以及实际因素,例如存储器资源与处理资源比。
图4是根据本发明一个实施例的处理流程图。处理400可用来确定对象X是否具有类型Y;一般地,确定类型Y(查询类型)是否是对象X作为其成员的类型(对象类型)的超类型。图4所示的处理400开始于操作405,其中进行评估以确定对象X的类型是否等于类型Y(即对象X是否具有类型Y)。如果是,则处理在操作410返回真。如果不是,则处理继续操作415,其中比较类型X和类型Y在类型层次结构树中的深度。计算一个索引值,该索引值等于类型X的深度值减去类型Y的深度值。如果该索引值小于或等于零(即类型Y比类型X深),则表明类型Y不可能是类型X的超类型,处理在操作420处返回假。如果所述索引值大于0,则在操作425处将索引值与子树日志内的类型层次结构引用数量进行比较。如果索引等于或小于类型层次结构引用的数量,则在操作430处获得缓存在所述数据结构中的对应类型,并与类型Y进行比较。如果两个类型相等,则该处理返回真。
如果索引大于子树日志中的类型层次结构引用数量,则类型Y未缓存在所述数据结构中。在操作435处获得最高的引用类型,并从操作415递归地重复所述处理。
JAVA语言指令的一种示例性伪代码实现包含在附件A中,用以确定对象的类型。附件A的伪代码以回到现有技术的递归式方法开始,用于更复杂的情形,其中查询类型(类T)是数组或接口类型。数组类型是包括多个另一种类型的分量的类型,而接口类型是一个没有实际特征的类型。在一个实施例中,可以采用现有技术的递归式方法来处理这些更复杂的类型。
在前面的说明书中,已参考其具体的示例性实施例来描述了本发明。然而,很清楚可以对其进行各种修正和改变而不会偏离本发明如所附的权利要求所定义的更宽的精神和范围。因此,本说明书和附图应以示例性而非限制性的方式来理解。
附件A
下面的示例性伪代码是一种JAVA语言指令的实现,用以确定对象的类型。源对象是ObjectX而检查的查询类型是ClassY。