未改变对象管理的制作方法

文档序号:6484444阅读:151来源:国知局
未改变对象管理的制作方法
【专利摘要】一种方法包括:使用针对代码执行的静态分析,分析该代码以判定未改变对象的集合,及修改该代码以针对未改变对象的该集合的一个或多个成员实行单例模式技术。该方法也包括输出该经修改代码。还公开了装置及程序产品。另一种方法包括访问来自一客户端的代码;及响应于该代码中的任何代码为源代码,将该源代码编译为目标码,直至来自该客户端的所有该代码都包括目标码为止。该方法进一步包括:使用针对该目标码执行的静态分析,分析该目标码以判定未改变对象的集合,及修改该目标码以针对未改变对象的该集合的一个或多个成员实行单例模式技术。该方法另外包括将该经修改目标码返回至该客户端。
【专利说明】未改变对象管理
【技术领域】
[0001]本发明大体而言涉及对诸如目标码、字节码、可执行码及库的代码的分析,且更具体而言,本发明涉及对代码的静态分析。
现有技术
[0002]面向对象(00)程序设计具有许多益处。举例而言,通过00程序设计,程序员可定义单一对象且然后在程序执行期间实例化该对象多次。另外,对象也可自其他对象继承特性。这允许在不同程序中简单地重用对象。
[0003]虽然00程序设计具有许多益处,但也可对此类型的程序设计进行改良。

【发明内容】

[0004]在本发明的一方面中,一种方法包括:使用针对代码执行的静态分析;分析该代码以判定未改变对象的一集合;及修改该代码以针对未改变对象的该集合的一个或多个成员实行一单例模式(singleton-pattern)技术。该方法也包括输出该经修改代码。还公开了装置及程序产品。
[0005]在本发明的另一例示性方面中,公开了一种方法,其包括:访问来自客户端的代码;及响应于该代码中的任何代码为源代码,将该源代码编译为目标码直至来自该客户端的所有该代码都包含目标码为止。该方法进一步包括:使用针对该目标码执行的静态分析;分析该目标码以判定未改变对象的一集合;及修改该目标码以针对未改变对象的该集合的一个或多个成员实行一单例模式技术。该方法另外包括将该经修改目标码返回至该客户端。
【专利附图】

