实现快速子类和子类型检查的方法与设备技术

技术编号:2887598 阅读:233 留言:0更新日期:2012-04-11 18:40
本文披露了在程序执行期间进行快速子类型检查的方法和装置。根据本发明专利技术的一个方面,判定与作为基于对象的计算系统一部分的对象关联的类是否是另一个类型的子类型的方法,包括从与该对象关联的类所关联的动态存储位置获取一个候选类型,将该候选类型与潜在地与该候选类型相同的第一个类型作比较。然后判断该候选类型实际上是否等于第一个类型。如果确定该候选类型实际上等于第一个类型,就提供一个表示该候选类型实际上等于第一个类型的子类型的指示。(*该技术在2019年保护过期,可自由使用*)

【技术实现步骤摘要】

本专利技术总体涉及基于对象的系统的对象之间关系的确定,更具体地说,本专利技术涉及对基于对象的系统中的对象有效地执行子类型检查。许多基于对象的计算系统是这样构造的,其中的对象是定义了可用于对象的功能的特定类和子类的成员。在程序执行期间,虚拟机一般涉及检查对象之间的关系,以利程序的执行。举例来说,虚拟机可以检查对象之间的子类或子类型关系。在有些程序设计语言、例如美国加州Palo Alto的Sun Microsystems公司开发的JavaTM程序设计语言中,程序设计语言内的构造涉及子类检查。这种子类检查一般涉及判断某特定对象是否是给定类型的。就是说,检查与程序关联的类结构以确定特定对象的类型。附图说明图1是一种常规类结构的图示。类结构102是一个类分层结构,包括类106和子类110。一般来说,类106是一个抽象类,可以包含任意数量的子类110。如图所示,子类“1”110a、子类“2”110b和子类“N”110c是类106的“直接”子类,而子类“A1”110d是子类“1”110a的直接子类。子类“A1”110d可看作是类106的间接子类,因为子类“A1”110d是子类“1”110a的子类,后者是类106的子类。类106一般包括各种不同的函数(function)或过程(method)。每个子类110通常包括一个不同的函数集合。举例来说,子类“1”110a一般包括专门用于作为子类“1”110a的一部分的对象的函数。作为类106的成员的对象实际上可以执行与类106相关的所有函数。是任何子类110的成员的一个对象也是类106的成员。因此,是任何子类110的成员的一个对象也可以执行与类106相关联的所有函数。然而,是某特定子类例如子类“1”110a的成员的对象,却不能执行与不同的子类例如子类“2”110b相关联的特定函数。因此,判断某对象属于哪个子类110,就能有效地确定该对象所能执行的函数。运行时可用一种窄投射(narrawing cast)来有效地将由类106定义的对象作为由子类“1”110a定义的对象来看待。然而,由于由类106定义的对象,可以由子类“2”110b定义而不是由子类“1”110a定义,一般要进行检查以确定将该对象与子类“1”110a关联是否准确。本领域的熟练人员会明白,关于某对象是否与子类“1”110a关联的检查,实际上就是判断该对象是否至少与子类“1”110a关联的检查。换言之,与子类“A1”110d关联的某对象一般会被确定为也与子类“1”110a关联。在JavaTM环境中,确定对象的子类型的函数,例如is_subtype函数,可以是静态编码的。尽管用来静态编码函数的方法会有所不同,一种常用的方法是采用一个二维位矩阵,其中位于(i,j)位置的一个位编码is_subtype(ti,tj)的结果。采用这种矩阵,子类型检查实际上涉及变址到矩阵去确定对象的子类型。然而,由于矩阵规模可能很大,并且由于一般要求的指令的位操作,所以子类型检查的速度经常很慢。一般来说,为了确定某特定对象的子类型而进行子类型检查时,通常必须检查一个类型的几乎所有子类型,例如一个类的几乎所有子类。在有些层次化类结构中,例如图1的类结构102中,必须检查的子类的数量会相对较多。例如,某些类可能具有数百个相关的子类。因此,当有多个子类型时,例如在有用JavaTM程序设计语言定义的接口的情况下,子类型检查的执行效率通常不高。就是说,当有多个子类型时,检查每个子类型一般都很费时,正如上文所述。此外,在使用多个继承层(inheritance layer)的系统例如C++程序设计语言定义的系统中执行子类型检查经常也效率不高。对于有多个继承层的系统来说,有效地执行子类型检查一般有困难,因为必须检查每个继承层。有效地执行子类型检查是重要的,因为检查可能频繁地发生。在程序执行期间频繁发生检查时,与检查相关联的开销就会相对较高。在有些情况下,一个运行时子类型检查或测试,可能要求相当于大约8条指令量级的开销,本领域的熟练人员知道,这对于整体程序来说是相当大的开销,在重复进行运行时子类型检查时尤其如此。因此,程序执行的速度由于频繁的子类型检查而受抵销。一般来说,当在程序执行期间进行子类型检查时,实际上所有与程序关联的类和过程都必须是已知的。通常要构造数据结构来列举所有与程序关联的类和过程,以便这些类和过程处于准备好被存取的状态。换言之,子类型检查中所用的数据结构通常必须在程序执行之前计算出来。这种数据结构通常相当大,耗费相当多的系统资源。所有与程序关联的类和过程都必须是已知的这个要求,是与采用动态连接或动态类加载的系统不兼容的,因为动态连接允许与程序关联的类和过程有效地改变。如果不能采用动态连接,程序的功能就会受到影响。在采用动态连接的环境中,每次进行涉及类加载的操作后,数据结构一般都要重新计算,这就耗费时间,因而效率不高。因此,需要一种提高子类型检查效率的方法和装置。更特别地,需要一种提高子类型检查效率、并且每次类加载操作后不要求重新计算数据结构的方法和装置。本专利技术披露在程序执行期间进行快速子类型检查的方法和装置。根据本专利技术的一个方面,快速有效地确定作为与基于对象的计算系统一部分的对象相关联的类型的方法,包括从与一个类(该类与该对象相关联)相关联的动态存储位置获取一个候选类型,将候选类型与潜在地与该候选类型相同的第一个类型作比较。然后判断候选类型实际上是否等于第一个类型。如果确定候选类型实际上等于第一个类型,就提供一个表示候选类型实际上等于第一个类型的指示。根据本专利技术的另一个方面,安排一个计算机系统来确定驻留在计算机系统上的第一个对象相关联的类型。计算机系统包括处理器、内存和将候选类型装入内存的加载机构。候选类型是从与第一个对象关联的类对象获取的。计算机系统还包括一个将候选类型与第一个类型比较的比较机构,一个能确定候选类型是否实际上等于第一个类型的判断机构。计算机系统中有一个指示器,用于在确定候选类型实际上等于第一个类型时,提供一个表示候选类型实际上等于第一个类型的指示。根据本专利技术再另一个方面,对属于一个特定类的成员的对象执行子类型检查的方法,包括从与该特定类相关联的某位置获取一个存储单元。该存储单元包括潜在地与该对象相关联的第一个子类型的有关信息。该方法还包括判断存储单元所含信息是否和与该对象相关联的实际子类型有关,并且在存储单元与实际类型有关时提供一个表示存储单元所含信息与实际子类型有关的指示。在一个实施例中,该方法还在存储单元所含信息与实际子类型无关时,判断对象的实际子类型,并将与实际子类型相关的信息存储到该特定类的关联位置。通过阅读以下的详细说明,研究各种附图,能更好理解本专利技术。参考以下结合附图的说明,就能理解用具体实施例阐示的本专利技术。各附图简介如下图1是一种常规类分层结构的图示。图2a是表示按照本专利技术的实施例,判断某对象是否是特定类型的子类型的相关步骤的流程图。图2b是表示按照本专利技术的实施例,将一个类型与一个所加载的高速缓存比较-即图2a的步骤208的相关步骤的流程图。图2c是表示按照本专利技术的一个实施例,具有一个高速缓存单元的类的图示。图3是适于实现本专利技术的计算机系统的图示。图4是按照本专利技术一个实施例的虚拟机的图示。一般来说,本文档来自技高网...

【技术保护点】
一种计算机实现的方法,用于确定与作为一个基于对象的计算系统一部分的对象相关联的类是否是另一个类型的子类型,该方法包括: 获取一个候选类型,该候选类型是从与该对象关联的类相关的一个动态存储位置获取的; 将该候选类型与第一个类型作比较; 判断该候选类型实际上是否等于第一个类型; 如果判定该候选类型实际上等于该第一个类型,就提供一个表示该候选类型是该第一个类型的子类型的指示。

【技术特征摘要】
...

【专利技术属性】
技术研发人员:L巴克S米特洛维U霍尔兹勒
申请(专利权)人:太阳微系统有限公司
类型:发明
国别省市:US[美国]

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1