【技术实现步骤摘要】
本专利技术涉及用于计算机程序的面向对象的编程语言领域,尤其是,涉及检测在任意程序组件中的字段和类(class)的可变性(mutability)。
技术介绍
在1995年末被引入时,编程语言Java给因特网带来一场风暴。这一点的主要原因为Java是一种解释性编程语言,这基本上意味着它使用和诸如C或C++编程语言不同的编译/执行范例。以诸如C或C++这样的高级编程语言书写的程序可以由人来读、写、和理解,这些程序需要被翻译成可由实际运行该程序的计算机理解的机器码。这就是编译程序所做的事情。另外,编译程序在翻译代码时同时优化它。编译的最终产品是机器码,从定义上可知是与机器相关的,意味着该代码是特定针对运行它的那种类型计算机的,而不能由不同类型的计算机所理解。这一点的一个简单的例子是为苹果机编译的程序不能在国际商业机器(IBM)兼容PC机上运行。这一点称为“与平台相关”。另一方面,诸如Java这样的解释性编程语言不为特定类型的计算机编译(Java是Sun Microsystems公司的商标)。它们是平台独立的。这一点是通过在编译的程序和特定平台之间放一个中间的Java虚拟机(JVM)实现的。换句话说,当编译一个Java程序时,最终结果不是机器码,而是可由JVM理解的字节码。JVM是与机器相关的,它作为安装到特定机器中JVM的字节码的解释程序。只要该机器安装有JVM就允许Java程序编译和移植到任何机器中。正是这种平台独立性使Java特别适合于因特网。一个计算机一旦安装有JVM,则不管该计算机是苹果机、Wintel PC、Sun、Digital等,通过因特网下载的J ...
【技术保护点】
一种检测一个程序组件中变量、对象、字段、和类的可变性的方法,所述组件用面向对象的编程语言书写,包括步骤:判定在该程序组件中的任何变量是否可以经受第一类型状态修改,所述第一类型状态修改由该程序组件中的至少一种方法进行;执行封装 分析以判定在该程序组件中的任何变量是否可以经受第二类型的状态修改,所述第二类型状态修改由不在该程序组件中的至少一种方法进行;其中,如果在一个变量初始化以后它的状态曾经改变的话则所述变量是可变的,所述变量的状态是它的值连同任何引用的对 象的状态;其中,如果在一个对象初始化以后它的状态曾经改变的话则所述对象是可变的,所述对象的所述状态是所有相关变量的状态的集合;其中,如果对应于一个字段的任何变量是可变的则所述字段是可变的;其中,如果由一个类实现的任何 实例字段是可变的则所述类是可变的。
【技术特征摘要】
US 2000-9-21 09/667,4301.一种检测一个程序组件中变量、对象、字段、和类的可变性的方法,所述组件用面向对象的编程语言书写,包括步骤判定在该程序组件中的任何变量是否可以经受第一类型状态修改,所述第一类型状态修改由该程序组件中的至少一种方法进行;执行封装分析以判定在该程序组件中的任何变量是否可以经受第二类型的状态修改,所述第二类型状态修改由不在该程序组件中的至少一种方法进行;其中,如果在一个变量初始化以后它的状态曾经改变的话则所述变量是可变的,所述变量的状态是它的值连同任何引用的对象的状态;其中,如果在一个对象初始化以后它的状态曾经改变的话则所述对象是可变的,所述对象的所述状态是所有相关变量的状态的集合;其中,如果对应于一个字段的任何变量是可变的则所述字段是可变的;其中,如果由一个类实现的任何实例字段是可变的则所述类是可变的。2.权利要求1所述方法,第一类型状态修改决定步骤包括步骤检测在所述每一变量中保持值的可能的第一类型状态修改;检测由所述每一变量引用的任何对象状态的可能的第一类型状态修改。3.权利要求1所述方法,封装分析步骤包括步骤检测在所述每一变量中保持值的可能的第二类型状态修改;检测由所述每一变量引用的任何对象状态的可能的第二类型状态修改,任何对象状态的可能的第二类型状态修改发生在初始化的点处;检测变量封装的可能的破坏;其中,如果对从一个变量可到达的对象的所有引用都在该程序组件中定义的话则该变量是被封装的;其中,如果在该程序组件中的一个方法引起一个从该变量可到达的可变对象变得可由至少一种不在该程序组件中的方法访问的话则变量封装被破坏。4.权利要求1所述方法,其中,所述方法在Java环境中实现,所述任何实例字段是非静态字段,所述变量是类变量或实例变量,每一所述类变量在它相应的<clinit>方法完成时被初始化,每一所述实例变量在它相应的<init>方法完成时被初始化。5.权利要求1所述方法,进一步包括步骤识别由于检测可变全局变量或对象的分离错误。6.权利要求1所述方法,进一步包括步骤识别这样的字段和对象,它们因为所述被识别的字段和对象不在检测到的可变字段和对象的集合中而可以被判定为是常数。7.一种检测在一个程序组件中类的可变性的方法,所述组件用面向对象的编程语言书写,包括步骤获得一组类,每一所述类被分类为可变的、不可变的、和未决定的其中之一;测试每一未决定的类,所述测试包括子步骤测试被测试的所述未决定的类中的每一字段,所述测试包括子步骤判定相应于所述每一字段的任何变量是否可以经受第一类型的状态修改,所述第一类型状态修改由在所述组件中的至少一种方法进行;执行封装分析以判定对应于所述每一字段的任何变量是否可以经受第二类型的状态修改,所述第二类型状态修改由不在所述组件中的至少一种方法进行;如果未发现可能的第一类型或第二类型状态修改的话则分类所述每一字段为不可变的;如果类可变性信息不足的话则分类所述每一字段为未决定的;否则分类所述每一字段为可变的;如果在所述未决定类中的任何字段是可变的则重新将所述未决定的类分类为可变的;如果在所述未决定类中的所有字段是不可变的则重新将所述未决定的类分类为不可变的;重复所述测试每一未决定的类步骤,直到在重复所述测试步骤后未决定的类的数目和重复所述测试步骤前的未决定的类的数目相同;重新将剩余的未决定的类分类为可变类。8.一种检测在一个程序组件中类的可变性的方法,所述组件用面向对象的编程语言书写,包括步骤获得一组类,每一所述类被分类为可变的、不可变的、和未决定的其中之一;测试每一未决定的类,所述测试包括子步骤测试被测试的所述未决定的类中的每一实例字段,所述测试包括子步骤判定相应于所述每一实例字段的任何变量是否可以经受第一类型的状态修改,所述第一类型状态修改由在所述组件中的至少一种方法进行;执行封装分析以判定对应于所述每一实例字段的任何变量是否可以经受第二类型的状态修改,所述第二类型状态修改由不在所述组件中的至少一种方法进行;如果未发现可能的第一类型或第二类型的状态修改的话则将所述每一实例字段分类为不可变的;如果类可变性信息不足的话则将所述每一实例字段分类为未决定的;否则将所述每一实例字段分类为可变的;如果在所述未决定的类中的任何实例字段是可变的则重新所述未决定的类分类为可变的;如果在所述未决定的类中的所有实例字段是不可变的则重新所述未决定的类分类为不可变的;重复所述测试每一未决定的类步骤,直到在重复所述测试步骤后未决定的类的数目和重复所述测试步骤前的未决定的类的数目相同;重新将剩余的未决定的类分类为可变类。9.权利要求8所述方法,第一类型状态修改判定子步骤包括步骤检测在所述每一变量中保持的值的可能的第一类型状态修改;检测由所述每一变量引用的任何对象的状态的可能的第一类型状态修改;其中,如果在一个对象初始化以后它可以改变的话,则该对象的状态被修改;一个对象的状态是所有相关变量的状态的集合;其中,如果一个变量的状态在所述变量初始化以后曾经改变的话,该变量是可变的,所述变量的状态是它的值连同任何引用的对象的一个状态。10.权利要求8所述方法,执行封装分析子步骤包括步骤检测所述每一变量值的可能的第二类型状态修改;检测由所述每一变量引用的任何对象状态的可能的第二类型修改,任何对象状态的所述可能的第二类型状态修改发生在初始化点;检测变量封装的可能的破坏;其中,如果在一个对象初始化以后它可以改变的话则该对象的状态被修改;一个对象的状态是所有相关变量的状态的集合;其中,如果一个变量的状态在所述变量初始化以后曾经改变的话则该变量是可变的,所述变量的状态是它的值连同任何引用的对象的一个状态;其中,如果对从一个变量可到达的对象的所有引用都在所述组件中定义则该变量是被封装的;其中,如果在该程序组件中的一个方法引起一个从变量可到达的可变对象变得可由至少一个不在所述组件中的方法访问的话则变量封装被破坏。11.权利要求8所述方法,其中,该方法在Java环境中实现,对应于所述每一实例字段的所述每一变量是非静态变量,且每一非静态变量在它相应的<init>方法完成时被初始化。12.权利要求8所述方法,另外包括步骤如果一个对象是一个可变类的实例,则它被识别为是可变的;如果一个对象是一个不可变类的实例,则它被识别为是不可变的;识别这样的字段和对象,它们因为所述被识别的字段和对象不在检测到的可变字段和对象的集合中而可以被决定为是常数。13.权利要求8所述方法,另外包括步骤测试在每一类中的每一未决定类字段的可变性。14.权利要求13所述方法,另外包括步骤识别由于检测到的可变类字段的分离错误。15.权利要求13所述方法,测试在每一类中的每一未决定类字段的可变性的步骤包括子步骤判定对应于所述每一未决定类字段的任何变量是否可以经受第一类型的状态修改;执行封装分析以判定对应于所述每一未决定类字段的任何变量是否可以经受第二类型的状态修改。16.权利要求15所述方法,其中,判定对应于所述每一未决定类字段的任何变量是否可以经受第一类型的状态修改子步骤包括步骤检测在所述每一变量中保持值的可能的第一类型状态修改;检测由所述每一变量引用的任何对象的一个状态的可能的第一类型状态修改;其中,如果在一个对象初始化以后它可以改变的话则该对象的状态被修改;一个对象的状态是所有相关变量的状态的集合;其中,如果一个变量的状态在所述变量初始化以后曾经改变的话则它是可变的,所述变量的状态是它的值连同任何引用的对象的一个状态。17.权利要求15所述方法,其中,执行封装分析以决定相应于所述每一未决定类字段的任何变量是否可以经受第二类型状态修改子步骤包括步骤检测所述每一变量值的可能的第二类型状态修改;检测由所述每一变量引用的任何对象的一个状态的可能的第二类型状态修改,任何对象的一个状态的所述可能的第二类型状态修改发生在初始化点;检测变量封装的可能的破坏;其中,如果在一个对象初始化以后它可以改变的话则该对象的状态被修改;一个对象的状态是所有相关变量的状态的集合;其中,如果一个变量的状态在所述变量初始化以后曾经改变的话则它是可变的,所述变量的状态是它的值连同任何引用的对象的一个状态;其中,如果对从一个变量可到达的对象的所有引用都在所述组件中定义则它是被封装的;其中,如果在该程序组件中的一个方法引起从一个变量可到达的一个可变对象变得可由至少一个不在所述组件中的方法访问的话则变量封装被破坏。18.权利要求13所述方法,其中,该方法在Java环境中实现,对应于所述每一未决定类字段的所述变量是静态变量,且每一静态变量在它的相应的<clinit>方法完成时被初始化。19.一种检测在一个程序组件中类和类变量的可变性的方法,所述组件用面向对象的编程语言书写,包括步骤获得一组类,每一所述类被分类为可变的、不可变的、和未决定的其中之一;测试每一未决定的类,所述测试包括子步骤测试被测试所述未决定类中的每一实例字段的可变性;如果未发现可能的状态或封装分析修改的话则将一个实例字段分类为不可变的;如果类可变性信息不足的话则将一个实例字段分类为未决定的;否则分类一个实例字段为可变的;如果在所述未决定的类中的任何实例字段是可变的则重新将一个未决定的类分类为可变的;如果在所述未决定的类中的所有实例字段是不可变的则重新将所述未决定的类分类为不可变的;重复对每一未决定的类步骤的所述测试,直到在重复所述测试步骤后未决定的类的数目和重复所述测试步骤前的未决定的类的数目相同;重新将剩余的未决定的类分类为可变类;测试每一类中的每一类字段的可变性。20.权利要求19所述方法,其中,测试字段的可变性,无论所述字段是实例字段还是类字段,包括子步骤判定对应于所述被测试字段的任何变量是否可以经受第一类型状态修改,所述第一类型状态修改由在该程序组件中的至少一种方法进行;执行封装分析以判定对应于所述被测试字段的任何变量是否可以经受第二类型的状态修改,所述第二类型状态修改由不在该程序组件中的至少一种方法进行;如果未发现可能的状态修改或封装的破坏的话则将所述被测试字段分类为不可变的;如果类可变性信息不足的话则将所述被测试字段分类为未决定的;否则分类所述被测试字段为可变的。21.权利要求20所述方法,其中,第一类型状态修改判定子步骤包括步骤检测在所述每一变量中保持值的可能的第一类型状态修改;检测由所述每一变量引用任何对象的一个状态的可能的第一类型状态修改;其中,如果在一个对象初始化以后它可以改变的话则该对象的状态被修改;一个对象的状态是所有相关变量的状态的集合;其中,如果一个变量的状态在所述变量初始化以后曾经改变的话则它是可变的,所述变量的状态是它的值连同任何引用的对象的一个状态。22.权利要求20所述方法,其中,执行封装分析子步骤包括步骤检测所述每一变量的值可能的第二类型状态修改;检测由所述每一变量引用任何对象的一个状态的可能的第二类型修改,任何对象的一个状态的所述可能的第二类型状态修改发生在初始化点;检测变量封装的可能的破坏;其中,如果在一个对象初始化以后它可以改变的话则该对象的状态被修改;一个对象的状态是所有相关变量的状态的集合;其中,如果一个变量的状态在所述变量初始化以后曾经改变的话则它是可变的,所述变量的状态是它的值连同任何引用的对象的一个状态;其中,如果对从一个变量可到达的对象的所有引用都在所述组件中定义则它是被封装的;其中,如果在该程序组件中的一个方法引起从一个变量可到达的一个可变对象变得可由至少一个不在所述组件中的方法访问的话则变量封装被破坏。23.权利要求19所述方法,其中,所述方法在Java环境中实现,所述实例字段是非静态字段,一个实例变量在它的相应的<init>方法完成时被初始化,所述类字段是静态字段,一个类变量在它的相应的<clinit>方法完成时被初始化。24.权利要求19所述方法,另外包括步骤如果一个对象是一个可变类的实例,则它被识别为是可变的;如果一个对象是一个不可变类的实例,则它被识别为是不可变的;识别这样的字段和对象,它们因为所述被识别的字段和对象不在检测到的可变字段和对象的集合中而可以被决定为是常数。25.权利要求19所述方法,另外包括识别由于检测到的可变类字段的分离错误的步骤。26.一种设备,用于检测一个程序组件中的变量、对象、字段、和类的可变性,所述组件用面向对象的编程语言书写,包括至少一个内核库和至少一个数据流分析引擎层,用于提供该程序组件的特定抽取;至少一个实用程序模块层,用于使用至少一个数据分析引擎的结果产生基本结果;至少一个可变性子分析模块层,用于产生最后结果;其中,如果在一个变量初始化以后它的状态曾经改变的话则该变量是可变的,一个变量的状态是它的值连同任何引用的对象的状态;其中,如果在一个对象初始化以后它的状态曾经改变的话则该对象是可变的,一个对象的状态是所有相关变量的状态的集合;其中,如果相应于一个字段的任何变量是可变的则该字段是可变的;其中,如果由一个类实现的任何实例字段是可变的则该类是可变的。27.权利要求26所述设备,至少一个内核库和至少一个数据分析引擎层包括一个库,用于通过分析一组分类文件收集和操作关于该程序组件的静态信息,且用于有效构造该程序组件的引用、层次结构、和调用图。28.权利要求26所述设备,至少一个内核库和至少一个数据分析引擎层包括一个库,用于允许用户读分类文件。29.权利要求26所述设备,至少一个内核库和至少一个数据分析引擎层包括一个过程内数据分析引擎,用于迭代计算一条指令对与在一个方法框架上的位置关联的信息的影响,所述方法框架是一个操作数堆栈和一个本地变量数组。30.权利要求26所述设备,至少一个内核库和至少一个数据分析引擎层包括一个过程间数据分析引擎,用于计算一个方法对与在该方法完成时仍然存在的变量关联的信息的影响。31.权利要求26所述设备,至少一个实用程序模块层包括一个类型分析实用程序模块,用于识别为在每一方法中的每一指令和每一框架位置的可能的类型的集合。32.权利要求26所述设备,至少一个实用程序模块层包括一个可到达性分析实用程序模块,用于为每一方法识别退出对象和类变量的一个集合,从所述类变量为引用一个可变对象的每一指令和每一帧位置可到达所述可变对象。33.权利要求26所述设备,至少一个可变性子分析模块层包括一个值修改可变性子分析模块,用于为每一方法识别一组字段,它们的相应实例和类变量可以在所述每一方法内设定。34.权利要求26所述设备,至少一个可变性子分析模块层包括一个对象修改可变性子分析模块,用于为每一方法识别一组引用类型字段和方法参数,所述该组引用类型字段和方法参数引用一个对象,所述对象的状态由所述每一方法修改。35.权利要求26所述设备,至少一个可变性子分析模块层包括一个变量可访问性可变性子分析模块,用于为每一变量识别它的值是否可以由至少一个不在该程序组件内的方法直接修改。36.权利要求26所述设备,至少一个可变性子分析模块层包括一个对象可访问性可变性子分析模块,用于检测每一对象的一个状态的可能的可访问性,通过决定与所述对象关联的每一变量是否被封装进行;其中,如果对从一个变量可到达的对象的所有引用在该程序组件中定义的话则它是被封装的;其中,所述可访问性由不在该程序组件之内的至少一种方法进行。37.权利要求26所述设备,至少一个可变性子分析模块层包括一个封装破坏可变性子分析模块,用于检测封装的可能的破坏;其中,如果对从一个变量可到达的可变对象的所有引用在该程序组件中定义的话则它是被封装的;其中,如果在程序组件内的一个方法引起从该变量可到达的一个可变对象变得对不在该程序组件内的至少一个方法可访问的话则变量封装被破坏。38.一种检测一个程序组件中变量、对象、字段、和类的可变性的...
【专利技术属性】
技术研发人员:L科维德,B门德尔森,S珀拉特,M比伯斯泰恩,
申请(专利权)人:国际商业机器公司,
类型:发明
国别省市:US[美国]
还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。