【附图说明】
[0006]图1为用于未改变对象管理的例示性方法的流程图;
[0007]图2为用于分析代码以判定目标未改变对象的集合的例示性方法的流程图;
[0008]图3为根据例示性实施例的用于未改变对象管理的系统的方块图;
[0009]图4为用于判定未改变对象的例示性方法的流程图;
[0010]图5为用于判定未改变对象的另一例示性方法的流程图;
[0011]图6为用于修改代码以使得目标未改变对象的集合的成员的所有使用都实行单例模式技术的例示性方法的流程图;及
[0012]图7为用于判定不可变对象的例示性方法的流程图。
【具体实施方式】
[0013]如先前所描述,面向对象(00)程序设计具有许多益处。然而,00系统允许创建多个对象,即使在这些对象逻辑上表示同一实体时仍如此。存在与此方法相关联的至少三个问题:[0014]1.在00系统中,对象必须实现两个方法:equals (等于)及hashCode (哈希码)。“equals”方法将另一对象作为一参数:如果a及b逻辑上表示同一实体,则a.equals (b)返回真。必须仔细实现“equals”方法。通常,开发者测试两个对象的内部字段的相等性,此暗示递归地调用“equals”方法直至在原始(primitive)类型或串的字段上测试到相等性为止。“hashCode”方法基于在其上调用该方法的对象而产生在固定范围内的一数字。此方法对于何时将对象插入至hashSet (哈希集)中而言非常重要。当将一对象插入至hashSet中时,首先计算其hashCode,且接着将该对象插入至hashSet中对应于该对象的hashCode的桶(bucket)中。在插入对象之前,该桶经扫描以验证先前未插入另一相等的对象。以此方式,遵照“集合”的数学定义,该集合将不具有重复项。然而,如果没有一贯地实现“hashCode”及“equals”,则错误(称为“缺陷(bug)”)可能发生。举例而言,如果两个相等对象可最后具有不同hashCode,则它们将被插入于同一 hashSet的不同桶中,从而引起集合中的重复项。此类型的缺陷的后果可非常严重。
[0015]2.此设计的另一限制为该设计可占用大量存储器。逻辑上等效的对象可在同一系统中实例化多次的事实可引起不必要的存储器消耗。理想地,如果已实例化了逻辑上等效的对象(“equals”方法返回真),则不应再实例化对象。
[0016]3.最后,此方法的另一限制为在每次执行“equals”方法时所消耗的时间。如以上所提及的,“equals”方法必须被实现以测试对象的所有内部字段的相等性,且此过程触发一级联(cascading)测试,在该级联测试中,针对相等性递归地测试该等字段中的所有字段。如果有可能每当逻辑上等效于原始对象的另一对象已存在于存储器中时防止建立对象,则将不必要执行这种昂贵的相等性测试,且测试指针相等性(例如,使用==运算符)将是足够的。
[0017]针对这些问题的解决方案是特设的(ad-hoc)。开发者必须实现一高速缓存机制,检查高速缓存中的现有对象且只要有可能即返回这些对象而非建立新对象。此外,这些解决方案无法应用于库代码,其中已实现了类而没有这种高速缓存机制,且类的原代码甚至可能不可用。
[0018]本文中提出了用以解决至少以上所描述的三个问题的例示性技术。静态分析可静态地(亦即,不执行代码)检测代码中的对象的相等性。如果将两个对象视为相等的,则静态分析可指示该两个对象实际上应为同一对象。另外,静态分析可指导字节码重写器(bytecode rewriter)的工作以修改源代码不再可用的链接库代码。
[0019]在一例示性实施例中,由静态分析所推荐的修改如下,其中所述修改修改代码以使得目标未修改对象的集合的成员的所有使用都实行单例模式技术:
[0020]1.每个类具有一相关联的高速缓存。
[0021]2.每当调用类的构造器时,则咨询对应的高速缓存。
[0022]3.如果具有在构造器调用中所指定的特性的对象已存在于高速缓存中,则不创建该对象。相反,返回来自高速缓存的该对象。
[0023]4.如果具有在构造器调用中所指定的特性的对象尚未存在于高速缓存中,则创建该对象、将该对象添加至高速缓存并返回该对象。
[0024]作为进一步的优化,可仅在静态地检测到两个或两个以上相等对象时应用以上修改。进一步的修改包括对于已为其创建了高速缓存的类而言,可以用==运算符(即,具有在一列中的两个等号的运算符)来替换对“equals”方法的调用。另一优化包括“equals”为一单例相关运算符(singleton-relevant-operator)的场景,其中”==“为其单例相关运算符等效物。
[0025]本发明的一例示性实施例并不限于客户端代码,而是也可应用于库代码。关于库代码,典型缺点为源代码可能不可用。基于字节码重新写入来提出一例示性解决方案,其修改库的字节码。相等性原理(a=b)==>(a.equals(b)==true)保证了以上所列出的修改不修改程序语义(例如,只要静态分析为完好的)。
[0026]应进一步注意,也可将本文中所公开的方法提供为一服务。举例而言,在一例示性实施例中,服务提供商将来到客户端的站点,提供一高速缓存服务(例如,数据库),针对客户端的所有目标码执行以上方法以便修改目标码,且接着执行经修改的目标码。作为另一示例,客户端可将代码(例如,源代码、目标码、可执行码)发送至服务器,且服务器将针对客户端的所有代码执行本文中所描述的方法以修改代码,且接着将经修改的代码发送至客户端。客户端也可通过允许对具有客户端代码的内部系统的服务器访问而允许服务器访问客户端的代码。这些例示性技术允许客户端接收以上发明的操作益处,而不必实际上执行本文中所描述的技术。
[0027]现转向例示性实施例,图1为用于未改变对象管理的例示性方法100的流程图。当访问代码110的系统105时,方法100在区块IA中开始。代码110包括源代码115 (例如,客户端源代码115-1)或目标码120(例如,库代码120-1及/或客户端目标码120-2)中的一个或多个。典型系统将包括(例如)客户端源代码115-1及库目标码120-1。这允许编译客户端源代码HF1 (区块1E)且由此创建一“完整的”程序,例如,目标码120的系统121。然而,其他示例可能的。举例而言,方法100可仅针对库目标码120-1操作或仅针对源代码115操作(例如,在区块IE中的编译以创建目标码120之后)。在后一种情况下(其中仅针对源代码115操作),编译将不是必要的。
[0028]访问代码110的系统105的示例包括接收来自客户端的代码110(区块1B)、访问来自存储器的代码(区块1C),或访问客户端的设施(facility)中的代码(区块1D)。“客户端”包括内部客户(例如,实体的一个部分,其中该实体的另一部分执行本文中所描述的技术)或外部客户(例如,实体的一个部分针对来自另一实体的代码执行本文中所描述的技术)。可通过经由例如网络接口接收代码110来执行区块1B。应注意,区块IB可能需要将所接收到的代码放置到存储器中且在一稍后时间时访问该存储器(区块1C)。
[0029]使用静态分析,静态地执行区块1F、1G及(可选地)1J。亦即,静态分析不执行目标码120 (或目标码120的系统121),且在不执行目标码120的情况下在目标码120上操作。在区块IF中,分析目标码120的系统121以判定“目标”未改变对象的集合125。作为一例示性实施例,参看图2详细描述目标未改变对象的分析及判定。简言之,目标未改变对象是针对单例模式技术的度量符合特定阈值的未改变对象。未改变对象是在后续运行时(例如,执行)期间不改变的对象。如果对象的值(或其任何实例变量的值)改变,则对象改变。举例而言,给定复杂类型的对象(诸如,Employee (雇员)),如果实例employee_123的任一实例变量改变,例如,employee_123.1astname 自 “Doe”改变至“Smith”,则实例 employee_123将改变。静态分析可判定对象在后续运行时期间是否将改变。
[0030]在区块IG中,修改目标码120以使得目标未改变对象的集合125的成员的所有使用都实行单例模式技术。亦即,目标未改变对象的集合125的所有成员将类的实例化限制为单个对象。在区块IH中提供了区块IG的一示例,其中判定将单例相关运算符应用于单例的所有实例,且其中在每一实例中以给定单例相关运算符的单例相关运算符等效物来替换给定单例相关运算符。区块IG的另一实例示出于区块IP中,其中对于目标未改变对象的集合125的所有成员,以相关运算符的单例模式等效物来替换相关运算符的调用(例如,以==运算符的使用来替换“equals”方法)。一示例可为hashCode O方法,其可由于Java.lang.0bject (Java中的所有对象的超类)实现hashCode O的事实针对每一 Java对象被调用。如果特定类型的对象遵循单例模式,则这意味着没有两个不同对象可以真来响应equalsO。这也简化了 hashCode O的实现,因为,与必须基于每一对象的内部表示来计算昂贵的哈希相反,哈希指向对象的指针就足够了。
[0031]在区块IJ中,返回(例如,输出)经修改目标码140的经修改系统130。该输出可简单地为输出至存储器(例如,数据库)。区块IJ的示例包括通过将经修改目标码140传输至客户端(区块1K)而将经修改目标码140返回至客户端,将经修改目标码140返回至存储器(区块1L),或通过将经修改目标码140放置于客户端的设施中的适当位置处(区块1M)而将该代码返回至客户端。举例而言,对于后者而言,可自数据库访问源代码115(区块
1D)且可将经修改代码140放置回数据库中(区块1M)。
[0032]在区块IN中,例如由一运行时环境来执行经修改目标码140的经修改系统130。应注意,诸如如果方法100用以仅仅针对库目标码120-1操作,或者仅仅针对客户端目标码120-2操作且客户端目标码120-2需要库目标码120-1以操作而代码120-1不可用,则可能不执行区块IN。
[0033]现参看图2,示出了用于分析代码且判定目标未改变对象的集合125的例示性方法200的流程图。方法200为可如何执行图1的区块IF的示例。
[0034]在本发明的上下文中存在两个成本维度:存储器使用及运行时负载。如以上所描述的,关于具有一对象的几个实例且每一实例都具有相同值的一个缺点是计算机存储器被浪费。如果一 Java String对象存在三个实例,每一实例都具有例如值“No”(否),则存储器的(至少)6个字节被使用,每一字符一个字节。如果这三个对象从不改变值,则实际上仅需要具有“No”的值的一个String对象实例,从而仅需要2个字节。另外(也如以上所描述的),Object (对象)方法,例如equals O及hashCode O ,添加至在给定运行时上放置的负载。举例而言,为了针对值=“No”的两个String对象执行equalsO方法,运行时首先必须获取并比较第一字符“N”,且接着获取并比较第二字符“O”。作为替代,如果仅使用单个被高速缓存的值,则运行时仅需要执行实例的一个数值比较(==)。另一方面,高速缓存单例具有一初始成本。实际上,每当构造实现单例模式的类的新对象时,高速缓存逻辑必须观察高速缓存以了解是否已构造并高速缓存了具有等同特性的对象(例如,对于String对象而言,为具有字符的相同序列的String)。如果程序试图构造同一对象的多个实例,则该初始成本被克服。如果仅构造具有特定特性的一个实例,则不需要高速缓存且初始成本可得以节省。在区块2A中,获得单例模式技术的每一次执行的成本。在区块2B中,获得可接受的最小替换成本阈值。
[0035]区块2C涉及识别所有不可变对象且将每一不可变对象添加到unchangedObjects (未改变对象)集合210。不可变对象为在后续运行时执行期间不可改变的对象。不可变对象拥有比未改变对象更强的属性。未改变对象在特定程序的执行期间不改变。不可变对象也不改变,但此属性不依赖于特定程序;它们不改变是因为它们不可变。在构造器已完成执行之后,不可变对象的状态在其整个生命期中保持相同。本质上,不可变对象也未改变,但相反说法未必为真。
[0036]如以上所提及的,不可变对象不可改变。而这是由这些对象所属于的类所强加的属性,且因此,有可能在不必分析整个程序的情况下判定不可变对象。一种用于计算不可变对象的分析以如下方式进行(参见图7)。对于代码(例如,软件程序)的每个类而言(区块7A),该分析验证:在类的构造器已完成其执行之后,自该类的任何对象的字段可到达的任何字段都不经由直接访问(例如,a.f=x经由直接访问改变字段f)或经由间接访问(a.setF(x)为经由方法setF来修改字段f的间接方式)而被改变(区块7B)。此分析需要考虑可通过调用该类的任何方法而执行的所有可能动作(区块7C)。如果尚未考虑完所有可能动作(区块7C =否),则方法700在区块7B中继续;否则(区块7C =是),方法700在区块7D中继续。如果尚未检查完所有类(区块7D =否),则方法700在区块7A中继续;否则(区块7D =是),方法700在区块7E中结束。
[0037]返回图2,在区块2D中,识别从未改变的所有对象,且将这些对象中的每一个添加至unchangedObjects集合210。这些对象可以如下方式来识别(参见图4)。首先,构建所分析的程序的调用图及指向图(points-to graph)(图4的方法的区块4A)。调用图393为其中每一节点表示一方法且每一条边表示一方法调用的图。指向图394为其中节点表示实例抑或指针的偶图。自实例至指针的边表示该实例具有由该指针所表示的字段的事实。自指针至实例的边表示该指针可在程序执行期间指向该实例的事实。为了检测特定类型的未改变对象,该分析首先查找该类型的构造器节点(区块4B)。构造器节点为表示对构造器的调用的那些节点,在这些构造器中对象被实例化。
[0038]存在可实现的若干对象抽象(区块4C)。一例示性对象抽象包括基于对象的分配点(allocation site)来抽象化对象。换言之,如果两个对象共享同一分配点,则将该两个对象视为等效的(且因此,将该两个对象抽象化到同一静态表示)。更细粒度的抽象是可能的,由此(例如)如果两个对象不仅共享同一分配点,而且共享分配点所在的方法的调用者,则可将该两个对象视为等效的。较粗粒度的抽象也是可能的,由此(例如)如果两个对象具有同一类型,则将该两个对象视为等效的。
[0039]该分析包括接着考虑对象抽象且查找指向图中由该抽象可传递地到达的所有指针(区块4D),判定在构建已完成之后是否存在修改由该指针所指向的值的任何调用图节点(区块4E)。如果调用图节点存在(区块4F=是),则将对应于该调用图节点的对象添加至未改变对象的集合(区块4G),诸如unchangedObjects。如果不是这样(区块4F =否),则方法400在区块4D中继续。如果尚未检查完所有对象(区块4H=否),则方法400也在区块4D中继续。如果已检查了所有方法(区块4H=是),则判定是否已检查了所有抽象(区块41)。如果不是这样,则该方法在区块4C中继续;如果是这样,则该方法在区块41中结束。此时(在区块2D之后),unchangedObjects集合210应包含在目标码120的系统121的后续运行时执行期间不改变的所有对象。
[0040]另外,为了识别从未改变的所有对象,对于特定类型的未改变对象的特定类型的组合,可判定一未改变对象由该组合而产生。举例而言,两个串(该两者都是未改变对象)的串接产生一未改变对象。此方法示出于图5中。应注意,此方法可与其他方法(诸如,图4中所示出的方法)组合。
[0041]返回图2,区块2E至21将unchangedObjects集合210中的对象自所有未改变对象减少至目标未改变对象的集合125。目标未改变对象的集合125是其中针对单例模式技术的度量符合特定阈值的那些未改变对象。这防止了单例模式技术在目标码120的系统121上强加比节省大(例如,由阈值判定的)某一预定量的成本。
[0042]对于unchangedObjects中的每一对象(区块2E),判定单例模式技术针对一选定对象所产生的节省(区块2F)。区块2F可通过判定每隔多久使用该对象而完成。作为另一示例,区块2F可通过判定将equals方法或hashCodeO方法或该两者应用于此对象的次数而完成,其中可以==运算符来替换该“equals”方法。如果自在区块2F中所判定的节省减去在区块2A中所判定的成本的差大于在区块2B中所判定的阈值(区块2G =是),则方法200在区块21中继续。否则(区块2G =否),方法200在区块2H中继续,其中自unchangedObjects集合210删除该未改变对象。方法200在区块21中继续。
[0043]在区块21中,判定unchangedObjects集合210中是否无更多对象。如果在unchangedObjects集合210中存在更多对象(区块21 =否),则方法200在区块2E中继续,其中选择另一未改变对象。如果是这样(区块21 =是),则方法200在区块2J中结束。
[0044]参看图3,示出根据一例示性实施例的用于未改变对象管理的系统300的方块图。系统300包括计算机系统305,该计算机系统305包含一个或多个存储器310、一个或多个处理器320、及一个或多个网络接口 330。该一个或多个存储器310、一个或多个处理器320及一个或多个网络接口 330系经由一个或多个总线307互连。应注意,该一个或多个总线307也可为诸如无限频带(Infiniband)通信链路的通信链路。该一个或多个网络接口 330可为有线或无线网络接口。
[0045]该一个或多个存储器310包括代码350、未改变对象355、经修改代码365、指向图393及调用图394。代码350可包括源代码115、目标码120或任何其他代码。未改变对象355可包括unchangedObjects集合210中的未改变对象。亦即,未改变对象355可包括所有未改变对象(例如,在图2的区块2D之后所发现的未改变对象),及在已执行了区块2E至21之后未改变对象的通常缩减的集合。在一例示性实施例中,未改变对象355为unchangedObjects集合210。经修改代码365为在已针对代码350执行方法100及200之后出现的经修改代码。
[0046]指令370为计算机可读程序代码,当由一个或多个处理器320执行时,该计算机可读代码使得计算机系统305执行本文中所描述的动作中的一个或多个。指令370包括静态分析引擎375,其包括一未改变对象识别器380及一代码修改器385。指令370进一步包括一编译器390及一运行时环境395。
[0047]静态分析引擎375创建指向图393及调用图394。未改变对象识别器380执行(例如)区块IF及图2 (包括图4及图5)的方法200且使用一静态分析来识别未改变对象355。应注意,方法200的分析仅仅需要使用区块2C及2D来判定未改变对象,且将不执行其他区块2A、2B、2E至21。在此例示性实施例中,将不判定目标未改变对象,且未改变对象355将包括所有发现的未改变对象。
[0048]代码修改器385执行如以上参考区块1G、1H、1P及IJ描述的代码修改。应注意,此结构仅仅为例示性的。例如,未改变对象识别器380及代码修改器385可形成为单个程序,或可进一步细分。
[0049]编译器390用于将源代码115编译为目标码120。编译器390执行图1的区块1E。运行时环境395用于执行经修改目标码140的经修改系统130 (例如,图1的区块IN)。
[0050]在一实例中,代码350是经由一个或多个网络接口 330作为客户端代码335接收的,该客户端代码335可为客户端源代码115-1、客户端目标码120-2,或该两者。在图1中所描述的分析及经修改代码365的判定之后,经由一个或多个网络接口将经修改代码365作为经修改的客户端代码340而传送至客户端。
[0051]已描述了修改代码以使得目标未改变对象的集合的成员的所有使用都实行单例模式技术的几个示例,现参看图6更具体地描述另一技术。图6的许多组件先前已在上文进行了简要描述。在一例不性实施例中,方法600在将每一类与一高速缓存610相关联时开始(区块6A)。每当调用一类的构造器时,咨询对应的高速缓存610 (区块6B)。如果具有在构造器调用中所指定的特性的对象已存在于高速缓存中(区块6C =是),则不创建该对象(区块6G)。相反,返回来自高速缓存的对象(区块6H)。
[0052]如果具有在构造器调用中所指定的特性的对象尚未存在于高速缓存中(区块6C=否),则创建该对象(区块6D)、将其添加至高速缓存(区块6E)并返回(区块6F)。在区块61中,判定是否已检查了所有代码。如果不是这样(区块61 =否),则方法600在区块6B中继续。如果是这样(区块61 =是),则方法600在区块6J中结束。
[0053]所属【技术领域】的技术人员知道,本发明可以实现为系统、方法或计算机程序产品。因此,本公开可以具体实现为以下形式,即:可以是完全的硬件、也可以是完全的软件(包括固件、驻留软件、微代码等),还可以是硬件和软件结合的形式,本文一般称为“电路”、“模块”或“系统”。此外,在一些实施例中,本发明还可以实现为在一个或多个计算机可读介质中的计算机程序产品的形式,该计算机可读介质中包含计算机可读的程序代码。
[0054]可以采用一个或多个计算机可读的介质的任意组合。计算机可读介质可以是计算机可读信号介质或者计算机可读存储介质。计算机可读存储介质例如可以是一但不限于——电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。计算机可读存储介质的更具体的例子(非穷举的列表)包括:具有一个或多个导线的电连接、便携式计算机磁盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPR0M或闪存)、光纤、便携式紧凑磁盘只读存储器(CD-ROM)、光存储器件、磁存储器件、或者上述的任意合适的组合。在本文件中,计算机可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。
[0055]计算机可读的信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了计算机可读的程序代码。这种传播的数据信号可以采用多种形式,包括——但不限于——电磁信号、光信号或上述的任意合适的组合。计算机可读的信号介质还可以是计算机可读存储介质以外的任何计算机可读介质,该计算机可读介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。
[0056]计算机可读介质上包含的程序代码可以用任何适当的介质传输,包括一但不限于一无线、电线、光缆、RF等等,或者上述的任意合适的组合。
[0057]可以以一种或多种程序设计语言或其组合来编写用于执行本发明操作的计算机程序代码,所述程序设计语言包括面向对象的程序设计语言一诸如Java、Smalltalk、C++,还包括常规的过程式程序设计语言一诸如”C”语言或类似的程序设计语言。程序代码可以完全地在用户计算机上执行、部分地在用户计算机上执行、作为一个独立的软件包执行、部分在用户计算机上部分在远程计算机上执行、或者完全在远程计算机或服务器上执行。在涉及远程计算机的情形中,远程计算机可以通过任意种类的网络一包括局域网(LAN)或广域网(WAN)—连接到用户计算机,或者,可以连接到外部计算机(例如利用因特网服务提供商来通过因特网连接)。
[0058]下面将参照本发明实施例的方法、装置(系统)和计算机程序产品的流程图和/或框图描述本发明。应当理解,流程图和/或框图的每个方框以及流程图和/或框图中各方框的组合,都可以由计算机程序指令实现。这些计算机程序指令可以提供给通用计算机、专用计算机或其它可编程数据处理装置的处理器,从而生产出一种机器,这些计算机程序指令通过计算机或其它可编程数据处理装置执行,产生了实现流程图和/或框图中的方框中规定的功能/操作的装置。
[0059]也可以把这些计算机程序指令存储在能使得计算机或其它可编程数据处理装置以特定方式工作的计算机可读介质中,这样,存储在计算机可读介质中的指令就产生出一个包括实现流程图和/或框图中的方框中规定的功能/操作的指令装置(instructionmeans)的制造品(article of manufacture)0
[0060]也可以把计算机程序指令加载到计算机、其它可编程数据处理装置、或其它设备上,使得在计算机、其它可编程数据处理装置或其它设备上执行一系列操作步骤,以产生计算机实现的过程,从而使得在计算机或其它可编程装置上执行的指令能够提供实现流程图和/或框图中的方框中规定的功能/操作的过程。
[0061]本文中所使用的术语仅出于描述特定实施例的目的且并不意欲限制本发明。如在本文中所使用,除非上下文另外清楚地指示,否则单数形式“一”及“该”意欲也包括复数形式。应进一步理解,术语“包含”和/或“包括”在用于本说明书中时指定所陈述的特征、整体、步骤、操作、组件及/或组件的存在,但不排除一个或多个其他特征、整体、步骤、操作、组件、组件及/或以上各者的群组的存在或添加。
[0062]以下权利要求中的所有装置或步骤加功能组件的对应结构、材料、动作及等效物意欲包括用于结合如具体主张的其他所主张组件执行该功能的任何结构、材料或动作。已出于说明及描述目的呈现了本发明的描述,但该描述并不意欲为详尽的或将本发明限于所公开的形式。在不脱离本发明的范畴及精神的情况下,本领域的技术人员将显而易见许多修改及变化。选择并描述了实施例以便最佳地解释本发明的原理及实际应用,且使本领域的其他技术人员能够针对具有适合于所涵盖的特定用途的各种修改的各种实施例来理解本发明。
【权利要求】
1.一种方法,包括: 使用针对代码执行的静态分析,分析该代码以判定未改变对象的集合,及修改该代码以针对未改变对象的该集合的一个或多个成员实行单例模式技术;以及 输出该经修改代码。
2.如权利要求1的方法,进一步包括执行该经修改代码。
3.如权利要求1的方法,其中该代码包括库目标码,分析进一步包括分析该库目标码以判定未改变对象的集合,修改进一步包括修改该库目标码以针对未改变对象的该集合的一个或多个成员实行单例模式技术,且输出进一步包括输出该经修改的库目标码。
4.如权利要求1的方法,其中该代码包括源代码,且该方法进一步包括在分析之前将该源代码编译为目标码,且分析该代码进一步包括分析该目标码以判定未改变对象的集合,及修改该目标码以针对未改变对象的该集合的一个或多个成员实行单例模式技术。
5.如权利要求1的方法,其中修改进一步包括: 判定其中将单例相关运算符应用于单例的所有实例,及以该单例相关运算符的单例相关运算符等效物来替换每一实例中的该单例相关运算符。
6.如权利要求5的方 法,其中“equals”为一单例相关运算符,其中“==”为其单例相关运算符等效物。
7.如权利要求1的方法,其中分析进一步包括针对未改变对象的该集合中的每一未改变对象: 计算通过将该单例模式技术用于该未改变对象而获得的节省超过应用该单例模式技术的成本的量是否达到阈值,及 响应于计算通过将该单例模式技术用于该未改变对象而获得的所述节省超过应用该单例模式技术的该成本的量未达到该阈值,自未改变对象的该集合移除该未改变对象。
8.如权利要求7的方法,进一步包括通过判定每隔多久使用该对象来计算所述节省。
9.如权利要求7的方法,进一步包括通过判定每隔多久针对该对象使用“equals”方法及” hashCode”方法来计算所述节省。
10.如权利要求1的方法,其中分析进一步包括针对特定类型的未改变对象的特定类型的组合,判定一未改变对象产生自该组合。
11.如权利要求9的方法,其中串接为该特定类型的组合,且串为该特定类型的未改变对象,由此都是未改变对象的两个串的串接导致一未改变对象。
12.—种计算机程序产品,包括: 其中体现有计算机可读程序代码的计算机可读存储介质,该计算机可读程序代码包括: 用于使用针对代码执行的静态分析,分析该代码以判定未改变对象的集合,及修改该代码以针对未改变对象的该集合的一个或多个成员实行单例模式技术的计算机可读程序代码;以及 用于输出该经修改代码的计算机可读程序代码。
13.如权利要求12的计算机程序产品,进一步包括用于执行该经修改代码的计算机可读程序代码。
14.如权利要求12的计算机程序产品,其中该代码包括库目标码,分析进一步包括分析该库目标码以判定未改变对象的集合,修改进一步包括修改该库目标码以针对未改变对象的该集合的一个或多个成员实行单例模式技术,且输出进一步包括输出该经修改的库目标码。
15.如权利要求12的计算机程序产品,其中该代码包括源代码,且该计算机可读程序代码进一步包括在分析之前将该源代码编译为目标码,且分析该代码进一步包括分析该目标码以判定未改变对象的集合,及修改该目标码以针对未改变对象的该集合的一个或多个成员实行单例模式技术。
16.如权利要求12的计算机程序产品,其中修改进一步包括: 判定其中将单例相关运算符应用于单例的所有实例,及以该单例相关运算符的单例相关运算符等效物来替换每一实例中的该单例相关运算符。
17.如权利要求12的计算机程序产品,其中分析进一步包括针对未改变对象的该集合中的每一未改变对象: 计算通过将该单例模式技术用于该未改变对象而获得的节省超过应用该单例模式技术的成本的是否超过了阈值,及 响应于计算通过将该单例模式技术用于该未改变对象而获得的所述节省超过应用该单例模式技术的该成本的量未达到该阈值,自未改变对象的该集合移除该未改变对象。
18.如权利要求12的计算机程序产品,其中分析进一步包括针对特定类型的未改变对象的特定类型的组合,判定一未改变对象产生自该组合。
19.一种装置,包括: 包括计算机代码的至 少一个存储器;及 至少一个处理器, 该计算机代码控制该至少一个处理器以执行至少如下操作: 使用针对代码执行的静态分析,分析该代码以判定未改变对象的集合,及修改该代码以针对未改变对象的该集合的一个或多个成员实行单例模式技术;以及 输出该经修改代码。
20.如权利要求19的装置,其中修改进一步包括: 判定其中将单例相关运算符应用于单例的所有实例,及以该单例相关运算符的单例相关运算符等效物来替换每一实例中的该单例相关运算符。
21.如权利要求19的装置,其中分析进一步包括针对未改变对象的该集合中的每一未改变对象: 计算通过将该单例模式技术用于该未改变对象而获得的节省超过应用该单例模式技术的成本的量是否达到了阈值,及 响应于计算通过将该单例模式技术用于该未改变对象而获得的所述节省超过应用该单例模式技术的该成本的量未达到该阈值,自未改变对象的该集合移除该未改变对象。
22.如权利要求19的装置,其中,分析进一步包括针对特定类型的未改变对象的特定类型的组合,判定一未改变对象产生自该组合。
23.—种方法,包括: 访问来自客户端的代码; 响应于该代码中的任何代码为源代码,将该源代码编译为目标码,直至来自该客户端的所有代码都包括目标码为止; 使用针对该目标码执行的静态分析,分析该目标码以判定未改变对象的集合,及修改该目标码以针对未改变对象的该集合的一个或多个成员实行单例模式技术;及将该经修改目标码返回至该客户端。
24.如权利要求23的方法,其中该方法在一客户端设施处执行。
25.如权利要求23的方法,其中来自该客户端的该代码是经由一个或多个网络接口接收的,且其中该经 修改目标码经由该一个或多个网络接口而返回至该客户端。
【文档编号】G06F9/44GK103443761SQ201180048429
【公开日】2013年12月11日 申请日期:2011年10月11日 优先权日:2010年10月8日
【发明者】P·森通泽, P·K·马尔金, M·皮斯托亚 申请人:国际商业机器公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1