1、(10)申请公布号 CN 103443761 A (43)申请公布日 2013.12.11 CN 103443761 A *CN103443761A* (21)申请号 201180048429.2 (22)申请日 2011.10.11 12/900,643 2010.10.08 US G06F 9/44(2006.01) G06F 9/45(2006.01) (71)申请人 国际商业机器公司 地址 美国纽约 (72)发明人 P森通泽 PK马尔金 M皮斯托亚 (74)专利代理机构 北京市中咨律师事务所 11247 代理人 张亚非 于静 (54) 发明名称 未改变对象管理 (57) 摘要 一种方法
2、包括 : 使用针对代码执行的静态分 析, 分析该代码以判定未改变对象的集合, 及修改 该代码以针对未改变对象的该集合的一个或多个 成员实行单例模式技术。该方法也包括输出该经 修改代码。还公开了装置及程序产品。另一种方 法包括访问来自一客户端的代码 ; 及响应于该代 码中的任何代码为源代码, 将该源代码编译为目 标码, 直至来自该客户端的所有该代码都包括目 标码为止。该方法进一步包括 : 使用针对该目标 码执行的静态分析, 分析该目标码以判定未改变 对象的集合, 及修改该目标码以针对未改变对象 的该集合的一个或多个成员实行单例模式技术。 该方法另外包括将该经修改目标码返回至该客户 端。 (30)
3、优先权数据 (85)PCT申请进入国家阶段日 2013.04.07 (86)PCT申请的申请数据 PCT/US2011/055718 2011.10.11 (87)PCT申请的公布数据 WO2012/048336 EN 2012.04.12 (51)Int.Cl. 权利要求书 3 页 说明书 8 页 附图 6 页 (19)中华人民共和国国家知识产权局 (12)发明专利申请 权利要求书3页 说明书8页 附图6页 (10)申请公布号 CN 103443761 A CN 103443761 A *CN103443761A* 1/3 页 2 1. 一种方法, 包括 : 使用针对代码执行的静态分析, 分
4、析该代码以判定未改变对象的集合, 及修改该代码 以针对未改变对象的该集合的一个或多个成员实行单例模式技术 ; 以及 输出该经修改代码。 2. 如权利要求 1 的方法, 进一步包括执行该经修改代码。 3. 如权利要求 1 的方法, 其中该代码包括库目标码, 分析进一步包括分析该库目标码 以判定未改变对象的集合, 修改进一步包括修改该库目标码以针对未改变对象的该集合的 一个或多个成员实行单例模式技术, 且输出进一步包括输出该经修改的库目标码。 4. 如权利要求 1 的方法, 其中该代码包括源代码, 且该方法进一步包括在分析之前将 该源代码编译为目标码, 且分析该代码进一步包括分析该目标码以判定未改
5、变对象的集 合, 及修改该目标码以针对未改变对象的该集合的一个或多个成员实行单例模式技术。 5. 如权利要求 1 的方法, 其中修改进一步包括 : 判定其中将单例相关运算符应用于单例的所有实例, 及以该单例相关运算符的单例相 关运算符等效物来替换每一实例中的该单例相关运算符。 6. 如权利要求 5 的方法, 其中 “equals” 为一单例相关运算符, 其中 “=” 为其单例相关 运算符等效物。 7. 如权利要求 1 的方法, 其中分析进一步包括针对未改变对象的该集合中的每一未改 变对象 : 计算通过将该单例模式技术用于该未改变对象而获得的节省超过应用该单例模式技 术的成本的量是否达到阈值,
6、及 响应于计算通过将该单例模式技术用于该未改变对象而获得的所述节省超过应用该 单例模式技术的该成本的量未达到该阈值, 自未改变对象的该集合移除该未改变对象。 8. 如权利要求 7 的方法, 进一步包括通过判定每隔多久使用该对象来计算所述节省。 9. 如权利要求 7 的方法, 进一步包括通过判定每隔多久针对该对象使用 “equals” 方法 及” hashCode” 方法来计算所述节省。 10. 如权利要求 1 的方法, 其中分析进一步包括针对特定类型的未改变对象的特定类 型的组合, 判定一未改变对象产生自该组合。 11. 如权利要求 9 的方法, 其中串接为该特定类型的组合, 且串为该特定类型
7、的未改变 对象, 由此都是未改变对象的两个串的串接导致一未改变对象。 12. 一种计算机程序产品, 包括 : 其中体现有计算机可读程序代码的计算机可读存储介质, 该计算机可读程序代码包 括 : 用于使用针对代码执行的静态分析, 分析该代码以判定未改变对象的集合, 及修改该 代码以针对未改变对象的该集合的一个或多个成员实行单例模式技术的计算机可读程序 代码 ; 以及 用于输出该经修改代码的计算机可读程序代码。 13. 如权利要求 12 的计算机程序产品, 进一步包括用于执行该经修改代码的计算机可 读程序代码。 14. 如权利要求 12 的计算机程序产品, 其中该代码包括库目标码, 分析进一步包括
8、分 权 利 要 求 书 CN 103443761 A 2 2/3 页 3 析该库目标码以判定未改变对象的集合, 修改进一步包括修改该库目标码以针对未改变对 象的该集合的一个或多个成员实行单例模式技术, 且输出进一步包括输出该经修改的库目 标码。 15. 如权利要求 12 的计算机程序产品, 其中该代码包括源代码, 且该计算机可读程序 代码进一步包括在分析之前将该源代码编译为目标码, 且分析该代码进一步包括分析该目 标码以判定未改变对象的集合, 及修改该目标码以针对未改变对象的该集合的一个或多个 成员实行单例模式技术。 16. 如权利要求 12 的计算机程序产品, 其中修改进一步包括 : 判定其
9、中将单例相关运算符应用于单例的所有实例, 及以该单例相关运算符的单例相 关运算符等效物来替换每一实例中的该单例相关运算符。 17. 如权利要求 12 的计算机程序产品, 其中分析进一步包括针对未改变对象的该集合 中的每一未改变对象 : 计算通过将该单例模式技术用于该未改变对象而获得的节省超过应用该单例模式技 术的成本的是否超过了阈值, 及 响应于计算通过将该单例模式技术用于该未改变对象而获得的所述节省超过应用该 单例模式技术的该成本的量未达到该阈值, 自未改变对象的该集合移除该未改变对象。 18. 如权利要求 12 的计算机程序产品, 其中分析进一步包括针对特定类型的未改变对 象的特定类型的组
10、合, 判定一未改变对象产生自该组合。 19. 一种装置, 包括 : 包括计算机代码的至少一个存储器 ; 及 至少一个处理器, 该计算机代码控制该至少一个处理器以执行至少如下操作 : 使用针对代码执行的静态分析, 分析该代码以判定未改变对象的集合, 及修改该代码 以针对未改变对象的该集合的一个或多个成员实行单例模式技术 ; 以及 输出该经修改代码。 20. 如权利要求 19 的装置, 其中修改进一步包括 : 判定其中将单例相关运算符应用于单例的所有实例, 及以该单例相关运算符的单例相 关运算符等效物来替换每一实例中的该单例相关运算符。 21. 如权利要求 19 的装置, 其中分析进一步包括针对未
11、改变对象的该集合中的每一未 改变对象 : 计算通过将该单例模式技术用于该未改变对象而获得的节省超过应用该单例模式技 术的成本的量是否达到了阈值, 及 响应于计算通过将该单例模式技术用于该未改变对象而获得的所述节省超过应用该 单例模式技术的该成本的量未达到该阈值, 自未改变对象的该集合移除该未改变对象。 22. 如权利要求 19 的装置, 其中, 分析进一步包括针对特定类型的未改变对象的特定 类型的组合, 判定一未改变对象产生自该组合。 23. 一种方法, 包括 : 访问来自客户端的代码 ; 响应于该代码中的任何代码为源代码, 将该源代码编译为目标码, 直至来自该客户端 权 利 要 求 书 CN
12、 103443761 A 3 3/3 页 4 的所有代码都包括目标码为止 ; 使用针对该目标码执行的静态分析, 分析该目标码以判定未改变对象的集合, 及修改 该目标码以针对未改变对象的该集合的一个或多个成员实行单例模式技术 ; 及 将该经修改目标码返回至该客户端。 24. 如权利要求 23 的方法, 其中该方法在一客户端设施处执行。 25. 如权利要求 23 的方法, 其中来自该客户端的该代码是经由一个或多个网络接口接 收的, 且其中该经修改目标码经由该一个或多个网络接口而返回至该客户端。 权 利 要 求 书 CN 103443761 A 4 1/8 页 5 未改变对象管理 技术领域 0001
13、 本发明大体而言涉及对诸如目标码、 字节码、 可执行码及库的代码的分析, 且更具 体而言, 本发明涉及对代码的静态分析。 现有技术 0002 面向对象 (OO) 程序设计具有许多益处。举例而言, 通过 OO 程序设计, 程序员可定 义单一对象且然后在程序执行期间实例化该对象多次。另外, 对象也可自其他对象继承特 性。这允许在不同程序中简单地重用对象。 0003 虽然 OO 程序设计具有许多益处, 但也可对此类型的程序设计进行改良。 发明内容 0004 在本发明的一方面中, 一种方法包括 : 使用针对代码执行的静态分析 ; 分析该代 码以判定未改变对象的一集合 ; 及修改该代码以针对未改变对象的
14、该集合的一个或多个成 员实行一单例模式 (singleton-pattern) 技术。该方法也包括输出该经修改代码。还公开 了装置及程序产品。 0005 在本发明的另一例示性方面中, 公开了一种方法, 其包括 : 访问来自客户端的代 码 ; 及响应于该代码中的任何代码为源代码, 将该源代码编译为目标码直至来自该客户端 的所有该代码都包含目标码为止。 该方法进一步包括 : 使用针对该目标码执行的静态分析 ; 分析该目标码以判定未改变对象的一集合 ; 及修改该目标码以针对未改变对象的该集合的 一个或多个成员实行一单例模式技术。该方法另外包括将该经修改目标码返回至该客户 端。 附图说明 0006 图
15、 1 为用于未改变对象管理的例示性方法的流程图 ; 0007 图 2 为用于分析代码以判定目标未改变对象的集合的例示性方法的流程图 ; 0008 图 3 为根据例示性实施例的用于未改变对象管理的系统的方块图 ; 0009 图 4 为用于判定未改变对象的例示性方法的流程图 ; 0010 图 5 为用于判定未改变对象的另一例示性方法的流程图 ; 0011 图 6 为用于修改代码以使得目标未改变对象的集合的成员的所有使用都实行单 例模式技术的例示性方法的流程图 ; 及 0012 图 7 为用于判定不可变对象的例示性方法的流程图。 具体实施方式 0013 如先前所描述, 面向对象 (OO) 程序设计具
16、有许多益处。然而, OO 系统允许创建多 个对象, 即使在这些对象逻辑上表示同一实体时仍如此。存在与此方法相关联的至少三个 问题 : 说 明 书 CN 103443761 A 5 2/8 页 6 0014 1. 在 OO 系统中, 对象必须实现两个方法 : equals( 等于 ) 及 hashCode( 哈希码 )。 “equals” 方法将另一对象作为一参数 : 如果 a 及 b 逻辑上表示同一实体, 则 a.equals(b) 返回真。必须仔细实现 “equals” 方法。通常, 开发者测试两个对象的内部字段的相等性, 此暗示递归地调用 “equals” 方法直至在原始 (primiti
17、ve) 类型或串的字段上测试到相等 性为止。 “hashCode” 方法基于在其上调用该方法的对象而产生在固定范围内的一数字。 此方法对于何时将对象插入至 hashSet( 哈希集 ) 中而言非常重要。当将一对象插入至 hashSet 中时, 首先计算其 hashCode, 且接着将该对象插入至 hashSet 中对应于该对象的 hashCode的桶(bucket)中。 在插入对象之前, 该桶经扫描以验证先前未插入另一相等的对 象。以此方式, 遵照 “集合” 的数学定义, 该集合将不具有重复项。然而, 如果没有一贯地实 现 “hashCode” 及 “equals” , 则错误 ( 称为 “缺
18、陷 (bug)” ) 可能发生。举例而言, 如果两个 相等对象可最后具有不同 hashCode, 则它们将被插入于同一 hashSet 的不同桶中, 从而引 起集合中的重复项。此类型的缺陷的后果可非常严重。 0015 2.此设计的另一限制为该设计可占用大量存储器。 逻辑上等效的对象可在同一系 统中实例化多次的事实可引起不必要的存储器消耗。理想地, 如果已实例化了逻辑上等效 的对象 (“equals” 方法返回真 ), 则不应再实例化对象。 0016 3. 最后, 此方法的另一限制为在每次执行 “equals” 方法时所消耗的时间。如以 上所提及的,“equals” 方法必须被实现以测试对象的所
19、有内部字段的相等性, 且此过程触 发一级联 (cascading) 测试, 在该级联测试中, 针对相等性递归地测试该等字段中的所有 字段。 如果有可能每当逻辑上等效于原始对象的另一对象已存在于存储器中时防止建立对 象, 则将不必要执行这种昂贵的相等性测试, 且测试指针相等性 ( 例如, 使用 = 运算符 ) 将 是足够的。 0017 针对这些问题的解决方案是特设的 (ad-hoc) 。开发者必须实现一高速缓存机制, 检查高速缓存中的现有对象且只要有可能即返回这些对象而非建立新对象。此外, 这些解 决方案无法应用于库代码, 其中已实现了类而没有这种高速缓存机制, 且类的原代码甚至 可能不可用。
20、0018 本文中提出了用以解决至少以上所描述的三个问题的例示性技术。静态分析可 静态地 ( 亦即, 不执行代码 ) 检测代码中的对象的相等性。如果将两个对象视为相等的, 则静态分析可指示该两个对象实际上应为同一对象。另外, 静态分析可指导字节码重写器 (bytecode rewriter) 的工作以修改源代码不再可用的链接库代码。 0019 在一例示性实施例中, 由静态分析所推荐的修改如下, 其中所述修改修改代码以 使得目标未修改对象的集合的成员的所有使用都实行单例模式技术 : 0020 1. 每个类具有一相关联的高速缓存。 0021 2. 每当调用类的构造器时, 则咨询对应的高速缓存。 00
21、22 3. 如果具有在构造器调用中所指定的特性的对象已存在于高速缓存中, 则不创建 该对象。相反, 返回来自高速缓存的该对象。 0023 4. 如果具有在构造器调用中所指定的特性的对象尚未存在于高速缓存中, 则创建 该对象、 将该对象添加至高速缓存并返回该对象。 0024 作为进一步的优化, 可仅在静态地检测到两个或两个以上相等对象时应用以上修 改。进一步的修改包括对于已为其创建了高速缓存的类而言, 可以用 = 运算符 ( 即, 具有 说 明 书 CN 103443761 A 6 3/8 页 7 在一列中的两个等号的运算符 ) 来替换对 “equals” 方法的调用。另一优化包括 “equal
22、s” 为一单例相关运算符 (singleton-relevant-operator) 的场景, 其中” =“为其单例相关运 算符等效物。 0025 本发明的一例示性实施例并不限于客户端代码, 而是也可应用于库代码。关于库 代码, 典型缺点为源代码可能不可用。 基于字节码重新写入来提出一例示性解决方案, 其修 改库的字节码。相等性原理 (a=b)=(a.equals(b)=true) 保证了以上所列出的修改不修 改程序语义 ( 例如, 只要静态分析为完好的 )。 0026 应进一步注意, 也可将本文中所公开的方法提供为一服务。 举例而言, 在一例示性 实施例中, 服务提供商将来到客户端的站点,
23、提供一高速缓存服务 ( 例如, 数据库 ), 针对客 户端的所有目标码执行以上方法以便修改目标码, 且接着执行经修改的目标码。作为另一 示例, 客户端可将代码 ( 例如, 源代码、 目标码、 可执行码 ) 发送至服务器, 且服务器将针对 客户端的所有代码执行本文中所描述的方法以修改代码, 且接着将经修改的代码发送至客 户端。 客户端也可通过允许对具有客户端代码的内部系统的服务器访问而允许服务器访问 客户端的代码。这些例示性技术允许客户端接收以上发明的操作益处, 而不必实际上执行 本文中所描述的技术。 0027 现转向例示性实施例, 图 1 为用于未改变对象管理的例示性方法 100 的流程图。
24、当访问代码 110 的系统 105 时, 方法 100 在区块 1A 中开始。代码 110 包括源代码 115( 例 如, 客户端源代码 115-1) 或目标码 120( 例如, 库代码 120-1 及 / 或客户端目标码 120-2) 中的一个或多个。典型系统将包括 ( 例如 ) 客户端源代码 115-1 及库目标码 120-1。这允 许编译客户端源代码 115-1( 区块 1E) 且由此创建一 “完整的” 程序, 例如, 目标码 120 的系 统 121。然而, 其他示例可能的。举例而言, 方法 100 可仅针对库目标码 120-1 操作或仅针 对源代码 115 操作 ( 例如, 在区块
25、1E 中的编译以创建目标码 120 之后 )。在后一种情况下 ( 其中仅针对源代码 115 操作 ), 编译将不是必要的。 0028 访问代码 110 的系统 105 的示例包括接收来自客户端的代码 110( 区块 1B)、 访问 来自存储器的代码 ( 区块 1C), 或访问客户端的设施 (facility) 中的代码 ( 区块 1D)。 “客 户端” 包括内部客户 ( 例如, 实体的一个部分, 其中该实体的另一部分执行本文中所描述的 技术 ) 或外部客户 ( 例如, 实体的一个部分针对来自另一实体的代码执行本文中所描述的 技术 )。可通过经由例如网络接口接收代码 110 来执行区块 1B。应
26、注意, 区块 1B 可能需要 将所接收到的代码放置到存储器中且在一稍后时间时访问该存储器 ( 区块 1C)。 0029 使用静态分析, 静态地执行区块1F、 1G及(可选地)1J。 亦即, 静态分析不执行目标 码 120( 或目标码 120 的系统 121), 且在不执行目标码 120 的情况下在目标码 120 上操作。 在区块1F中, 分析目标码120的系统121以判定 “目标” 未改变对象的集合125。 作为一例示 性实施例, 参看图 2 详细描述目标未改变对象的分析及判定。简言之, 目标未改变对象是针 对单例模式技术的度量符合特定阈值的未改变对象。未改变对象是在后续运行时 ( 例如, 执
27、行)期间不改变的对象。 如果对象的值(或其任何实例变量的值)改变, 则对象改变。 举 例而言, 给定复杂类型的对象 ( 诸如, Employee( 雇员 ), 如果实例 employee_123 的任一实 例变量改变, 例如, employee_123.1astname 自 “Doe” 改变至 “Smith” , 则实例 employee_123 将改变。静态分析可判定对象在后续运行时期间是否将改变。 0030 在区块 1G 中, 修改目标码 120 以使得目标未改变对象的集合 125 的成员的所有 说 明 书 CN 103443761 A 7 4/8 页 8 使用都实行单例模式技术。亦即,
28、目标未改变对象的集合 125 的所有成员将类的实例化限 制为单个对象。在区块 1H 中提供了区块 1G 的一示例, 其中判定将单例相关运算符应用于 单例的所有实例, 且其中在每一实例中以给定单例相关运算符的单例相关运算符等效物来 替换给定单例相关运算符。区块 1G 的另一实例示出于区块 1P 中, 其中对于目标未改变对 象的集合 125 的所有成员, 以相关运算符的单例模式等效物来替换相关运算符的调用 ( 例 如, 以 = 运算符的使用来替换 “equals” 方法 )。一示例可为 hashCode() 方法, 其可由于 Java.lang.Object(Java 中的所有对象的超类 ) 实现
29、 hashCode() 的事实针对每一 Java 对 象被调用。如果特定类型的对象遵循单例模式, 则这意味着没有两个不同对象可以真来响 应 equals()。这也简化了 hashCode() 的实现, 因为, 与必须基于每一对象的内部表示来计 算昂贵的哈希相反, 哈希指向对象的指针就足够了。 0031 在区块 1J 中, 返回 ( 例如, 输出 ) 经修改目标码 140 的经修改系统 130。该输出可 简单地为输出至存储器 ( 例如, 数据库 )。区块 1J 的示例包括通过将经修改目标码 140 传 输至客户端 ( 区块 1K) 而将经修改目标码 140 返回至客户端, 将经修改目标码 140
30、 返回至 存储器(区块1L), 或通过将经修改目标码140放置于客户端的设施中的适当位置处(区块 1M)而将该代码返回至客户端。 举例而言, 对于后者而言, 可自数据库访问源代码115(区块 1D) 且可将经修改代码 140 放置回数据库中 ( 区块 1M)。 0032 在区块 1N 中, 例如由一运行时环境来执行经修改目标码 140 的经修改系统 130。 应注意, 诸如如果方法100用以仅仅针对库目标码120-1操作, 或者仅仅针对客户端目标码 120-2操作且客户端目标码120-2需要库目标码120-1以操作而代码120-1不可用, 则可能 不执行区块 1N。 0033 现参看图 2,
31、示出了用于分析代码且判定目标未改变对象的集合 125 的例示性方 法 200 的流程图。方法 200 为可如何执行图 1 的区块 1F 的示例。 0034 在本发明的上下文中存在两个成本维度 : 存储器使用及运行时负载。如以上所描 述的, 关于具有一对象的几个实例且每一实例都具有相同值的一个缺点是计算机存储器被 浪费。如果一 Java String 对象存在三个实例, 每一实例都具有例如值 “No” ( 否 ), 则存储 器的 ( 至少 )6 个字节被使用, 每一字符一个字节。如果这三个对象从不改变值, 则实际上 仅需要具有 “No” 的值的一个 String 对象实例, 从而仅需要 2 个字
32、节。另外 ( 也如以上所 描述的 ), Object( 对象 ) 方法, 例如 equals() 及 hashCode(), 添加至在给定运行时上放置 的负载。举例而言, 为了针对值 “No” 的两个 String 对象执行 equals() 方法, 运行时首 先必须获取并比较第一字符 “N” , 且接着获取并比较第二字符 “o” 。作为替代, 如果仅使用 单个被高速缓存的值, 则运行时仅需要执行实例的一个数值比较(=)。 另一方面, 高速缓存 单例具有一初始成本。 实际上, 每当构造实现单例模式的类的新对象时, 高速缓存逻辑必须 观察高速缓存以了解是否已构造并高速缓存了具有等同特性的对象(例
33、如, 对于String对 象而言, 为具有字符的相同序列的 String)。如果程序试图构造同一对象的多个实例, 则该 初始成本被克服。如果仅构造具有特定特性的一个实例, 则不需要高速缓存且初始成本可 得以节省。在区块 2A 中, 获得单例模式技术的每一次执行的成本。在区块 2B 中, 获得可接 受的最小替换成本阈值。 0035 区 块 2C 涉 及 识 别 所 有 不 可 变 对 象 且 将 每 一 不 可 变 对 象 添 加 到 unchangedObjects(未改变对象)集合210。 不可变对象为在后续运行时执行期间不可改变 说 明 书 CN 103443761 A 8 5/8 页 9
34、 的对象。不可变对象拥有比未改变对象更强的属性。未改变对象在特定程序的执行期间不 改变。不可变对象也不改变, 但此属性不依赖于特定程序 ; 它们不改变是因为它们不可变。 在构造器已完成执行之后, 不可变对象的状态在其整个生命期中保持相同。 本质上, 不可变 对象也未改变, 但相反说法未必为真。 0036 如以上所提及的, 不可变对象不可改变。而这是由这些对象所属于的类所强加的 属性, 且因此, 有可能在不必分析整个程序的情况下判定不可变对象。一种用于计算不可 变对象的分析以如下方式进行 ( 参见图 7)。对于代码 ( 例如, 软件程序 ) 的每个类而言 ( 区块 7A), 该分析验证 : 在类
35、的构造器已完成其执行之后, 自该类的任何对象的字段可到 达的任何字段都不经由直接访问 ( 例如, a.f=x 经由直接访问改变字段 f) 或经由间接访问 (a.setF(x) 为经由方法 setF 来修改字段 f 的间接方式 ) 而被改变 ( 区块 7B)。此分析需 要考虑可通过调用该类的任何方法而执行的所有可能动作 ( 区块 7C)。如果尚未考虑完所 有可能动作 ( 区块 7C 否 ), 则方法 700 在区块 7B 中继续 ; 否则 ( 区块 7C 是 ), 方法 700 在区块 7D 中继续。如果尚未检查完所有类 ( 区块 7D 否 ), 则方法 700 在区块 7A 中继续 ; 否则
36、( 区块 7D 是 ), 方法 700 在区块 7E 中结束。 0037 返回图 2, 在区块 2D 中, 识别从未改变的所有对象, 且将这些对象中的每一个添加 至 unchangedObjects 集合 210。这些对象可以如下方式来识别 ( 参见图 4)。首先, 构建所 分析的程序的调用图及指向图 (points-to graph) ( 图 4 的方法的区块 4A)。调用图 393 为 其中每一节点表示一方法且每一条边表示一方法调用的图。指向图 394 为其中节点表示实 例抑或指针的偶图。自实例至指针的边表示该实例具有由该指针所表示的字段的事实。自 指针至实例的边表示该指针可在程序执行期间
37、指向该实例的事实。 为了检测特定类型的未 改变对象, 该分析首先查找该类型的构造器节点(区块4B)。 构造器节点为表示对构造器的 调用的那些节点, 在这些构造器中对象被实例化。 0038 存在可实现的若干对象抽象 ( 区块 4C)。一例示性对象抽象包括基于对象的分配 点 (allocation site) 来抽象化对象。换言之, 如果两个对象共享同一分配点, 则将该两个 对象视为等效的 ( 且因此, 将该两个对象抽象化到同一静态表示 )。更细粒度的抽象是可 能的, 由此(例如)如果两个对象不仅共享同一分配点, 而且共享分配点所在的方法的调用 者, 则可将该两个对象视为等效的。较粗粒度的抽象也是
38、可能的, 由此 ( 例如 ) 如果两个对 象具有同一类型, 则将该两个对象视为等效的。 0039 该分析包括接着考虑对象抽象且查找指向图中由该抽象可传递地到达的所有指 针 ( 区块 4D), 判定在构建已完成之后是否存在修改由该指针所指向的值的任何调用图节 点 ( 区块 4E)。如果调用图节点存在 ( 区块 4F 是 ), 则将对应于该调用图节点的对象添 加至未改变对象的集合 ( 区块 4G), 诸如 unchangedObjects。如果不是这样 ( 区块 4F 否 ), 则方法 400 在区块 4D 中继续。如果尚未检查完所有对象 ( 区块 4H 否 ), 则方法 400 也在区块 4D
39、中继续。如果已检查了所有方法 ( 区块 4H 是 ), 则判定是否已检查了所有抽 象 ( 区块 4I)。如果不是这样, 则该方法在区块 4C 中继续 ; 如果是这样, 则该方法在区块 4I 中结束。此时 ( 在区块 2D 之后 ), unchangedObjects 集合 210 应包含在目标码 120 的系统 121 的后续运行时执行期间不改变的所有对象。 0040 另外, 为了识别从未改变的所有对象, 对于特定类型的未改变对象的特定类型的 组合, 可判定一未改变对象由该组合而产生。举例而言, 两个串 ( 该两者都是未改变对象 ) 说 明 书 CN 103443761 A 9 6/8 页 1
40、0 的串接产生一未改变对象。此方法示出于图 5 中。应注意, 此方法可与其他方法 ( 诸如, 图 4 中所示出的方法 ) 组合。 0041 返回图 2, 区块 2E 至 2I 将 unchangedObjects 集合 210 中的对象自所有未改变对 象减少至目标未改变对象的集合 125。目标未改变对象的集合 125 是其中针对单例模式技 术的度量符合特定阈值的那些未改变对象。这防止了单例模式技术在目标码 120 的系统 121 上强加比节省大 ( 例如, 由阈值判定的 ) 某一预定量的成本。 0042 对于 unchangedObjects 中的每一对象 ( 区块 2E), 判定单例模式技术
41、针对一选定 对象所产生的节省 ( 区块 2F)。区块 2F 可通过判定每隔多久使用该对象而完成。作为另 一示例, 区块 2F 可通过判定将 equals 方法或 hashCode() 方法或该两者应用于此对象的 次数而完成, 其中可以 = 运算符来替换该 “equals” 方法。如果自在区块 2F 中所判定的 节省减去在区块 2A 中所判定的成本的差大于在区块 2B 中所判定的阈值 ( 区块 2G 是 ), 则方法 200 在区块 2I 中继续。否则 ( 区块 2G 否 ), 方法 200 在区块 2H 中继续, 其中自 unchangedObjects 集合 210 删除该未改变对象。方法
42、200 在区块 2I 中继续。 0043 在区块 2I 中, 判定 unchangedObjects 集合 210 中是否无更多对象。如果在 unchangedObjects 集合 210 中存在更多对象 ( 区块 2I 否 ), 则方法 200 在区块 2E 中继 续, 其中选择另一未改变对象。如果是这样 ( 区块 2I 是 ), 则方法 200 在区块 2J 中结束。 0044 参看图 3, 示出根据一例示性实施例的用于未改变对象管理的系统 300 的方块图。 系统 300 包括计算机系统 305, 该计算机系统 305 包含一个或多个存储器 310、 一个或多个 处理器 320、 及一个
43、或多个网络接口 330。该一个或多个存储器 310、 一个或多个处理器 320 及一个或多个网络接口 330 系经由一个或多个总线 307 互连。应注意, 该一个或多个总线 307 也可为诸如无限频带 (Infiniband) 通信链路的通信链路。该一个或多个网络接口 330 可为有线或无线网络接口。 0045 该一个或多个存储器 310 包括代码 350、 未改变对象 355、 经修改代码 365、 指向图 393 及调用图 394。代码 350 可包括源代码 115、 目标码 120 或任何其他代码。未改变对 象 355 可包括 unchangedObjects 集合 210 中的未改变对
44、象。亦即, 未改变对象 355 可包 括所有未改变对象 ( 例如, 在图 2 的区块 2D 之后所发现的未改变对象 ), 及在已执行了区 块 2E 至 2I 之后未改变对象的通常缩减的集合。在一例示性实施例中, 未改变对象 355 为 unchangedObjects 集合 210。经修改代码 365 为在已针对代码 350 执行方法 100 及 200 之 后出现的经修改代码。 0046 指令370为计算机可读程序代码, 当由一个或多个处理器320执行时, 该计算机可 读代码使得计算机系统 305 执行本文中所描述的动作中的一个或多个。指令 370 包括静态 分析引擎 375, 其包括一未改
45、变对象识别器 380 及一代码修改器 385。指令 370 进一步包括 一编译器 390 及一运行时环境 395。 0047 静态分析引擎 375 创建指向图 393 及调用图 394。未改变对象识别器 380 执行 ( 例如 ) 区块 1F 及图 2( 包括图 4 及图 5) 的方法 200 且使用一静态分析来识别未改变对象 355。应注意, 方法 200 的分析仅仅需要使用区块 2C 及 2D 来判定未改变对象, 且将不执行 其他区块 2A、 2B、 2E 至 2I。在此例示性实施例中, 将不判定目标未改变对象, 且未改变对象 355 将包括所有发现的未改变对象。 0048 代码修改器 3
46、85 执行如以上参考区块 1G、 1H、 1P 及 1J 描述的代码修改。应注意, 说 明 书 CN 103443761 A 10 7/8 页 11 此结构仅仅为例示性的。例如, 未改变对象识别器 380 及代码修改器 385 可形成为单个程 序, 或可进一步细分。 0049 编译器390用于将源代码115编译为目标码120。 编译器390执行图1的区块1E。 运行时环境 395 用于执行经修改目标码 140 的经修改系统 130( 例如, 图 1 的区块 1N)。 0050 在一实例中, 代码 350 是经由一个或多个网络接口 330 作为客户端代码 335 接收 的, 该客户端代码 335
47、 可为客户端源代码 115-1、 客户端目标码 120-2, 或该两者。在图 1 中 所描述的分析及经修改代码 365 的判定之后, 经由一个或多个网络接口将经修改代码 365 作为经修改的客户端代码 340 而传送至客户端。 0051 已描述了修改代码以使得目标未改变对象的集合的成员的所有使用都实行单例 模式技术的几个示例, 现参看图 6 更具体地描述另一技术。图 6 的许多组件先前已在上文 进行了简要描述。在一例示性实施例中, 方法 600 在将每一类与一高速缓存 610 相关联时 开始 ( 区块 6A)。每当调用一类的构造器时, 咨询对应的高速缓存 610( 区块 6B)。如果具 有在构
48、造器调用中所指定的特性的对象已存在于高速缓存中 ( 区块 6C 是 ), 则不创建该 对象 ( 区块 6G)。相反, 返回来自高速缓存的对象 ( 区块 6H)。 0052 如果具有在构造器调用中所指定的特性的对象尚未存在于高速缓存中 ( 区块 6C 否 ), 则创建该对象 ( 区块 6D)、 将其添加至高速缓存 ( 区块 6E) 并返回 ( 区块 6F)。在区 块 61 中, 判定是否已检查了所有代码。如果不是这样 ( 区块 6I 否 ), 则方法 600 在区块 6B 中继续。如果是这样 ( 区块 6I 是 ), 则方法 600 在区块 6J 中结束。 0053 所属技术领域的技术人员知道,
49、 本发明可以实现为系统、 方法或计算机程序产品。 因此, 本公开可以具体实现为以下形式, 即 : 可以是完全的硬件、 也可以是完全的软件 (包括 固件、 驻留软件、 微代码等) , 还可以是硬件和软件结合的形式, 本文一般称为 “电路” 、“模 块” 或 “系统” 。此外, 在一些实施例中, 本发明还可以实现为在一个或多个计算机可读介质 中的计算机程序产品的形式, 该计算机可读介质中包含计算机可读的程序代码。 0054 可以采用一个或多个计算机可读的介质的任意组合。计算机可读介质可以是计 算机可读信号介质或者计算机可读存储介质。 计算机可读存储介质例如可以是但不限 于电、 磁、 光、 电磁、 红外线、 或半导体的系统、 装置或器件, 或者任意以上的组合。计算 机可读存储介质的更具体的例子 (非穷举的列表) 包括 : 具有一个或多个导线的电连接、 便 携式计算机磁盘、 硬盘、 随机存取存储器 (RAM) 、 只读存储器 (ROM)、 可擦式可编程只读存储 器(EPROM或闪存)、 光纤、 便携式紧凑磁
copyright@ 2017-2020 zhuanlichaxun.net网站版权所有
经营许可证编号:粤ICP备2021068784号-1