首页 / 专利库 / 人工智能 / 源语言 / 用于异构编程数据处理系统的自动化依赖性分析器

用于异构编程数据处理系统的自动化依赖性分析器

阅读:452发布:2020-05-08

专利汇可以提供用于异构编程数据处理系统的自动化依赖性分析器专利检索,专利查询,专利分析的服务。并且一种用于 数据处理 系统的依赖性分析器,该 数据处理系统 包括被配置用于生成变量间的依赖性信息的至少一个计算机 硬件 处理器,该依赖性信息可出现在用不同 源语言 编写的多个程序中的任何一个中。该数据处理系统可以解析每个程序,而不管编写该模 块 所用的是什么语言。关于每个程序的解析信息可以被记录在第一类型的数据结构中,并且然后可以被转换成表示变量间的依赖性的格式。针对该多个程序中的每一个程序的依赖性信息可以被表达为可以被一起处理的语言无关的构造的组合,以生成该数据处理系统的依赖性信息。该依赖性信息可以被记录在依赖性数据结构中,并且进一步用于比如数据 质量 检查和更改对数据处理程序的控制等操作。,下面是用于异构编程数据处理系统的自动化依赖性分析器专利的具体信息内容。

1.一种用于与数据处理系统一起使用的依赖性分析器,该数据处理系统被配置用于执行访问包括字段的多个记录的、采用多种计算机编程语言中的任何一种的程序,该依赖性分析器被配置用于对采用该多种计算机编程语言的程序进行依赖性分析,该依赖性分析包括计算与采用该多种计算机编程语言的程序之间的字段级沿袭有关的依赖性信息,该依赖性分析器包括:
前端,该前端被配置用于处理控制该数据处理系统的多个程序,其中,该多个程序用该多种编程语言中的多种编程语言编写,并且其中,该前端包括多个前端模,每个前端模块被配置用于接收该多个程序中的用该多种编程语言中的一种编程语言编写的一个计算机程序作为输入,并输出表示对在该程序内创建的该多个记录的字段的依赖性的语言无关的数据结构,其中,所述语言无关的数据结构由一个或多个依赖性构造组成,其中,每个依赖性构造包括至少一个字段的指示以及与该至少一个字段相关的依赖性;
以及
后端,该后端被配置用于从该多个前端模块接收语言无关的数据结构,并输出该数据处理系统的表示在该多个程序内创建的依赖性的依赖性信息,其中,该依赖性信息包括在该多个程序中的多个程序中引入的字段级依赖性,使得该依赖性信息包括该多个程序之间的字段级沿袭。
2.如权利要求1所述的依赖性分析器,其中:
该前端模块被配置用于通过解析输入程序以产生解析树,并通过表示该解析树内的利用来自依赖性构造集中的构造来创建依赖性的操作以降低该解析树,而生成语言无关的数据结构。
3.如权利要求2所述的依赖性分析器,其中:
该依赖性信息表示数据流依赖性。
4.如权利要求2所述的依赖性分析器,其中:
该依赖性信息表示控制流依赖性。
5.如权利要求1所述的依赖性分析器,进一步包括:
第一工具,该第一工具被配置用于将该依赖性信息加载到元数据存储库中;以及第二工具,该第二工具被配置用于接收由该数据处理系统使用的字段的指示作为输入、访问该元数据存储库、并输出该多个程序中引入影响所指示字段的依赖性的程序的指示。
6.如权利要求1所述的依赖性分析器,其中:
该数据处理系统进一步包括多个数据源;
该多个程序被配置用于对该多个数据源中的数据执行变换;并且
该多个数据源是异构的。
7.如权利要求6所述的依赖性分析器,其中:
该多个数据源包括是以下各项中的至少一项的数据源:ORACLE数据库、或SAP数据库、或存储在HADOOP分布式文件系统中的数据集。
8.一种用于与数据处理系统一起使用的依赖性分析器,该数据处理系统包括:
至少一个计算机硬件处理器;
存储处理器可执行指令的至少一个非暂态计算机可读存储介质,这些指令在由该至少一个计算机硬件处理器执行时,使该至少一个计算机硬件处理器执行以下操作:
针对被配置用于由该数据处理系统执行的多个程序中的每一个,基于解析该程序来构造第一数据结构,其中,该第一数据结构反映该程序中的操作;
针对多个该第一数据结构中的每一个:
选择在该第一数据结构中反映的、影响对一个或多个数据元素的依赖性的操作,使得不影响依赖性的操作不被选择;以及
针对每个所选操作,通过记录来自依赖性构造集中的依赖性构造来将所选操作的指示记录在第二数据结构中,其中,针对该多个程序中的每一个程序的该依赖性构造集与编写该程序所用的语言无关;
处理该多个第二数据结构,其中,该处理包括识别对数据元素的控制流依赖性或数据流依赖性,所述依赖性是在执行该多个程序中的任何一个时可能出现的那些依赖性;以及将识别出的依赖性记录在该依赖性数据结构中,其中,该依赖性数据结构包括指示该多个程序中的数据元素的数据并被结构化以指示这些数据元素之间的依赖性。
9.如权利要求8所述的依赖性分析器,其中:
这些依赖性包括控制流依赖性和数据流依赖性。
10.如权利要求8所述的依赖性分析器,其中:
这些依赖性包括数据流依赖性。
11.如权利要求8所述的依赖性分析器,其中:
该数据处理系统包括多个语言相关的解析器,并且
构造该第一数据结构包括:针对该多个程序中的每一个程序,基于编写该程序所用的语言来选择语言相关的解析器。
12.如权利要求11所述的依赖性分析器,其中:
该多个程序是用多种源语言编写的。
13.如权利要求12所述的依赖性分析器,其中:
这些源语言包括SQL。
14.如权利要求12所述的依赖性分析器,其中:
这些源语言包括表达数据流图的图形化编程语言。
15.如权利要求12所述的依赖性分析器,其中:
这些源语言包括SQL和表达数据流图的图形化编程语言。
16.如权利要求11所述的依赖性分析器,其中:
该数据处理系统包括多个语言相关的工具,用于从这些第一数据结构中提取影响控制流依赖性或数据流依赖性的操作的指示,并且
该从第一数据结构中的提取包括:针对该多个第一数据结构中的每一个,选择语言相关的工具,以用于基于编写被解析以构造该第一数据结构的程序所用的语言来提取影响控制流依赖性或数据流依赖性的操作的指示。
17.如权利要求8所述的依赖性分析器,其中:
针对所构造的该多个第一数据结构中的每一个,将所选操作的指示记录在该第二数据结构中包括记录来自构造集中的构造。
18.如权利要求17所述的依赖性分析器,其中:
该构造集包括表示以下各项的构造中的两个或更多个构造:赋值、过程定义、过程返回、过程调用点、采用“if…else”格式的条件控制流、和采用“while…do”格式的条件控制流。
19.如权利要求17所述的依赖性分析器,其中:
该构造集基本上由表示以下各项的构造组成:赋值、过程定义、过程返回、过程调用点、采用“if…else”格式的条件控制流、和采用“while…do”格式的条件控制流。
20.如权利要求9所述的依赖性分析器,进一步包括:
至少一个工具,该至少一个工具访问该依赖性数据结构,并通过用户界面呈现关于依赖于数据元素的数据实体或代码块的信息。
21.如权利要求9所述的依赖性分析器,其中:
该数据处理系统进一步包括多个数据源;
该多个程序被配置用于对该多个数据源中的数据执行变换;并且
该多个数据源是异构的。
22.如权利要求21所述的依赖性分析器,其中:
该多个数据源包括是以下各项中的至少一项的数据源:ORACLE数据库、或SAP数据库、或存储在HADOOP分布式文件系统中的数据集。
23.一种对被配置成与数据处理系统一起使用的依赖性分析器进行操作的方法,该方法包括:
使用至少一个计算机硬件处理器来针对被配置成在该数据处理系统内执行并以编程语言指定数据处理操作的多个程序进行执行,其中,该多个程序使用多种编程语言;
通过解析该多个程序为这些程序构造相应的第一数据结构;
针对多个该第一数据结构中的每一个,
选择在该第一数据结构中反映的、影响对一个或多个数据元素的依赖性的操作;以及针对每个所选操作,将该所选操作的指示记录在第二数据结构中,其中,使用所有这些第二数据结构共用的依赖性构造集将这些指示记录在该第二数据结构中;
处理这些第二数据结构,其中,该处理包括识别在执行该多个程序中的任何一个时可能出现的对数据元素的控制流依赖性或数据流依赖性;以及
将识别出的依赖性记录在依赖性数据结构中。
24.如权利要求23所述的方法,其中:
这些依赖性是数据流依赖性。
25.如权利要求23所述的方法,其中:
这些依赖性包括控制流依赖性和数据流依赖性。
26.如权利要求23所述的方法,其中:
为该多个程序构造相应的第一数据结构包括基于编写该多个程序所用的语言选择用于该多个程序的解析器。
27.如权利要求23所述的方法,其中:
该多个程序是用多种源语言编写的,包括SQL和表达数据流图的图形化编程语言;并且选择解析器包括针对该多种源语言中的每一种选择一个解析器。
28.如权利要求27所述的方法,其中:
记录在这些第二数据结构中包括根据针对用该多种源语言中的每一种编写的程序的依赖性构造集来构造第二数据结构。
29.如权利要求23所述的方法,其中:
这些第一数据结构是语言相关的;并且
这些第二数据结构是语言无关的。
30.如权利要求23所述的方法,其中:
将这些所选操作的指示记录在该第二数据结构中包括从该第一数据结构中提取影响控制流依赖性或数据流依赖性的操作的指示,使得从该第二数据结构中省略关于该第一数据结构中的、不影响控制流依赖性或数据流依赖性的操作的信息。
31.如权利要求30所述的方法,其中:
该数据处理系统包括多个语言相关的工具,用于从这些第一数据结构中提取影响控制流依赖性或数据流依赖性的操作的指示,并且
提取这些第一数据结构中影响控制流依赖性或数据流依赖性的操作的指示包括:针对该多个第一数据结构中的每一个,选择语言相关的工具,以用于基于编写被解析以构造该第一数据结构的程序所用的语言来提取影响控制流依赖性或数据流依赖性的操作的指示。
32.如权利要求23所述的方法,其中:
该依赖性构造集包括表示以下各项的构造中的两个或更多个构造:赋值、过程定义、过程返回、过程调用点、采用“if…else”格式的条件控制流、和采用“while…do”格式的条件控制流。
33.一种对结合数据处理系统一起使用的依赖性分析器进行操作的方法,该方法包括:
使用至少一个计算机硬件处理器来针对以编程语言指定在该数据处理系统内执行的数据处理操作的多个程序进行执行,其中,该多个程序使用多种编程语言;
通过解析该多个程序为这些程序构造相应的第一数据结构;
针对多个该第一数据结构中的每一个,选择在该第一数据结构中反映的、影响对一个或多个数据元素的控制流依赖性的操作;以及
针对每个所选操作,将该所选操作的指示记录在第二数据结构中,其中,使用所有这些第二数据结构共用的依赖性构造集将这些指示记录在该第二数据结构中;
处理这些第二数据结构,其中,该处理包括识别由于该多个程序中的任何一个中的处理所导致的对数据元素的依赖性;以及
将识别出的依赖性记录在依赖性数据结构中。
34.如权利要求33所述的方法,其中:
该依赖性构造集包括采用“if…else”格式的条件控制流。
35.如权利要求33所述的方法,其中:
该依赖性构造集包括采用“while…do”格式的条件控制流。
36.如权利要求33所述的方法,进一步包括:
针对所构造的多个第一数据结构中的每一个,将该第一数据结构中的创建数据流依赖性的操作的指示选择性地记录在该第二数据结构中,其中,使用所有这些第二数据结构共用的依赖性构造集将这些指示记录在该第二数据结构中。
37.至少一种非暂态计算机可读存储介质,该至少一种非暂态计算机可读存储介质存储处理器可执行指令,这些指令在由至少一个计算机硬件处理器执行时,使该至少一个计算机硬件处理器执行用于以相应的编程语言指定数据处理操作的多个程序的方法,其中,该多个程序使用多种编程语言,该方法包括:
通过解析该多个程序为这些程序构造相应的第一数据结构;
针对所构造的多个第一数据结构中的每一个,
从该第一数据结构中提取该第一数据结构中反映的、影响对一个或多个数据元素的控制流依赖性或数据流依赖性的操作;
将所提取的操作的指示记录在第二数据结构中,其中,使用所有这些第二数据结构共用的依赖性构造集将这些所提取的操作的指示记录在该第二数据结构中;
处理这些第二数据结构,其中,该处理包括识别由于该多个程序中的任何一个中的处理所导致的对数据元素的依赖性;以及
将识别出的依赖性记录在依赖性数据结构中。
38.如权利要求37所述的至少一种非暂态计算机可读存储介质,其中:
为该多个程序构造相应的第一数据结构包括基于编写该多个程序所用的语言选择用于该多个程序的解析器。
39.如权利要求38所述的至少一种非暂态计算机可读存储介质,其中:
该多个程序是用多种源语言编写的,包括SQL和表达数据流图的图形化编程语言;并且选择解析器包括针对该多种源语言中的每一种选择一个解析器。
40.如权利要求39所述的至少一种非暂态计算机可读存储介质,其中:
提取所构造的该多个第一数据结构中的每一个中的操作的指示包括:根据针对用该多种源语言中的每一种编写的程序的依赖性构造集来构造第二数据结构。
41.如权利要求37所述的至少一种非暂态计算机可读存储介质,其中:
这些第一数据结构是语言相关的;并且
这些第二数据结构是语言无关的。
42.如权利要求37所述的至少一种非暂态计算机可读存储介质,其中:
提取该第一数据结构中的操作的指示包括:将该第一数据结构中的影响依赖性的操作的指示选择性地记录在该第二数据结构中,使得从该第二数据结构中省略关于该第一数据结构中的不影响依赖性的操作的信息。
43.如权利要求37所述的至少一种非暂态计算机可读存储介质,其中:
该数据处理系统包括多个语言相关的工具,用于降低这些第一数据结构,并且提取该第一数据结构中的操作的指示包括:针对该多个第一数据结构中的每一个,选择语言相关的工具,以用于基于编写被解析以构造该第一数据结构的程序所用的语言来提取该第一数据结构中的操作的指示。
44.如权利要求37所述的至少一种非暂态计算机可读存储介质,其中:
该依赖性构造集包括表示以下各项的构造中的两个或更多个构造:赋值、过程定义、过程返回、过程调用点、采用“if…else”格式的条件控制流、和采用“while…do”格式的条件控制流。
45.一种用于与数据处理系统一起使用的依赖性分析器,该依赖性分析器包括:
用于构造表示多个程序中的每一个的第一数据结构的装置,其中,这些第一数据结构反映该多个程序中的相应程序中的操作;
用于将在该第一数据结构中影响控制流依赖性或数据流依赖性的操作的指示记录在该第二数据结构中的装置,使得从该第二数据结构中省略关于所构造的该多个第一数据结构中每一个中的不影响依赖性的操作的信息;
用于处理这些第二数据结构以识别由于执行该多个程序中任何一个程序中的操作而导致的对数据元素的控制流依赖性或数据流依赖性的装置;以及
用于将识别出的依赖性记录在依赖性数据结构中的装置。

说明书全文

用于异构编程数据处理系统的自动化依赖性分析器

背景技术

[0001] 通常通过数据处理系统来管理大量数据。数据处理系统可以在耦合到一个或多个数据源的一个或多个计算机上实施。计算机可以被配置用于通过使用软件程序来执行特定的数据处理操作。这些软件程序可以是异构的、以多种编程语言编写的。
[0002] 作为示例,一所大学可以利用数据处理系统来处理学生的注册,该处理系统在学生选课时从学生那里接收输入数据。该数据可以包括学生姓名或身份证号码、课程标题或代号、教授、以及关于该学生或课程的其他信息。处理系统可以被编程用于通过访问各种数据源(比如,包含关于每个已加入学生的信息的数据存储)来处理每个请求。数据处理系统可以访问该数据存储,以确定加入课程的请求是由信誉良好的学生提出的。另一个数据存储可能包含关于课程的信息(包括预修课程)。数据处理系统可以结合来自另一个数据存储的数据来访问该数据,该另一个数据存储指示选课的学生已经完成的课程,以判定该学生是否有资格加入所选课程。
[0003] 通过根据程序来处理所访问的数据,数据处理系统可以生成指示该学生已经加入所选课程并且班级名册包括该学生的数据。当数据处理系统完成对课程注册请求的处理时,数据处理系统可能已访问了许多数据源,并且可能已经在多个数据存储中输入或更改了数据。
[0004] 类似的模式发生在许多其他重要的应用程序中,其中,数据处理系统访问多个数据源,并基于从数据源访问的数据或基于其他变量的值来生成或更改存储在其他数据存储中的值。因此,变量的许多值可以依赖于其他变量的值,无论这些其他值是从数据源访问的还是存在于数据处理系统中的。
[0005] 对于数据处理系统而言,提供关于由数据处理系统生成或修改的数据元素的依赖性信息通常是有用的。美国萨诸塞州列克星敦市的Ab Initio公司提供了“协作系统”,该协作系统基于被创造以在该协作系统上执行的程序来提供依赖性信息。协作系统执行被表达为数据流图的程序,其被表示为操作者和操作者之间的数据流。工具可以分析图,并通过识别操作者来确定变量之间的依赖性,其中,变量的值是基于一个或多个其他变量的值来设置的。通过追溯流向操作者的流,工具可以识别输入到操作者的变量进而依赖的其他变量。通过追溯遍历图,工具可以识别任何变量的无论是直接的还是间接的所有依赖性。
[0006] 此依赖性信息可以被输入到元数据存储中,从该元数据存储可以将该信息用于涉及图的许多功能。例如,数据质量规则可以应用于识别具有不期望值模式的变量。这些变量以及图中依赖于这些变量的任何变量都可以被标记为可疑的。作为另一个示例,如果需要更改图的一部分以提供新的功能、校正错误或移除不再需要的功能,则可以很容易地通过在该处理中生成或修改的变量来识别依赖该图的其他部分。更改之后,可以仔细检查图的那些部分,以确保其功能不会因在图中其他位置所做的更改而受到不利影响。
[0007] 在一些实例中,代替或除了图之外,数据处理系统可以使用其他编程语言。例如,数据源可以是用SQL或由数据库供应商定义的编程语言进行编程的数据库,以使得用户能够对要针对该数据库运行的查询进行编程。在可能在大型公司中实施的数据处理系统中,可能存在代替或除了图形化编程语言之外的、用多种语言编写的多个程序。对以图表达的程序进行操作的依赖性分析工具不能处理以其他语言编写的程序。其结果是,整个数据处理系统的依赖性信息可能是不完整的,或者可能需要很大的努才能生成。发明内容
[0008] 一些实施例提供了一种用于与数据处理系统一起使用的依赖性分析器,该数据处理系统被配置用于执行访问包括字段的多个记录的、采用多种计算机编程语言中的任何一种的程序。该依赖性分析器可以被配置用于对采用该多种计算机编程语言的程序进行依赖性分析,并且该依赖性分析可以包括计算与采用该多种计算机编程语言的程序之间的字段级沿袭有关的依赖性信息。该依赖性分析器可以包括前端,该前端被配置用于处理控制该数据处理系统的多个程序。该多个程序可用该多种编程语言中的多种编程语言编写。该前端可以包括多个前端模,每个前端模块被配置用于接收该多个程序中用该多种编程语言中的一种编程语言编写的一个计算机程序作为输入,并输出表示对在该程序内创建的该数据处理系统的字段的依赖性的语言无关的数据结构,其中,所述语言无关的数据结构由一个或多个依赖性构造组成,其中,每个依赖性构造包括至少一个字段的指示以及与该至少一个字段相关的依赖性。该数据分析器还可以包括后端,该后端被配置用于从该多个前端模块接收语言无关的数据结构,并针对该数据处理系统输出表示在该多个程序内创建的依赖性的依赖性信息。该依赖性信息可以包括在该多个程序中的若干程序中引入的字段级依赖性,使得该依赖性信息包括该多个程序之间的字段级沿袭。
[0009] 一些实施例提供了一种用于与数据处理系统一起使用的依赖性分析器,该数据处理系统包括:至少一个计算机硬件处理器;以及存储处理器可执行指令的至少一个非暂态计算机可读存储介质,这些指令在由该至少一个计算机硬件处理器执行时,使该至少一个计算机硬件处理器执行包括以下各项的动作:针对被配置用于由该数据处理系统执行的多个程序中的每一个,基于解析该程序来构造第一数据结构,其中,该第一数据结构反映该程序中的操作。针对该多个第一数据结构中的每一个,可以选择在该第一数据结构中反映的、影响对一个或多个数据元素的依赖性的操作,使得不影响依赖性的操作不被选择。针对每个所选操作,可以通过记录来自依赖性构造集中的依赖性构造来将所选操作的指示记录在第二数据结构中。针对该多个程序中的每一个程序的该依赖性构造集可以与编写该程序所用的语言无关。可以处理该多个第二数据结构。该处理可以包括识别对数据元素的控制流依赖性或数据流依赖性,所述依赖性是在执行该多个程序中的任何一个时可能出现的那些依赖性。可以处理在该依赖性数据结构中的识别出的依赖性,并且该依赖性数据结构包括指示该多个程序中的数据元素的数据并被结构化以指示这些数据元素之间的依赖性。
[0010] 一些实施例提供了一种对被配置成与数据处理系统一起使用的依赖性分析器进行操作的方法,该方法包括:使用至少一个计算机硬件处理器来针对被配置成在该数据处理系统内执行并以编程语言指定数据处理操作的多个程序进行执行,其中,该多个程序使用多种编程语言;通过解析该多个程序为这些程序构造相应的第一数据结构。针对该多个第一数据结构中的每一个,该方法可以包括:选择在该第一数据结构中反映的、影响对一个或多个数据元素的依赖性的操作;以及针对每个所选操作,将该所选操作的指示记录在第二数据结构中,其中,使用所有这些第二数据结构共用的依赖性构造集将这些指示记录在该第二数据结构中。可以处理这些第二数据结构,其中,该处理包括识别在执行该多个程序中的任何一个时可能出现的对数据元素的控制流依赖性或数据流依赖性。可以将识别出的依赖性记录在依赖性数据结构中。
[0011] 一些实施例可以提供一种对结合数据处理系统一起使用的依赖性分析器进行操作的方法,该方法包括:使用至少一个计算机硬件处理器来针对以编程语言指定在该数据处理系统内执行的数据处理操作的多个程序进行执行,其中,该多个程序使用多种编程语言;以及通过解析该多个程序为这些程序构造相应的第一数据结构。针对该多个第一数据结构中的每一个,该方法可以包括:选择在该第一数据结构中反映的、影响对一个或多个数据元素的控制流依赖性的操作。针对每个所选操作,可以将该所选操作的指示记录在第二数据结构中,其中,使用所有这些第二数据结构共用的依赖性构造集将这些指示记录在该第二数据结构中。可以处理这些第二数据结构,其中,该处理包括识别由于该多个程序中的任何一个中的处理所导致的对数据元素的依赖性。在依赖性数据结构中的识别出的依赖性。
[0012] 又进一步的实施例可以提供至少一种非暂态计算机可读存储介质,该至少一种非暂态计算机可读存储介质存储处理器可执行指令,这些指令在由至少一个计算机硬件处理器执行时,使该至少一个计算机硬件处理器执行针对以相应编程语言指定数据处理操作的多个程序的动作,其中,该多个程序使用多种编程语言。这些动作包括通过解析该多个程序为这些程序构造相应的第一数据结构。针对所构造的多个第一数据结构中的每一个,可以从该第一数据结构中提取该第一数据结构中反映的、影响对一个或多个数据元素的控制流依赖性或数据流依赖性的操作,并且可以将所提取的操作记录在第二数据结构中,其中,使用所有这些第二数据结构共用的依赖性构造集将这些所提取的操作的指示记录在该第二数据结构中。可以处理这些第二数据结构,其中,该处理包括识别由于该多个程序中的任何一个中的处理所导致的对数据元素的依赖性。可以将识别出的依赖性记录在依赖性数据结构中。
[0013] 另外其他的实施例可以提供一种用于与数据处理系统一起使用的依赖性分析器,该依赖性分析器包括:用于构造表示多个程序中的每一个的第一数据结构的装置,其中,这些第一数据结构反映该多个程序中的相应程序中的操作;用于将在该第一数据结构中影响控制流依赖性或数据流依赖性的操作的指示记录在该第二数据结构中的装置,使得从该第二数据结构中省略关于所构造的该多个第一数据结构中每一个中的不影响依赖性的操作的信息;用于处理这些第二数据结构以识别由于执行该多个程序中任何一个程序中的操作而导致的对数据元素的控制流依赖性或数据流依赖性的装置;以及用于将识别出的依赖性记录在依赖性数据结构中的装置。
[0014] 前述内容为本发明的非限制性发明内容,其由所附权利要求限定。附图说明
[0015] 将参照以下附图描述各个方面和实施例。应当理解,附图不一定按比例绘制。出现在多个附图中的项在其出现的所有附图中由相同或相似的附图标记指示。
[0016] 图1A是本文所描述的技术的一些实施例可以在其中操作的说明性计算环境的框图
[0017] 图1B是用于计算依赖性信息的处理的功能框图。
[0018] 图2是根据本文所描述的技术的一些实施例的说明性派生数据沿袭的说明性图形化表示。
[0019] 图3A是用于产生依赖性元数据结构的语言相关前端处理的功能框图。
[0020] 图3B是计算程序的一部分的概念草图;
[0021] 图3C是图3B的程序的该部分的表示为解析树的概念草图;
[0022] 图3D是从解析树提取的依赖性信息的概念草图。
[0023] 图4是用于产生依赖性元数据结构的语言无关后端处理的功能框图。
[0024] 图5是根据本文所描述的技术的用于产生依赖性元数据结构的处理的流程图
[0025] 图6是其中可以执行如本文所描述的处理的计算系统的功能框图。

具体实施方式

[0026] 发明人已经认识并理解,可以通过将表示用于数据处理系统的程序的源代码自动变换为表示数据依赖性的语言无关的构造的组合来提高数据处理系统的准确性、效率和可靠性。为程序生成的构造无论是表达为图还是以其他形式表达都可以在数据结构中进行组合,从而捕获部分系统的,甚至可能整个系统的依赖性,该系统涵盖以不同语言准备的程序。然后可以对数据结构进行处理以生成系统的依赖性信息,包括以比如图和一种或多种其他语言等多种语言编码的程序。这种方法产生一种改进的依赖性分析工具,该工具为由数据处理系统管理的数据生成更完整的依赖性信息。
[0027] 在一些实施例中,可以使用构造集来表示依赖性。发明人已经认识并理解,可以用有限的依赖性构造集来表示关于对数据处理系统中的数据元素的依赖性的有用信息。该构造集可以包括表示以下各项的构造,例如:赋值、过程定义、过程返回、过程调用点、采用“if…else”格式的条件控制流、和采用“while…do”格式的条件控制流。在一些实施例中,依赖性构造集将由该集组成或将基本上由该集组成,仅包含这些构造的变化形式,比如对常数值的赋值。
[0028] 发明人已经进一步认识并理解,可以在多个阶段中高效地执行表示程序的部分的源代码的自动化处理。第一阶段处理可以解析源代码。经解析的源代码可以以比如解析树等第一数据结构来表示,该第一数据结构可以由计算机操纵。在一些实施例中,第一阶段处理可以使用比如解析器生成器等商用的工具来执行。商用的解析器生成器的示例是Yacc和ANTLR。这些中的任何一个都可以根据指定编程语言的语法的语法文件来生成解析器。
[0029] 解析器是语言相关的,并且通常是由解析器生成器根据语言的语法规则来生成的。因此,被配置用于识别以多种语言编写的程序中的依赖性的数据处理系统可以包含多个解析器和/或包含一个解析器生成器以生成多个解析器。因此,数据处理系统可以访问多个解析器,并且可以基于编写程序的编程语言为每个程序选择解析器,且(如果必要的话)生成解析器。
[0030] 第二阶段处理可以从解析树或第一阶段中产生的其他数据结构中提取与依赖性有关的信息。该依赖性信息可以被表达为构造的组合。这些构造可以选自如上文所描述的集或选自任何其他合适的构造集。处理的结果可以采用第二计算机数据结构来表达,该第二计算机数据结构也可以被格式化为树。然而,应当理解,第二阶段处理的结果可以存储在保留关于程序执行的操作的信息的任何数据结构中,这些操作可能基于程序中的数据元素或由程序访问的数据元素而影响依赖性。
[0031] 第二阶段的处理也是语言相关的。不同的语言可以支持不同的操作,这可能会以不同的方式影响依赖性。因此,可以针对正被处理的程序的编程语言来选择应用于第一数据结构中的每一个的工具。例如,数据处理系统可以具有用于第二阶段处理的多个工具,并且可以为每个程序选择适当的工具。该选择可以由数据处理系统动态地进行,以使工具与编写正被处理的程序的语言相匹配。
[0032] 可以以任何合适的方式来实施用于第二阶段处理的工具中的每一个。在一些实施例中,每个工具可以被编程用于在第一数据结构中来识别基于数据元素影响依赖性的操作。通常,这些依赖性将是一个程序变量(有时称为目标变量)对一个或多个其他程序变量(有时称为源变量)的依赖性。在本文中,将这种类型的数据流依赖性用作示例。然而,应当理解,其他类型的依赖性也是可能的,并且可以使用本文所描述的技术进行分析。例如,控制流依赖性也是可能的,在这种依赖性中,代码块的执行依赖于一个或多个数据元素的值。
[0033] 在第一数据结构是解析树的示例中,工具可以遍历解析树以生成第二数据结构。在检测到影响依赖性的操作之后,该工具可以使用来自构造集中的一个或多个构造在第二数据结构中进行输入。在该示例中,反映操作的顺序的层级信息可能会被传递到第二数据结构。对于不影响依赖性的第一数据结构中反映的操作,该工具可能不会在第二数据结构中进行输入。以这种方式,第二数据结构比第一数据结构更紧凑。
[0034] 一旦为每个程序计算了第二数据结构,就可以一起使用针对在数据处理系统中一起使用的程序的第二数据结构。第二数据结构可以识别哪些变量依赖于其他变量。此信息可以表示为变换,为引入依赖性的每个操作定义受该操作影响的目标变量和从中获得用于该变换的数据的源变量。
[0035] 表示系统的依赖性的第二数据结构可以由依赖性分析工具进行处理。可以识别记录在第二数据结构中的每个目标,并且可以列出该目标的源变量。根据一些实施例,程序可以具有嵌套的作用域,比如,当将定义代码的内部块的函数或其他构造定义在定义代码的外部块的程序或其他构造内时,可能会出现嵌套的作用域。在一些实施例中,依赖性可以仅存在于内部作用域内,使得那些依赖性不影响数据处理系统输出或修改的变量。在一些实施例中,这样的纯局部依赖性可以被删除,从而仅留下外部依赖性信息。
[0036] 在一些实施例中,第一外部变量可以依赖于局部变量,这些局部变量进而依赖于一个或多个第二外部变量。在这种情况下,可以在第二阶段处理中识别第一外部变量对一个或多个第二外部变量的间接依赖性。这样的识别可以通过以下方法来自动进行:使依赖性分析工具传播局部依赖性,将第一外部变量对内部变量的依赖性再计算为局部变量所依赖的一个或多个第二外部变量的依赖性。
[0037] 无论具体内容是什么,都可以将关于数据依赖性的信息编写到比如数据处理系统使用的元数据存储库等元数据结构中。可以将该信息与任何其他合适的信息结合进行编写。在一些实施例中,例如,可以捕获关于程序的源代码的信息以及表征该程序的依赖性的信息。作为具体示例,可以存储包含创建依赖性的语句的代码的部分。
[0038] 作为在一些实施例中可以可选地存储的其他类型的信息的示例,可以存储关于控制依赖性的信息。可以通过识别依赖于一个或多个变量的值有条件地执行的程序块来识别控制依赖性。该信息可以以类似于数据依赖性信息的方式来捕获,但是,不是将变量记录为直接依赖于其他源变量的目标实体,而是可以将代码块识别为依赖于一个或多个流控制源变量。其值可以依赖于该代码块是否被执行的任何变量可以被识别为目标变量,并且与那些流控制源变量相关联。
[0039] 依赖性信息可以以多种方式使用。在数据处理系统的操作期间,例如,具有依赖性信息可以用于评估可以启用或阻止对某些数据的处理操作的规则。作为一个示例,可以抑制接收依赖于已被识别为损坏或不可靠的变量的数据作为输入的操作。
[0040] 应当理解,本文所描述的实施例可能以多种方式中的任何方式来实施。以下仅出于说明性目的提供了具体实施方式的示例。应当理解,这些实施例和所提供的特征/能力可以单独使用、一起使用、或者以两个或更多个的任何组合使用,因为本文所描述的技术的方面在这方面不受限制。
[0041] 图1A是本文所描述的技术的一些实施例可以在其中操作的说明性计算环境100的框图。计算环境100包括数据处理系统105,其被配置用于对存储在数据存储104中的数据进行操作。
[0042] 在一些实施例中,数据存储104可以包括以一种或多种任何合适类型的格式存储数据的一个或多个存储装置。例如,数据存储104的(多个)存储装置部分可以使用一个或多个数据库表、电子表格文件、平面文本文件和/或任何其他合适格式(例如,主机的本机格式)的文件来存储数据。(多个)存储装置可以是任何合适的类型,并且可以包括一个或多个服务器、一个或多个数据库系统、一个或多个便携式存储装置、一个或多个非易失性存储装置、一个或多个易失性存储装置、和/或被配置用于电子地存储数据的任何其他(多个)装置。在一些实施例中,除了(多个)存储装置之外或代替(多个)存储装置,数据存储104可以包括一个或多个在线数据流。因此,在一些实施例中,数据处理系统105可以访问以任何合适格式通过一个或多个数据流提供的数据。
[0043] 在数据存储104包括多个存储装置的实施例中,存储装置可以共同位于一个物理位置中(例如,在一个建筑物中)或分布在多个物理位置(例如,在多个建筑物中,在不同的城市、州或国家)。存储装置可以被配置用于使用一个或多个网络(比如,例如,图1A所示的网络106)来彼此通信。
[0044] 在一些实施例中,由(多个)存储装置存储的数据可以包括一个或多个数据实体,比如一个或多个文件、表格、表格的行和/或列中的数据、电子表格、数据集、数据记录(例如,信用卡交易记录、电话记录和行交易记录)、字段、变量、消息和/或报告。(多个)存储装置可以存储数千、数百万、数千万或数亿个数据实体。每个数据实体可以包括一个或多个数据元素。
[0045] 如本文所描述的,数据元素可以是由数据处理系统存储和/或处理的任何数据元素。例如,数据元素可以是数据记录中的字段,并且数据元素的值可以是存储在数据记录的字段中的值。作为具体的非限制性示例,数据元素可以是在存储关于电话呼叫的信息的数据记录中存储呼叫者姓名的字段(该数据记录可能是关于电信公司客户进行的电话呼叫的多个数据记录的一部分),并且数据元素的值可以是存储在字段中的值。作为另一个示例,数据元素可以是表格中的单元格(例如,在表格的特定行和列处出现的单元格),并且数据元素的值可以是表格的单元格中的值。作为又一个示例,数据元素可以是变量(例如,在报告中),并且物理元素的值可以是变量的值(例如,在报告的特定实例中)。作为具体的非限制性示例,数据元素可以是关于银行贷款申请人的报告中的表示申请人的信用评分的变量,并且数据元素的值可以是信用评分的数值(例如,在300与850之间的数值)。表示申请人信用评分的数据元素的值可以依赖于用于生成关于银行贷款申请人的报告的数据而改变。
[0046] 在一些实施例中,数据元素可以采用任何合适类型的值。例如,数据元素可以采用数值、字母值、来自离散选项集(例如,有限的类别集)的值、或任何其他合适类型的值,因为本文所描述的技术的方面在这方面不受限制。可以通过具有数据存储104的访问权限的计算机上的处理来对这些值进行赋值。
[0047] 可以利用“协作系统”或使数据处理系统能够执行程序的其他合适的程序对数据处理系统105进行编程,这些程序可以被编写为基于企业需要的数据处理的类型来配置针对特定企业的数据处理系统105。因此,数据处理系统105可以包括被配置用于对数据存储104中的数据进行操作的一个或多个计算机程序109。计算机程序109可以是任何合适的类型并且可以用任何合适的(多种)编程语言编写。例如,在一些实施例中,计算机程序109可以包括至少部分地使用结构化查询语言(SQL)编写并被配置用于访问数据存储104的一个或多个数据库部分中的数据的一个或多个计算机程序。作为另一个示例,在一些实施例中,数据处理系统105被配置用于以图形式执行程序,并且计算机程序109可以包括开发为数据流图的一个或多个计算机程序。数据流图可以包括表示要对输入数据执行数据处理操作的组件(称为“节点”或“顶点”)、以及组件之间的表示数据流的链路。用于执行由数据流图进行编码的计算的技术在名称为“Executing Computations Expressed as Graphs[执行表达为图的计算]”的美国专利号5,966,072中进行了描述,该专利通过援引以其全文并入本文。
[0048] 进一步地,数据处理系统105可以包括用于执行如本文所描述的依赖性分析功能的工具和/或实用程序。在图1A的所展示实施例中,数据处理系统105进一步包括开发环境108,其可以由人(例如,开发者)使用以开发用于对数据存储104中的数据进行操作的计算机程序109中的一个或多个。例如,在一些实施例中,用户102可以使用计算装置103来与开发环境交互以指定计算机程序(比如数据流图)并将计算机程序保存为计算机程序109的一部分。用于将计算机程序开发为数据流图的环境在名称为“Managing Parameters for Graph-Based Applications[为基于图的应用程序管理参数]”的美国专利公开号2007/
0011668中进行了描述,该专利通过援引以其全文并入本文。依赖性分析工具可以在开发环境中由开发者(比如用户102)访问,或以任何其他方式访问。
[0049] 在一些实施例中,计算机程序109中的一个或多个可以被配置用于对数据存储104中的数据执行任何合适的操作。例如,计算机程序109中的一个或多个可以被配置用于从一个或多个源访问数据、转变所访问的数据(例如,通过改变数据值、过滤数据记录、改变数据格式、对数据进行排序、组合来自多个源的数据、将数据分成多个部分、和/或以任何其他合适的方式)、根据所访问的数据计算一个或多个新值、和/或将数据写入一个或多个目的地。
[0050] 在一些实施例中,计算机程序109中的一个或多个可以被配置用于对数据存储109中的数据执行计算和/或根据该数据生成报告。所执行的计算和/或所生成的报告可以与和业务相关的一个或多个量相关。例如,计算机程序可以被配置用于访问人的信用历史数据并基于信用历史确定该人的信用评分。作为另一个示例,计算机程序可以访问电话公司的多个客户的电话呼叫日志,并生成指示有多少客户使用的数据多于其数据计划中允许的数据的报告。作为又一个示例,计算机程序可以访问指示银行进行的贷款类型的数据,并生成指示银行进行的贷款的总体险的报告。这些示例是说明性的且非限制性的,因为计算机程序可以被配置用于根据存储在数据存储104中的数据生成任何合适的信息(例如,用于任何合适的业务目的)。程序109可以由用户130调用,例如,以从数据处理操作中获取业务信息。
[0051] 在所展示的实施例中,数据处理系统105还包括元数据存储库110,该元数据存储库支持可能在系统105的操作期间发生的各种任务的执行,各种任务包括与维护程序和数据治理相关的那些任务。在所展示的实施例中,元数据存储库110包括数据依赖性模块118、控制依赖性模块120和代码摘要122。可以如本文所描述地分别获得关于数据依赖性、控制依赖性和代码摘要的信息。此信息可以以任何合适的格式存储。作为非限制性示例,数据依赖性模块118可以包括一个或多个表,该一个或多个表指示与计算机程序109中的多个变量中的每一个存在依赖性的那些计算机程序中的其他变量。控制依赖性模块120可以类似地存储关于其值可能受到程序109中的代码块的执行的影响的变量的信息,这些代码块依赖于这些变量中的一个或多个变量的值而被有条件地执行。
[0052] 代码摘要模块122可以将代码的部分存储在程序109中,该程序中引入了依赖性(数据依赖性或控制依赖性)。代码摘要可以通过存储相关源代码的副本或指向包含相关代码的源代码文件的部分的指针来标识代码。可以以任何合适的方式来标识代码,比如通过源代码的副本或通过指向包含相关代码的源代码文件的部分的指针。
[0053] 图1B展示了可以执行以产生依赖性信息的处理。图1B展示了可以处理多个程序(在图1B中展示为程序150、160、170)以识别依赖性信息。这些程序可以共同控制数据处理系统,以处理来自一个或多个数据源的数据。这些程序可以用不同的编程语言来编写。在图1B的示例中,程序150被示出为用语言1编写,程序160可以用语言2编写,并且程序170可以用语言N编写。然而,不要求所有语言都是不同的,并且在一些实施例中,多个程序中的所有或一些程序可以用相同的语言编写。作为具体示例,程序中的一些可以被编写为存储过程调用,比如可以被执行以处理数据库中的数据。其他的可以用图形化编程语言来编写,而其他的可以用另外其他的语言编写。
[0054] 无论编写程序所用语言的组合是什么,都可以使用语言相关的处理来处理每个程序。在图1B中,语言相关的处理在前端模块152、162和172中执行,这些前端模块中的每一个都被配置用于以其各自的语言处理程序。
[0055] 每个前端模块的输出可以是反映利用程序进行处理引入的依赖性的依赖性数据结构。如图1B所示,每个前端可以输出其自己的依赖性数据结构,该数据结构可以是被降低的解析树154、164和174。例如,可以通过对程序进行解析以产生解析树、并且然后降低解析树以移除与依赖性无关的信息来创建被降低的解析树。根据一些实施例,可以使用有限的依赖性构造集来表示被降低的解析树。由于可以通过由语言无关的依赖性构造在语言相关的解析树中表示依赖性信息来降低每个解析树,因此被降低的解析树154、164和174可以是语言无关的。
[0056] 于是,可以一起处理被降低的解析树,从而允许为可以由数据处理系统执行的所有程序150、160、170生成依赖性信息。该处理可以在后端180中执行。后端处理可以是语言无关的,从而允许在任何数据处理系统中使用后端180,而不管编写该系统的程序所用的是什么语言。
[0057] 后端180中生成的依赖性信息可以以任何期望的方式使用。在图1A的实施例中,依赖性信息存储在充当元数据存储库110的数据存储中。元数据存储库110可以以任何合适的方式实施。这种存储库的示例可以例如在美国授权前公开2010/0138431 A1中找到,该专利以其全文并入本文。这样的元数据存储库可以保存在共同实施数据处理系统的任何程序中引入的依赖性信息。该依赖性信息可以包括指示多个程序中的数据元素的数据,并且可以被结构化以指示这些数据元素之间的依赖性。例如,依赖性信息可以被结构化成一系列的列表,其中,每个列表与目标数据元素相关联并且包括实体,这些实体是目标可能依赖的源数据元素。这样的信息可以可替代地或另外地存储为表格,其中每个行和每个列对应于一个变量,并且在每个行和每个列的交叉点处的单元格指示在行变量和列变量之间是否存在依赖性。在一些实施例中,每个单元格中的信息可以另外地指示关于依赖性的信息,比如,该依赖性是数据流依赖性还是控制流依赖性、或者可以在何处访问关于该依赖性的附加信息。
[0058] 元数据存储库110中的信息可以以任何合适的方式使用。例如,其可以用于操作或维护计算机程序109。作为具体示例,程序员102可以更改计算机程序109之一的影响第一变量的值的部分。程序员102可以基于元数据存储库110中的信息来识别计算机程序109的具有依赖于该第一变量的变量的其他部分。程序员102可以测试那些部分以确保它们的操作不会被该更改扰乱。作为另一个示例,数据处理系统105的通过计算装置134与系统交互的用户130,可以分析由数据处理系统105产生的报告中的数据。例如,用户130可以质疑报告中呈现的计算值的有效性,并且可以访问元数据存储库110中的信息以识别用于计算被质疑的值的数据源。然后,用户130可以调查那些数据源的质量,从而验证报告中数据的质量。例如,可以通过调用工具来自动访问和处理元数据存储库中的信息。
[0059] 无论如何使用存储库110中的元数据,使得数据处理系统105在即使存在用多种不同的编程语言编写的程序的情况下也能够生成该元数据,可以提高数据处理系统105的可靠性并使数据处理系统105能够执行新功能。
[0060] 可以通过访问数据沿袭来全部或部分地实现这些功能。数据沿袭是对在数据处理系统中从何处获得或在何处处理用于生成特定变量的值的数据的指示。图2是说明性编程数据处理系统的数据沿袭图示200。如本文所描述的,数据沿袭和展示它的图示可以通过识别依赖性来生成。数据沿袭图示200包括表示数据实体的节点202和表示应用于数据实体的变换的节点204。
[0061] 数据实体可以例如是数据集,比如文件、数据库或以任何适当方式格式化的数据。在一些实施例中,数据实体可以是“字段”,这些字段可以是从特定数据存储访问的元素。例如,在被格式化为表格并且其中单元格由行和列组织而成的数据存储中,字段可以是单元格。作为另一个示例,在被组织为多个记录的数据库中,字段可以是记录内的字段。无论由数据处理系统访问的数据存储的具体组织是什么,实施数据处理系统的程序都可以从那些字段中读取和/或写入,使得这些字段在实施数据处理系统的程序中被引用。因此,那些程序创建与那些字段相关的依赖性,其中,一些字段具有依赖于其他字段的值的值。在一些实施例中,如本文所描述的依赖性分析器可以计算和存储与字段相关的依赖性信息,并且该信息可以反映在任何程序中引入的可能会影响特定字段中的值或受到这些值的影响的依赖性。该字段级依赖性信息使依赖性分析器能够以对数据处理系统进行编程所采用的多种计算机编程语言中的任何一种来提供关于程序之间的字段级沿袭的信息。
[0062] 尽管图2以相同的符号展示了每个节点202,但是并不要求所有节点都具有相同的类型。相反,在现代企业中,节点202可以是不同类型的,比如可以由企业使用来自ORACLE、SAP或HADOOP的组件产生。如本领域中已知的,来自ORACLE或SAP的组件可以实施数据库。来自HADOOP的组件可以实施分布式文件系统。位于HADOOP分布式文件系统上的常见数据库称为HIVE。此类组件可以用于实施数据库,或者可以用于实施存储在分布式文件系统中的数据集。因此,应当理解,如本文所描述的技术可以与对采用多种格式中的任何一种格式的数据集执行操作的多种语言的程序一起工作。
[0063] 此外,每个节点不必对应于单个硬件组件。相反,在图2中被表示为单个节点的一些数据源可以利用分布式数据库技术来实施。HADOOP是分布式数据库技术的示例,其中,一个数据源可以在多个计算机硬件装置上实施。
[0064] 由节点204表示的变换可以通过计算机程序来实施。尽管图4中的所有节点204都以相同的符号示出,但是并不要求所有程序都用相同的编程语言来编写。相反,所使用的语言可以依赖于节点204从其获得数据的节点202的类型,或者可以由于企业环境中的多种原因中的任何一个根据节点的不同而不同。如本文所描述的技术可以应用于此类异构环境。
[0065] 数据沿袭图示200展示了数据实体206中的一个或多个数据元素的上游沿袭信息。进入表示变换的节点的箭头指示哪些数据实体被作为输入提供给变换。从表示数据变换的节点出来的箭头指示向其提供变换结果的数据实体。变换的示例包括但不限于执行任何合适类型的计算、对数据进行排序、基于任何合适的标准过滤数据以移除数据的一个或多个部分(例如,过滤数据记录以移除一个或多个数据记录)、合并数据(例如,使用联接操作或以任何其他合适的方式)、执行任何合适的数据库操作或命令、和/或前述变换的任何合适组合。可以使用任何合适类型的一个或多个计算机程序(作为示例而非限制,包括实施为数据流图的一个或多个计算机程序)来实施变换。
[0066] 数据沿袭图示(比如图2所示的图示200)可能由于多种原因而是有用的。例如,展示数据实体与变换之间的关系可以帮助用户确定如何获得特定数据元素(例如,如何计算报告中的特定值)。作为另一个示例,数据沿袭图示可以用于确定将哪些变换被应用于各种数据元素和/或数据实体。
[0067] 在一些实施例中,数据沿袭可以表示数据元素、包含那些数据元素的数据实体、和/或应用于数据元素的变换之间的关系。数据元素、数据实体和变换之间的关系可以用于确定其他事物之间的关系,比如,这些事物例如为系统(例如,一个或多个计算装置、数据库、数据仓库等)和/或应用程序(例如,访问由数据处理系统管理的数据的一个或多个计算机程序)。例如,当在数据沿袭内,存储在位于一个物理位置的系统“A”中的数据库中的表的数据元素部分被指示为从存储在系统“B”中的另一个数据库中的另一个表的另一个数据元素部分派生时,则可以推断系统A和B之间的关系。作为另一个示例,当应用程序从系统读取一个或多个数据元素时,可以推断应用程序与系统之间的关系。作为又一个示例,当一个应用程序访问由另一个应用程序操作的数据元素时,可以推断应用程序之间的关系。这些关系中的任何一个或多个可以被示出为数据沿袭图示的一部分。
[0068] 应当理解,图2以其中每个目标数据元素利用链接到与之直接相关的其依赖于的源数据元素的方式被示出而示出了数据沿袭。那些源数据元素可以进而依赖于其他数据元素。如图2所示出的数据沿袭的表示使得能够识别这些间接依赖性,因为可以通过在如图2所示出的数据沿袭中追溯依赖性来识别作为目标数据元素的源的每个数据元素的源数据元素。在本文所描述的实施例中,数据沿袭可以以使得该追溯能够识别间接依赖性的方式存储。然而,应当理解,可以以任何适当的方式来存储依赖性信息,在一些实施例中,这可以包括识别和存储间接依赖性。
[0069] 还应当理解,数据处理系统可以管理大量数据元素(例如,数百万、数十亿或数万亿的数据元素)。例如,管理与信用卡交易相关联的数据的数据处理系统可以一年处理数十亿的信用卡交易,并且交易中的每一个可以包括多个数据元素,比如,例如信用卡号、日期、商家身份和购买金额。因此,数据沿袭可以表示大量数据元素、包含那些数据元素的数据实体、和/或应用于数据元素的变换之间的关系。因为数据沿袭可能包括大量信息,所以以观察者可理解的方式呈现该信息是重要的。因此,在一些实施例中,可能以不同粒度级别将数据沿袭中的信息可视化。用于可视化派生沿袭中的信息的各种技术和用于生成和/或可视化数据沿袭的技术的一些方面在以下专利中描述:(1)2009年12月2日提交的名称为“Visualizing Relationships  Between  Data  Elements and Graphical Representations of Data Element Attributes[将数据元素之间的关系和数据元素属性的图形化表示可视化]”的美国专利申请序列号12/629,466;(2)2016年2月10日提交的名称为“Filtering Data Lineage Diagrams[对数据沿袭图示进行过滤]”的美国专利申请序列号15/040,162;(3)2015年7月22日提交的名称为“Data Lineage Summarization[数据沿袭概述]”的美国专利申请序列号14/805,616;(4)2015年7月20日提交的名称为“Managing Parameter Sets[管理参数集]”的美国专利申请序列号14/803,374;以及(5)2015年7月20日提交的名称为“Managing Lineage Information[管理沿袭信息]”的美国专利申请序列号14/803,396,这些专利中的每一个的通过援引以其全文并入本文。
[0070] 无论如何使用此信息,此信息都可以根据如本文所描述的过程、通过实施前端的编程语言相关的处理和后端的编程语言无关的处理的工具来得出。这种方法减少了系统的编程和处理需求。例如,后端处理可以在以许多不同编程语言实施的程序之间共享,从而减少实施系统所需的存储器和其他计算资源的数量。尽管特定于语言,但是前端处理可以利用针对编译器、解释器或其他现有工具开发的现有解析器技术。
[0071] 图3A是前端处理的功能框图。图3A中所展示的前端处理将采用多种编程语言中的任何一种的源代码转换为以语言无关的方式表示依赖性的数据结构。图3A展示了对程序310的处理。程序310可以是计算机程序109(图1A)之一,并且可以用任何合适的编程语言来编写。
[0072] 程序310被提供为解析器312的输入。解析器312可以是具有已知构造的解析器,该解析器被配置用于处理采用编写程序310的所用的语言的程序代码。解析器312的输出可以是解析树314。解析树314可以采用已知格式,并且可以表示由程序310内的程序代码指定的操作。解析树314可以作为表示程序310的第一数据结构而存储在计算机存储器中。然而,应当理解,可以以任何合适的方式来表示根据程序310执行的操作。
[0073] 然后,可以由提取模块316对解析树314进行处理。类似于解析器312,提取模块316可以特定于编写程序310的所用编程语言。提取模块316在被执行时可以遍历表示解析树314的数据结构,以识别指示程序310中可以创建数据流依赖性或控制流依赖性的操作的元素。在检测到这样的操作之后,提取模块316可以在第二数据结构(在此被表示为依赖性数据集318)中进行输入。
[0074] 提取模块316可以通过应用发明人的以下见解来实施,出于识别数据流依赖性和控制流依赖性的目的,通常可以用少量构造来表示程序中可能引入依赖性的操作集合。此外,可能引入依赖性的由编程语言支持的操作的数量也是有限的并且相对较小。因此,提取模块316可以被配置用于使用已知技术遍历解析树314,以识别程序310中的每个依赖性影响操作,并在第二数据结构中输入表示依赖性的信息。
[0075] 一旦识别出这样的依赖性影响操作,然后,提取模块316就可以选择表示识别出的操作的一个或多个依赖性构造。这种选择可以使用表查找、启发式算法或其他合适的技术来进行。然后,提取模块316可以使用在解析树314中识别出的操作的参数来对依赖性构造进行参数化。
[0076] 作为具体示例,如果提取模块316在解析树314中识别出“加法”运算,则该运算可以被映射到依赖性构造。在此示例中,“加法”运算涉及三个变量“a”、“b”和“c”,其中,“a”是运算的输出,其值依赖于“b”和“c”的值。提取模块316可以在对依赖性构造进行参数化时使用这三个变量。根据一个示例性实施例,该依赖性构造可以被称为“赋值”。在此示例中,依赖性构造可以指示赋予目标变量“a”依赖于源变量“a”和“b”的值。
[0077] 应当理解,在一些实施例中,变量之间依赖性是否是由于执行程序而存在的可以依赖于在程序被执行时赋予程序的变量的值。然而,为简单起见,提取模块316可以被配置用于将结果可能依赖于一个或多个其他变量的值的任何操作分类为依赖性影响操作。同样,在一些实例中,在某些情况下,程序的部分可能不基于一个或多个变量的值来执行。尽管如此,提取模块316可以被配置用于处理解析树314中可以在任何情况下执行或影响变量的值的所有操作,并且将那些操作记录在依赖性数据集318中。
[0078] 图3A展示了依赖性数据集318包括多个依赖性构造320A、320B…320ZZ。每个依赖性构造可以采用表征程序310的有限数量的依赖性构造之一的形式。
[0079] 以下提供了这些构造的示例。在一些实施例中,提取模块可以被编程用于识别这些构造的子集。在其他实施例中,以下示例表示提取模块识别的有限的构造集。在其他实施例中,可以其他方式来表达依赖性。
[0080]
[0081] 示例1,“函数”
[0082] 根据一些实施例,代码的表示函数的部分可以示出如下:
[0083]
[0084] f(){
[0085] }
[0086]
[0087] 在被转换为解析树并进行处理之后,此代码可以表达如下:
[0088]
[0089] 3:1 4:1f1(){
[0090] }
[0091]
[0092] 示例1展示了被表达为过程定义的简单函数。从依赖性的度来看,过程具有作用域、输入、输出或双向参数。函数是具有返回参数的过程。
[0093] “3:1 4:1”是所生成的构造在源文件中的起始位置和结束位置。此信息可以用作指向生成依赖性的代码的指针,该指针可以用于生成可以存储在元数据存储库110中的代码摘要。可替代地或另外地,提取模块可以通过复制代码行来捕获关于引起依赖性的源代码的信息。根据一些实施例,提取模块可以被编程为无论是通过指针、源代码的副本还是以某种其他方式,仅指示创建了依赖性的代码摘要。可以以任何合适的方式来制作代码摘要,比如,通过选择进行赋值的代码行,再加上在包含该赋值的那一行之前和/或之后的一行或有限数量的行。可以将其他规则编码到提取模块中,以减少代码摘要所需的存储空间的量。例如,可以仅复制代码行中的运算符,或者仅复制明确引用代码块内目标变量的行。
[0094]
[0095] 示例2:赋值
[0096] 作为第二示例,源代码中可能会出现以下依赖性影响操作。
[0097]
[0098] f(x in,y out){
[0099] y=x;
[0100] }
[0101]
[0102] 通过前端处理,该操作可以被表达为如下依赖性构造:
[0103] 21:1 23:1f2(x,y OUT){
[0104] 22:5 22:11y[x]
[0105] }
[0106]
[0107] 在本示例以及其他示例中,方括号用于依赖性列表,圆括号用于参数和自变量列表。花括号用于作用域。例如,“y[x]”表示单个依赖性,而“y”依赖于“x”。在构成本文中作为示例提供的依赖性构造集的语言中,依赖性总是具有单个目标元素(在这种情况下为“y”)和源元素列表。在此示例中,源元素列表为“[x]”,并且由一个元素“x”组成。在此示例中,还展示了用于在处理的后续阶段生成源代码摘要的指向源代码的指针。在这里,源代码的相关部分被展示为“21:1 23:1”和“22:5 22:11”,这可以是指向源代码文件中的行的指针,在该源代码文件的行中可以找到创建相应依赖性的源代码语句。
[0108] 此示例还展示了数据元素:“x”和“y”。这些元素表示基本/最低级/原子字段。在此示例中,“x”出现在元素的源列表中,并且“y”是(唯一的)目标元素。
[0109] 参数/自变量的方向性知识可以用于依赖性分析。因此,依赖性构造也可以表示方向性。存在三种类型:IN、OUT、INOUT。在示例的语言中,如果未说明方向性,则暗示为IN。
[0110] 应当理解,该语法使依赖性构造人类可读。本发明不要求依赖性构造是人类可读的,因为本文所描述的处理可以是自动化的。因此,表示依赖性构造的任何信息都可以存储在计算机存储器中并用于识别依赖性构造。
[0111]
[0112] 示例3:返回
[0113] 返回变量值的函数也可能会创建依赖性,因为所返回的变量的值可以依赖于函数内的处理,包括该函数处理中使用的变量。函数
[0114]
[0115] f(x){
[0116] return x
[0117] }
[0118]
[0119] 可以由如下依赖性构造来表达:
[0120]
[0121] f3(x){
[0122] _RETURN[x]
[0123] }
[0124]
[0125] “_RETURN”是特殊的数据元素名称,用于指定函数返回的未命名实体。此示例展示了除明确声明的变量以外,数据元素可能具有或创建依赖性。在本文所描述的处理中,无论以何种方式被创建的数据元素都可以被处理。“_RETURN”是局部数据元素(其仅在程序内具有含义)的示例。然而,即使是局部数据元素,也可以用于对“全局变量”进行赋值,可以控制程序的部分的执行,或者可以以创建数据流依赖性或控制流依赖性的某种其他方式使用。如果“_RETURN”的值依赖于其他数据元素,则这些依赖性可能进而影响“全局变量”或以其他方式创建要记录的依赖性。因此,尽管“_RETURN”不需要被包括在所创建的最终元数据存储中,但是在本文所描述的实施例中,可以在识别依赖性时考虑它。
[0126] 在此示例中,函数仅返回单个值。如果函数返回多个值,则可以更改“_RETURN”构造以容纳多于一个值。进一步地,应当理解,与用于表示其他依赖性构造的语法一样,“_RETURN”用作符号,此处将该符号格式化以供人类阅读。当在数据处理系统中实施时,任何合适的一个或多个符号可以被使用。
[0127]
[0128] 示例4:常数赋值
[0129] 代码中的依赖性,包括常数赋值,比如如下:
[0130]
[0131] f(){
[0132] int u;
[0133] int v;
[0134] u=2;
[0135] v=4;
[0136] return u+v;
[0137] }
[0138]
[0139] 可以被表达为:
[0140]
[0141] f4(){
[0142] _declare(u,v)
[0143] u[_CONST]
[0144] v[_CONST]
[0145] _RETURN[u,v]
[0146] }
[0147]
[0148] 在此示例中,“_declare”和“_CONST”是类似于“_RETURN”符号的其他特殊元素的符号。应当注意,在依赖性构造中,不包括关于常数变量“u”和“v”的值的信息。出于分析依赖性的目的,此类信息是不必要的,并且可以省略。
[0149] 在一些实施例中,可以省略构造“_CONST”,但是在一些实施例中,可以包括该构造以使人类更容易理解表示一个或多个程序的依赖性构造的集合,并且可以简化包含这些构造的数据结构的计算机处理。
[0150]
[0151] 示例5:调用点
[0152] 代码中的依赖性,包括对函数的调用,定义如下:
[0153]
[0154] g(x IN,y IN,z OUT){
[0155] z=x+y;
[0156] }
[0157] f(){
[0158] u=2;
[0159] v=4;
[0160] g(u,v,w);
[0161] return w;
[0162] }
[0163]
[0164] 可以由如下依赖性构造来表示:
[0165]
[0166] g1(x,y,z OUT){
[0167] z[x,y]
[0168] }
[0169] f5(){
[0170] _declare(u,v,w)
[0171] u[_CONST]
[0172] v[_CONST]
[0173] g1(u,v,w)
[0174] _RETURN[w]
[0175] }
[0176]
[0177] 此示例包括过程或函数调用点。在调用点将自变量供应给过程。充当自变量的数据实体可能影响其他数据元素的值,使得被调用的过程内的处理可能依赖于这些自变量。
[0178] 在此示例中,赋予了数据实体“u”和“v”常数值。因此,过程内的基于这些自变量的处理将产生常数结果,该结果可以在不指示对“u”和“v”的依赖性的情况下在依赖性构造中被捕获。在一些实施例中,可以在两阶段过程中生成依赖性信息,其中,第一阶段涉及语言相关处理,并且第二阶段涉及语言无关处理。
[0179] 在本文所描述的一些示例实施例中,可以在第二阶段的处理中识别并去除对局部变量的依赖性,从而导致最终依赖性信息是依据外部变量而不是作用域仅在程序内部的函数或其他代码块内部的局部变量来表达的。因此,在此示例中,在第一阶段处理中,变量“w”的依赖性、以及因此函数“f5()”所返回的值可以被表达为依赖于“u”和“v”。在第二阶段处理中,“u”和“v”以及函数“f5()”所返回的值可以被指示为依赖于常数。
[0180] 传播局部依赖性的这个过程可以在整个正被处理的程序中持续进行。当在程序中调用函数“f5()”时,可以将其所返回的值赋予另一个变量。在第一阶段的处理中,该变量可以被指示为依赖于函数“f5()”所返回的值。在第二阶段的处理中,对表示函数“f5()”所返回的值的局部变量的依赖性可以用对函数“f5()”所返回的值所依赖的全局变量的指示来代替。在此示例中,函数“f5()”所返回的值可以依赖于常数值。在函数“f5()”所返回的值依赖于外部变量的情况下,依赖性可以被记录为依赖于那些外部变量,而不是基于常数值。
[0181]
[0182] 示例6:具有常数自变量的调用点
[0183] 代码中的依赖性,包括对函数的调用,定义如下:
[0184]
[0185] add(x IN,y IN){
[0186] return x+y;
[0187] }
[0188] f(){
[0189] return add(2,4);
[0190] }
[0191]
[0192] 可以由如下依赖性构造来表示:
[0193]
[0194] add1(x,y){
[0195] _RETURN[x,y]
[0196] }
[0197] f6(){
[0198] _RETURN[add1(_CONST,_CONST)]
[0199] }
[0200]
[0201] 给定常数值的自变量可以如赋予了常数值的数据元素那样进行对待。
[0202]
[0203] 示例7:读取或写入全局表
[0204] 除了基本数据元素之外,对数据实体的操作也可以由如本文所描述的系统来处理。在一些实施例中,数据实体可以是分层级的。可以在层级结构的任何级别上对数据实体执行操作。因此,依赖性构造可以容纳在层级结构的任何适用级别上的数据实体的标识。一个这样的数据实体可以是例如全局表,其是数据集的示例。数据集可以在其内部包含其他数据实体。例如,表包括行和列,这些行和列可以被认为是数据实体。
[0205] 可以执行影响或依赖表本身的操作,从而可能影响表中的数据实体中的任何一个。表还具有行、列或其他细分,从而在层级结构中创建更低级别。操作可能仅影响或依赖细分(比如,行或列)内的数据元素。但是,依赖于数据集的任何子集的操作都是可能的,比如,对表的行或列中的单个数据元素的操作。
[0206] 为了在这样的层级结构中指定数据实体,可以使用元组符号。可以首先指定处于层级结构中最高级别的实体,接着指定处于层级结构中次高级别上的实体。作为具体示例,可以用“点”符号来指定元组,其中,“.”分隔形成元组的每个符号。在以下的示例中,元组的第一值(此处为“T1”)标识一个表。元组的第二值(此处为“C1”)标识该表中的一列。第二值可以可替代地标识一行。在一些实施例中,元组可以包括标识行和列两者的值,从而指定处于层级结构的甚至更低的级别上的数据元素。
[0207] 针对对这种表的操作的依赖性,如下:
[0208]
[0209] f(){
[0210] INSERT into T1.C2 SELECT from T1.C1
[0211] }
[0212]
[0213] 可以由如下依赖性构造来表达:
[0214]
[0215] 7(){
[0216] _declare(T1.C1,T1.C2)
[0217] T1.C2[T1.C1]
[0218] }
[0219]
[0220] 示例8:具有用作调用点处的自变量的多个元素的表达式
[0221] 通过调用函数创建的依赖性,定义如下:
[0222]
[0223] add(x,y){
[0224] return x+y;
[0225] }
[0226] f(u,v,w OUT){
[0227] w=add(u+v,6);
[0228] }
[0229]
[0230] 可以由如下依赖性构造来表达:
[0231]
[0232] add2(x,y){
[0233] _RETURN[x,y]
[0234] }
[0235]
[0236] f8(){
[0237] _declare(u,v,w)
[0238] w[add2([u,v],_CONST)]
[0239] }
[0240]
[0241] 此示例展示了在方括号“[]”中包含的依赖性源列表与圆括号“()”中包含的自变量之间的区别。
[0242]
[0243] 示例9:创建控制流依赖性的条件语句
[0244] 此示例展示了可以如何表示创建条件控制流的编程语句以进行依赖性分析。在此示例中,条件语句采用“if then…else”格式。此示例涉及包括如下这样的条件语句的函数:
[0245]
[0246] f(x in,y out){
[0247] if(x==0){
[0248] y=0;
[0249] }else{
[0250] y=1;
[0251] }
[0252] }
[0253]
[0254] 许多编程语言都支持这样的“if then…else”语句。在程序中此语句或任何语句的表达方式会因语言的不同而不同。由于提取模块316的处理可能是特定于一种编程语言的,因此可以通过配置提取模块来识别该模块将使用的采用特定语言的构造,从而解释“if then…else”语句因语言的不同而产生的任何表达方式的不同。这样的语句可以由如下依赖性构造来表达:
[0255]
[0256] 173:1 179:1f9(x,y OUT){
[0257] 174:5 178:5_condition[x,_const]
[0258] {
[0259] y[_const]
[0260] y[_const]
[0261] }
[0262] }
[0263]
[0264] 在此示例中,出于表达依赖性构造的目的,将来自“If”语句的“then”和“else”分支的内容合并为单个块。虽然在执行程序时将采用分支中的一个或者另一个,但是关于采用哪个分支的决定依赖于相同的数据实体,从而允许以相同的方式来表达“then”块和“else”块两者的依赖性。在此示例中,变量“x”的值指定采用哪个分支,因此,对于控制流,这两个分支都依赖于变量“x”。如上所述,该块的控制流依赖性可以被表达为“_condition[x]”。
[0265] 共享相同控制流依赖性的代码可以作为一个块进行处理。这样的处理是适当的,因为根据本文所描述的一些实施例,依赖性分析基于静态代码分析,并且识别在代码的执行中可能出现的依赖性。
[0266] 在此示例中,每个分支如果被执行,则将基于常数对变量“y”进行赋值。因此,一起考虑这两个分支仍然可以得出以下结论:在该代码块内,将赋予y依赖于常数的值。因此,函数所返回的值将依赖于常数,但是具体常数将依赖于x的值。这样的控制流依赖性和数据流依赖性可以被表达为“_condition[x,_CONST]”。
[0267] 本领域的技术人员将认识到,对于创建三个或更多可能控制流的编程构造,将存在有条件地执行的三个或更多代码块。这些代码块中的每个代码块的执行可能依赖于不同的变量。在这种情况下,针对每个块或者针对块的子集,编程构造可以由不同的依赖性构造来表示。
[0268]
[0269] 示例10:由“While Do”循环创建的控制流依赖性
[0270] 控制流依赖性也可以由实施“while do”循环的语句来创建。在这种循环的情况下,将在所声明的表达式被评估为真时执行代码块。在这种情况下,在该块与影响该表达式的值的任何数据实体之间都存在控制流依赖性。具有这种语句的函数的示例为:
[0271]
[0272] f(x,y OUT){
[0273] int y=0;
[0274] int i=0;
[0275] while(i<=x){
[0276] y=y+i;
[0277] i=i+1;
[0278] }
[0279]
[0280] 该函数中的依赖性可以被表达如下:
[0281]
[0282] f10(x,y OUT){
[0283] _declare i
[0284] y[_CONST]
[0285] i[_CONST]
[0286] _condition[i,x]
[0287] {
[0288] y[y,i]
[0289] i[i,_CONST]
[0290] }
[0291] }
[0292]
[0293] 在此示例中,“while do”循环内部的代码块可以至少被执行一次。因此,由该块内部的语句创建的依赖性将被表示在所提取的依赖性信息中。在该循环内可能更改的变量可能创建另外的依赖性,使得它们的值将依赖于该循环被执行的次数。在这种情况下,任何此类变量都将依赖于其值可能影响该循环被执行次数的任何数据实体。
[0294] 在此示例中,该循环被执行多次,该次数依赖于“i”和“x”的值。出于这个原因,条件被声明如下:“_condition[i,x]”,表示“i”和“x”的值可能会影响控制流。指示的是,条件下方的括号中的“y[y,i]”和“i[i,_CONST]”反映在该循环中可能更改的变量“y”和“i”中每一个都将具有依赖于该循环被执行的次数的值。
[0295] 由比如“for”、“while do”、“do until”、“switch”或“case”等其他条件语句创建的依赖性可以类似地由此条件-块构造表示。作为具体示例,“for”和“while do”获得条件和块;“do until”复制块的内容并将其置于条件/块上方,因为要保证该块中的代码被至少运行一次。
[0296]
[0297] 示例:11级调用树
[0298] 此示例展示了即使函数调用了其他函数,依赖性也可以由有限数量的构造表示。在此示例中,定义了三个函数,其中,第二函数“g()”调用了第一函数“h()”。第三函数“f()”进而调用了第二函数,如下:
[0299]
[0300] h(x,y OUT){
[0301] y=x*x;
[0302] }
[0303]
[0304] g(s,t OUT){
[0305] h(s,t);
[0306] }
[0307]
[0308] f(a,b OUT){
[0309] g(a,b);
[0310] }
[0311]
[0312] 此多级调用树可以采用以下方式来表达:表示调用另一函数的每个函数,其方式使得对另一函数的调用被捕获以进行后续处理:
[0313]
[0314] foo(x,y OUT){
[0315] y[x]
[0316] }
[0317]
[0318] bar(s,t OUT){
[0319] foo(s,t)
[0320] }
[0321]
[0322] baz(a,b OUT){
[0323] bar(a,b)
[0324] }
[0325]
[0326] 如从此示例可以看出的,不需要引入额外的构造即可在所提取的依赖性信息中表示程序中的多级调用树。相反,第一函数的依赖性是由如上所述的构造(此处为“y[x]”)来捕获的。其他函数以指示它们依赖于其他函数的方式记录在所提取的依赖性信息中。一个函数调用另一个函数可能引入的任何依赖性都可以在传播局部依赖性的后端(第二阶段)处理中解决。
[0327]
[0328] 示例11:递归
[0329] 与多级调用树一样,不需要额外的构造即可在所提取的依赖性信息中表示程序中的递归。相反,指示该递归的信息可以被存储为被降低的解析树的一部分,并且后端处理可以计算可能由该递归导致的任何额外依赖性。
[0330] 因此,递归地调用自身的函数,比如:
[0331]
[0332] f(x,y OUT){
[0333] int accumulator=0;
[0334] if(x==0)return accumulator;
[0335] else accumulator=accumulator+f(x-1,y);
[0336] }
[0337]
[0338] 在所提取的依赖性信息中可以由如下依赖性构造表达:
[0339]
[0340] f11(x,y OUT){
[0341] _declare accumulator
[0342] accumulator[_CONST]
[0343] _condition[x]{
[0344] y[accumulator]
[0345] accumulator[accumulator,f11(x,y)]
[0346] }
[0347] }
[0348]
[0349] 在此,变量“accumulator”被示出为依赖于常数,因为此变量被初始地设定为常数值“0”,并且该值可能一直不会被更改。另外,条件流依赖于变量“x”的值来指示。这种情况是由语句“if(x==0)”中的“if…else”构造导致的。在与该条件相关联的块内,可以基于“accumulator”的值对变量“y”赋值,而“accumulator”的值可以进而依赖于函数“F11()”。
[0350] 该信息即使不足以指定这些变量的值,也足以允许在后端处理中识别依赖性。
[0351]
[0352] 返回图3A,可以对每个程序执行前端处理。在此示例中,展示了程序310、320和350,但是在数据处理系统中可以存在任何数量的程序。这种处理的结果是分别针对每个程序的依赖性数据集318、338或358。每个依赖性数据集具有依赖性构造,比如以上针对依赖性数据集318所描述的依赖性构造320A、320B和320ZZ。其结果是,依赖性数据集包括关于解析树中反映的所选操作、特别是影响依赖性的操作的信息。那些所选操作可以由依赖性构造集来反映,依赖性构造集可以是相同的,而无论编写被处理用于生成依赖性数据集的程序所用的是什么源语言
[0353] 达到那些依赖性构造的具体处理可能会针对每种编程语言而不同。因此,可以使用本领域中已知的技术将解析器332配置用于生成适合于编写程序330所用的语言的解析树334。同样,解析器352可以被配置用于生成适合于编写程序350所用的语言的解析树354。
[0354] 还可以基于特定的编程语言配置提取模块(比如336和356)中的每一个。每个提取模块会将如上所述的依赖性构造输出为依赖性数据集。然而,到每个提取模块的输入可以依赖于可能产生依赖性的可执行语句以相关联的编程语言的表示方式而采用不同格式。
[0355] 图3B、图3C和图3D提供了这种前端处理的图示示例。在此示例中,代码段360(图3B)出现在正被处理的程序中。在此示例中,代码段360包含赋值语句“a=b+c”。该语句位于由条件语句“If(x=1){…}”定义的条件块中。此条件语句采用“If then…else”格式,其中,“else”为空。该语句定义在作为程序的一部分的函数中。该函数定义可以定义仅在该函数内使用的变量的作用域。
[0356] 可以在解析树368(图3C)的一部分中表示代码段360,而以类似的方式处理代码的其他段,以在解析树的其他部分中表示程序的其余部分(未示出)。在此示例中,节点370和节点370之下的节点在程序的作用域内、被指示为程序1。
[0357] 节点372指示在程序1内定义函数1。节点372和节点372之下的节点在函数作用域内、被指示为函数1。在此示例中,节点373和374直接在节点372之下,而其他节点在这两个节点之下。
[0358] 在此示例中,节点374指示数据流依赖性。节点373指示控制流依赖性。节点374表示在正被解析的程序中实施赋值的一个或多个语句。在此示例中,可以结合节点374记录这些语句的代码摘要375。如上文在示例中所展示的,此代码摘要可以是指向源代码文件中的行的一个或多个指针。可替代地或另外地,源代码摘要375可以包括代码行的副本或代码行的部分。该摘要中反映的代码行可以通过执行识别创建依赖性的代码语句以及在一些实施例中程序中提供该语句的上下文的附加语句的规则、启发式算法或选择逻辑的可执行表示来进行自动选择。例如,用于提供上下文的语句可以是在创建依赖性的语句之前和/或之后的固定数量的语句。可以基于创建该依赖性的语句的性质来选择附加语句或不同的语句。例如,如果该语句包含源变量,则摘要可以包括定义该变量的语句或为该变量赋值的最新语句,即使在程序中这些语句未出现在创建依赖性的正被录入为摘要的语句附近。
[0359] 节点376表示节点374中所表示的赋值的左侧。此示例展示了正被赋值的变量(目标变量)仅涉及一个变量(在此示例中为由节点378表示的变量“a”)。
[0360] 节点380表示语句的右侧,该语句生成赋予变量“a”的值。右侧包括运算,在这种情况下为加法,如节点382所指示的。加法运算具有两个输入,分别为变量“b”和“c”,如由节点392和394指示的。
[0361] 节点373表示函数1的控制流依赖性。与函数1相关联的控制依赖性指示,任何依赖于函数1的作用域内的运算的值都具有控制流依赖性,因为依赖于控制流,函数1中创建依赖性的语句可能会或可能不会在任何特定情况下执行。如节点379所展示的,该控制流依赖性基于变量“X”的值。在此示例中,依赖于X的值,如节点374所表示的对变量“a”的赋值可能会或可能不会发生。该控制流依赖性捕获与图3B中的“If then…else”语句相关联的条件执行。
[0362] 然后,可以将图3C中所展示的解析树的部分转换为依赖性构造396(图3D),该依赖性构造可以被包括在依赖性数据集中。在此,依赖性构造指示变量“a”是目标,并且其值依赖于源变量“b”和“c”。此示例中的命名法不同于上面的示例1的命名法,但也表示赋值。然而,应当理解,以上示例和图3B两者都以人类可读的形式展示了依赖性构造,并且可以使用其他形式。两者都展示了相同的依赖性构造,该构造可以针对计算机以计算机被编程用于识别和处理的任何方式进行编码。作为特定示例,依赖性信息可以被表示为针对每个目标变量的列表。每个列表可以包括目标所依赖的所有源变量。
[0363] 由依赖性构造396表示的解析的部分落入函数1的作用域内。如图3D通过作用域标识符“函数1”所展示的,该作用域可以与依赖性信息相关联。此作用域信息被格式化以便人类理解。应当理解,对于由计算机进行的处理,作用域信息可以以其他方式表示,比如通过将每个针对目标的源变量列表与作用域相关联。
[0364] 图3C中表示的控制流依赖性也可以反映在目标变量“a”的依赖性中。在图3D中由具有符号(在此示例中为“*”)的源变量“X”指示该控制流依赖性,以指示依赖性是控制流依赖性。与其他示例一样,该符号旨在是人类可读的。可以以任何合适的方式来捕获控制流依赖性以进行计算机处理,方式可以包括将符号(比如“*”)与列表中的源变量进行关联。可替代地或另外地,可以通过分别存储引起控制流依赖性的源变量或以任何其他合适的方式将它们与数据流依赖性的源变量隔离开来指示控制流依赖性。这样的数据存储技术可以用于基于控制流依赖性对数据流依赖性来区分处理的实施例。在不基于依赖性的性质来区分处理的实施例中,可以采用与数据流依赖性相同的方式来存储和处理控制流依赖性的源变量。可替代地,如果没有处理基于控制流依赖性来执行,则可以省略控制流依赖性。
[0365] 图3C展示了针对一个程序的仅一部分的以第二数据结构编码的依赖性信息。类似的处理可以在整个程序上执行。如果在数据处理系统中执行多个程序,则如图3A所示,可以对每个程序执行类似的处理。在本文所提供的示例中,程序被展示为独立地正被处理。但是,应当理解,程序可以调用在其他程序中定义的函数。在那种情况下,依赖性信息可以通过指示与变量相关联的作用域来表示一个程序中的变量依赖于另一个程序中的变量。
[0366] 导致如图3D中所展示的依赖性表示的处理可以指示局部变量的依赖性以及对局部变量的依赖性。由于局部变量仅存在于程序内,并且根据定义不会从程序输入或输出,因此在一些实施例中,可以从比如存储在元数据存储库110(图1A)中的依赖性信息中省略关于那些局部变量的信息。尽管如此,该局部依赖性信息可以在处理中被初始地捕获并且用于得出所存储的依赖性信息。
[0367] 图4提供了这种处理的示例,这种处理在完成语言相关的处理之后在后端被执行。处理被示出为由一个或多个语言无关的工具执行。降低模块(比如316、336或356)中的每一个可以以通用格式输出依赖性数据集318、338、358,使得后续处理可以是语言无关的。
[0368] 在图4的示例中,对依赖性数据集318、338、358的处理可以开始于依赖性处理模块410,该依赖性处理模块可以对局部依赖性和全局依赖性两者进行操作。处理可以创建所有变量的依赖性的列表或其他合适的表示,如上文结合图3D所讨论的。在一些实施例中,可以存储局部变量和外部变量的依赖性和/或对局部变量和外部变量的依赖性。然而,在一些实施例中,可以通过去除最终不使用的此类局部依赖性来实现数据处理系统的更高效的操作。
[0369] 因此,可以由传播局部依赖性的模块420来执行进一步处理。模块420传播然后去除局部依赖性。局部依赖性可以被标识为其值仅在程序内部作用域内的处理中使用,并且不从外部数据源加载或存储在外部数据源中的变量。作为具体示例,在以上示例11中,函数“g()”中的“s”和“t”的值不是从外部数据源存储或访问的。相反,s和t的值仅是从“x”得出的。如上所述,一旦处理完成,依赖于“s”或“t”的任何目标数据元素就仅需要指示其依赖于“x”。因此,可以删除对局部变量(比如“s”或“t”)的引用而不会丢失信息。类似地,也可以删除表示“s”或“t”的数据依赖性的数据,因为在某些实施例中不使用该数据。可以由模块420删除仅与局部依赖性相关的该信息。
[0370] 模块420可以通过遍历为程序存储的数据以确定变量是存在于程序外部还是仅用于内部计算来识别局部变量。如以上结合图3C所描述的,关于程序的信息可以以记录关于代码块的作用域信息的方式来存储。该作用域信息可以揭示嵌套,该嵌套是由具有内部作用域的代码为被指示为已经定义在具有外部作用域的其他代码中产生的。
[0371] 因此,模块420可以在每个最内层作用域处开始进行处理。模块420可以针对在该作用域内定义和/或使用的每个变量确定是否在该作用域的外部访问该变量。如果否,则该变量可以被标记为局部变量。如果被识别为局部变量的变量依赖于一个或多个变量,则这些变量的值可以替代局部变量作为任何依赖性构造中的源。
[0372] 在一些实例中,这种处理将导致将局部变量替换为外部变量作为依赖性的源。然而,在一些实例中,局部变量可以依赖于另一个局部变量。为了解释这种可能性,可以递归地执行由模块420进行的处理,使得在局部变量依赖于其他局部变量的实例中,将然后处理那些其他局部变量,直到该作用域内的所有局部变量都被依赖性表达式中的外部变量替换为止。
[0373] 可以对每个外部作用域重复该“传播”局部依赖性的过程,从最内层到最外层依次处理嵌套的作用域。应当理解,复杂的程序可能具有创建独立的作用域嵌套的许多部分。可以依次处理每个嵌套,直到处理完整个程序为止,从而用这些局部变量进而所依赖的外部变量来替换对局部变量的依赖性。
[0374] 在完成传播局部依赖性的此处理之后,除非要保留局部变量的依赖性,否则可以不再需要关于局部变量的依赖性的信息。因此,模块420可以删除局部变量的依赖性信息,或以其他方式以不对关于局部依赖性的信息进行后续处理的方式存储所保留的依赖性信息。
[0375] 加载器模块430可以将所保留的依赖性信息存储在元数据存储库450中。在图4所展示的实施例中,元数据存储库被指示为分别地存储数据依赖性452和控制依赖性454。然而,如以上所指出的,这样的信息可以存储在相同的数据结构中,其中,流控制依赖性与数据流依赖性分开标记。可替代地,在一些实施例中,可以不在数据流依赖性和控制流依赖性之间进行区分。
[0376] 加载器模块430可以将比如以上结合图3C所讨论的依赖性信息的表示转换为元数据存储库450的格式。作为具体示例,元数据存储库450可以将依赖性信息存储为指示每个目标变量所依赖的源变量的表或者列表的集合。该信息可以以允许数据处理系统生成数据沿袭图示200(图2)的方式来存储。
[0377] 另外,在一些实施例中,加载器模块430可以将代码摘要456存储在元数据存储库中。如上所述,当识别出产生依赖性的源代码语句时,可以将这些语句与依赖性构造关联地以以下方式存储在依赖性数据集中:单独地或者结合可以揭示关于该依赖性的信息的语句一起。该代码信息可以被全部或部分地存储为代码摘要456。例如,程序可以包含多个对变量进行赋值的实例。在一些实施例中,加载器模块430可以存储与这些实例中的每一个相关联的代码。可替代地或另外地,加载器模块430可以选择性地存储仅与这些实例中的一些相关联的代码。例如,加载器模块430可以被编程用于选择与这种赋值的一个第一实例或者多个第一实例相关联的代码,直到代码摘要达到预定大小为止,或者可以应用规则或编码的启发式算法来选择最可能被开发者访问的实例。然而,这种选择可以由加载器模块430以任何合适的方式进行,以便限制每个代码摘要的大小。可替代地或另外地,这种选择可以由结合图3A描述的降低模块或在任何其他合适的组件中进行。
[0378] 无论如何进行选择,存储可能已经引起数据元素或特定代码块的依赖性的代码的标识都可以使得数据处理系统向比如用户102(图1A)等开发者提供附加功能。例如,代码摘要456可以由程序员用于修改或调试程序,以试图理解具有意外值的变量是如何被赋予了该值的。
[0379] 图5是根据本文所描述的技术的一些实施例的用于生成依赖性信息的说明性过程500的流程图。过程500可以由任何合适的系统和/或(多个)计算装置来执行,并且例如,可以由参照图1A描述的数据处理系统105来执行,利用上文结合图3A和图4描述的模块来编程。
[0380] 过程500开始于前端处理510。前端处理510可以对将用于配置数据处理系统的每个程序执行。
[0381] 在前端处理510内,处理在动作502处开始,在该动作中,为正被处理的程序选择解析器。可以基于正被处理的具体程序的编程语言来选择解析器。根据一些实施例,数据处理系统可以存储针对数据处理系统支持的每种编程语言的解析器。在其他实施例中,数据处理系统可以包含能够生成针对任何这样的编程语言的解析器的解析器生成器,并且数据处理系统可以被配置用于通过提供语法文件或关于解析器生成器使用的编程语言的其他信息来处理用期望的语言编写的程序。
[0382] 在动作504处,可以使用所选解析器来解析程序。动作504的结果可以是程序的解析树。
[0383] 在动作506处,可以降低解析树。如上所述,降低解析树可以由针对正被处理的程序的编程语言所配置的降低模块来执行。降低动作的结果可以是存储针对程序内的数据元素和代码块的依赖性构造的数据结构。
[0384] 在动作508处,如果必要,可以可选地组合为所有程序(比如图1A的程序109)生成的依赖性数据集。在一些实施例中,用一种语言编写的程序可以调用函数或以其他方式并入用另一种编程语言编写的代码以实施整体数据处理功能。因此,可以组合通过独立地处理每个程序而生成的解析树,以表示此类操作。组合后的依赖性数据集可以是前端的输出,该输出被传递到后端处理520。可替代地或另外地,在后端处理期间,可以通过针对每个目标变量识别该变量可能依赖的源变量而不管哪个程序包含创建那些依赖性的语句来组合针对不同程序准备的解析树。
[0385] 在后端处理520内,处理在动作522处开始。在动作522中,识别局部依赖性。对于具有嵌套的作用域的程序,可以首先对程序的表示最内层作用域的每个部分执行此处理。可以以任何合适的方式来执行局部变量的识别,比如通过访问在解析操作期间针对每个变量的建立的表。该表可以指示变量在何处被访问或修改,使得可以将仅具有正被处理的作用域的被访问或修改的变量识别为该作用域局部的变量。
[0386] 在动作524处,可以传播局部依赖性。局部依赖性的传播可以涉及用对局部变量所依赖的外部变量的依赖性代替基于局部变量的依赖性。
[0387] 过程进行到判定框530,在此,过程依赖于正被处理的作用域是否是外部作用域而分岔。如果否,则过程分岔回到动作522,在该动作中,重复识别和传播局部变量的动作。以这种方式,处理程序的从最内层作用域开始并进行到最外层作用域的部分。
[0388] 一旦所有最外层作用域都被达到,则处理分岔到动作532。在动作532处,可以删除关于局部变量的依赖性信息。
[0389] 在动作534处,可以将其余信息存储在元数据存储库中或者存储在任何其他合适的位置以供以后使用。
[0390] 图5所展示的过程500可以在任何合适的计算系统环境中执行。图6示出了可以在其上实施本文所描述的技术的合适计算系统环境700的示例。计算系统环境700仅是合适的计算环境的一个示例,并且不旨在对本文所描述的技术的使用或功能的范围提出任何限制。也不应当将计算环境700解释为具有与示例性操作环境700中展示的组件中的任何一个或组合相关的任何依赖性或要求。
[0391] 本文所描述的技术与许多其他通用或专用计算系统环境或配置一起操作。可以适合与本文所描述的技术一起使用的众所周知的计算系统、环境和/或配置的示例包括但不限于:个人计算机、服务器计算机、手持或膝上型装置、多处理器系统、基于微处理器的系统、机顶盒、可编程消费电子产品、网络PC、小型计算机、大型计算机、包括上述系统或装置中任一个的分布式计算环境等。
[0392] 计算环境可以执行计算机可执行指令,比如程序模块。通常,程序模块包括执行特定任务或实施特定抽象数据类型的例程、程序、对象、组件、数据结构等。本文所描述的技术还可以在分布式计算环境中实践,其中任务由通过通信网络链接的远程处理装置执行。在分布式计算环境中,程序模块可以位于包括存储器存储装置的本地和远程计算机存储介质中。
[0393] 参照图6,用于实现本文所描述的技术的示例性系统包括呈计算机710形式的通用计算装置。计算机710的组件可以包括但不限于处理单元720、系统存储器730、以及将包括系统存储器的各种系统组件耦合到处理单元720的系统总线721。系统总线721可以是包括存储器总线或存储器控制器、外围总线和使用各种总线架构中的任何架构的本地总线的若干类型的总线结构中的任何总线结构。通过举例而不是进行限制,这种架构包括工业标准架构(ISA)总线、微通道架构(MCA)总线、增强ISA(EISA)总线、视频电子标准协会(VESA)本地总线、以及外围组件互连(PCI)总线(也称为夹层(Mezzanine)总线)。
[0394] 计算机710通常包括各种计算机可读介质。计算机可读介质可以是可由计算机710访问的任何可用介质,并且包括易失和非易失介质、可移除和不可移除介质。通过举例而非限制,计算机可读取介质可以包括计算机存储介质和通信介质。计算机存储介质包括以任何方法或技术实施的用于存储比如计算机可读指令、数据结构、程序模块、或其他数据等信息的易失性和非易失性介质、可移除和不可移除介质。计算机存储介质包括但不限于RAM、ROM、EEPROM、闪存存储器或其他存储器技术、CD-ROM、数字通用盘(DVD)或其他光盘存储装置、磁带盒、磁带、磁盘存储装置或其他磁存储装置、或者可用于存储期望信息并可由计算机710访问的任何其他介质。通信介质通常以比如载波或其他传输机制等已调制数据信号来体现计算机可读指令、数据结构、程序模块或其他数据,并且包括任何信息递送介质。术语“已调制数据信号”是指以编码信号中的信息的这种方式使其特征中的一个或多个被设置或改变的信号。通过举例而非限制,通信介质包括有线介质(比如有线网络或直接有线连接)以及无线介质(比如声学、RF、红外线及其他无线介质)。上述中的任一个的组合也应包括在计算机可读介质的范围内。
[0395] 系统存储器730包括呈易失性和/或非易失性存储器形式的计算机存储介质,比如只读存储器(ROM)731和随机存取存储器(RAM)732。包含比如在启动期间帮助在计算机710内的元件之间传输信息的基本例程的基本输入/输出系统733(BIOS)通常存储在ROM 731中。RAM 732通常包含可由处理单元720立即访问和/或当前操作的数据和/或程序模块。作为示例且非限制,图7示出了操作系统734、应用程序735、其他程序模块736和程序数据737。
[0396] 计算机710还可以包括其他可移除/不可移除、易失性/非易失性计算机存储介质。仅作为示例,图7示出了读取或写入不可移除的非易失性磁介质的硬盘驱动器741、读取或写入可移除非易失性存储器752(比如闪存存储器)的闪存驱动器751、以及读取或写入可移除的非易失性光盘756(比如CD ROM或其他光学介质)的光盘驱动器755。可以用于示例性操作环境中的其他可移除/不可移除、易失性/非易失性计算机存储介质包括但不限于磁带盒、闪存卡、数字通用盘、数字录像带、固态RAM、固态ROM等。硬盘驱动器741通常通过比如接口740等不可移除存储器接口连接至系统总线721,并且磁盘驱动器751和光盘驱动器755通常由比如接口750等可移除存储器接口连接至系统总线721。
[0397] 上面讨论并在图7中展示的驱动器及其相关联的计算机存储介质为计算机710提供了计算机可读指令、数据结构、程序模块和其他数据的存储。例如,在图7中,硬盘驱动器741被展示为存储操作系统744、应用程序745、其他程序模块746和程序数据747。注意,这些组件与操作系统734、应用程序735、其他程序模块736以及程序数据737可以是相同或不同的。这里给予了操作系统744、应用程序745、其他程序模块746和程序数据747不同的编号,以展示至少他们是不同的副本。用户可以通过比如键盘762和定点装置761(通常称为鼠标轨迹球触摸板)的输入装置将命令和信息输入到计算机710中。其他输入装置(未示出)可以包括麦克风、操纵杆、游戏手柄、圆盘式卫星天线、扫描仪等。这些和其他输入装置通常通过耦合到系统总线的用户输入接口760连接到处理单元720,但可以由比如并行端口、游戏端口或通用串行总线(USB)等其他接口和总线结构来连接。监视器791或其他类型的显示装置也经由比如视频接口790等接口连接至系统总线721。除了监视器之外,计算机还可以包括可通过输出外围接口795连接的其他外围输出装置,比如扬声器797和打印机796。
[0398] 计算机710可以使用与一个或多个远程计算机(比如远程计算机780)的逻辑连接在联网环境中操作。远程计算机780可以是个人计算机、服务器、路由器、网络PC、对等装置、或其他常见网络节点,并且通常包括以上描述的相对于计算机710的元件中的许多或全部,尽管在图7中仅展示了存储器存储装置781。图7中描绘的逻辑连接包括局域网(LAN)771和广域网(WAN)773,但是还可包括其他网络。这种联网环境在办公室、企业范围计算机网络、内联网和互联网中是普遍的。
[0399] 当在LAN联网环境中使用时,计算机710通过网络接口或适配器770连接到LAN 771。当在WAN联网环境中使用时,计算机710通常包括调制解调器772或用于通过比如互联网等WAN 773建立通信的其他装置。调制解调器772可以是内置的或外置的,其可以经由用户输入接口760或其他适当的机制连接到系统总线721。在联网环境中,相对于计算机710描绘的程序模块或是其部分可以存储在远程存储器存储装置中。作为示例且非限制,图7展示了远程应用程序785驻留在存储器装置781上。应当理解,所示出的网络连接是示例性的,并且可以使用在计算机之间建立通信链路的其他手段。
[0400] 如此描述了本发明的至少一个实施例的若干方面之后,应当理解,本领域技术人员会容易想到各种变更、修改以及改进。
[0401] 这种变更、修改以及改进旨在是本披露内容的一部分、并且旨在落入本发明的精神和范围之内。此外,尽管指示了本发明的优点,但应当理解,并非本文所描述的技术的每个实施例都将包括每个描述的优点。一些实施例可以不实施在本文中描述为有利的任何特征,并且在一些情况下,可以实施描述的特征中的一个或多个以实现进一步的实施例。因而,先前的描述和附图仅是通过举例的方式。
[0402] 本文所描述的技术的上述实施例可以以多种方式中的任一种来实施。例如,可以使用硬件、软件或其组合来实施这些实施例。当在软件中实施时,可以在任何适合的处理器或处理器集合上执行软件代码,无论该处理器或处理器集合是设置在单个计算机中还是分布在多个计算机中。这类处理器可以被实施为集成电路(其中集成电路组件中具有一个或多个处理器),包括名称为比如CPU芯片、GPU芯片、微处理器、微控制器协处理器的本领域已知的商用集成电路组件。可替代地,处理器可以以定制电路系统(比如ASIC)或者通过配置可编程逻辑装置产生的半定制电路系统来实施。作为又一替代方案,处理器可以是较大电路或半导体装置的一部分,无论是商用的、半定制的还是定制的。作为具体示例,一些商用微处理器具有多个核,使得这些核中的一个或子集可以构成处理器。但是,一个处理器可以使用任何适合形式的电路来实施。
[0403] 进一步地,应当了解,计算机可以体现为多种形式中的任何形式,比如机架式计算机、台式计算机、膝上型计算机或平板计算机。另外,计算机可以嵌入在通常不被认为是计算机但具有适合的处理能力的装置中,该装置包括个人数字助理(PDA)、智能手机或任何其他适合的便携式或固定式电子装置。
[0404] 而且,计算机可以具有一个或多个输入装置和输出装置。这些装置可以尤其用于呈现用户接口。可以用于提供用户接口的输出装置的示例包括用于对输出进行视觉呈现的打印机或显示屏,以及扬声器或用于对输出进行听觉呈现的其他声音生成装置。可以用于用户接口的输入装置的示例包括键盘和指向装置,比如鼠标、触摸板以及数字化平板。作为另一个示例,计算机可以通过语音识别或以其他可听格式接收输入信息。
[0405] 这种计算机可以由采用任何合适的形式的一个或多个网络来互连,该一个或多个网络包括局域网或广域网,比如企业网或互联网。这种网络可以基于任何合适的技术并且可以根据任何合适的协议来运行,并且可以包括无线网络、有线网络或光纤网络。
[0406] 而且,本文中概括的各种方法或过程可以被编码为在采用各种操作系统或平台中的任一种的一个或多个处理器上可执行的软件。另外,这种软件可以使用多种合适的编程语言和/或编程或脚本工具中的任一种来编写,并且还可以被编译为可执行的机器语言代码或在框架虚拟机上执行的中间代码。
[0407] 在这方面,本发明可以被体现为用一个或多个程序进行编码的计算机可读存储介质(或多个计算机可读介质)(例如,计算机存储器、一个或多个软盘、压缩光盘(CD)、光盘、数字视频盘(DVD)、磁带、闪存存储器、现场可编程阵列或其他半导体装置中的电路配置、或其他有形计算机存储介质),该一个或多个程序在一个或多个计算机或其他处理器上执行时执行实施以上讨论的本发明的各种实施例的方法。如从前文示例将清楚明白,计算机可读存储介质可以将信息保留足够的时间,以便提供采用非暂时形式的计算机可执行指令。这种计算机可读存储介质可以是可运送的,使得其上存储的一个或多个程序可以载入到一个或多个不同的计算机或其他处理器上,以实施如上讨论的本发明的各个方面。如本文使用的,术语“计算机可读存储介质”仅涵盖可被看作是制品(即,制造物品)或机器的非暂态计算机可读介质。可替代地或另外,本发明可以体现为除了计算机可读存储介质之外的计算机可读介质,比如传播信号。
[0408] 术语“程序”或“软件”在本文中在一般意义上使用,以指代任何类型的计算机代码或计算机可执行指令集,这些计算机可执行指令集可以被用来对计算机或其他处理器进行编程以实施如上讨论的本发明的各个方面。另外,应该理解,根据此实施例的一个方面,当被执行时执行本发明的方法的一个或多个计算机程序不必驻留在单个计算机或处理器上,但可以按照模块的方式分布在多个不同的计算机或处理器中以实施本发明的各个方面。
[0409] 计算机可执行指令可以呈由一个或多个计算机或其他装置执行的许多形式,比如程序模块。通常,程序模块包括执行特定任务或实施特定抽象数据类型的例程、程序、对象、组件、数据结构等。通常,程序模块的功能可以如各个实施例所期望的而组合或分布。
[0410] 而且,数据结构可以以任何合适的形式存储在计算机可读介质中。为了简化说明,可以将数据结构示出为具有通过数据结构中的位置而相关的字段。这种关系同样可以通过为用于字段的存储分配传达字段之间关系的计算机可读介质中的位置来实现。然而,可以使用任何合适的机制来建立数据结构的字段中的信息之间的关系,包括通过使用指针、标签、或建立数据元素之间的关系的其他机制。
[0411] 本发明的各个方面可以单独使用、组合使用、或以前文所述的实施例中未确切讨论的各种布置使用,并且因此在其应用中不局限于其在前文描述中所阐述或附图中所展示的组件的细节和布置。例如,一个实施例中描述的方面可以以任何方式与其他实施例中描述的方面组合。
[0412] 而且,本发明可以体现为其示例已被提供的一种方法。作为该方法的一部分而执行的动作可以以任何适合的方式排序。因此,可以构造实施例,在这些实施例中,动作以与所展示的顺序不同的顺序执行,这些动作可以包括同时执行一些动作,即使这些动作在说明性实施例中被示出为连续动作。
[0413] 进一步地,一些动作被描述为由“用户”做出。应当理解,“用户”不必是单个个人,并且在一些实施例中,可归因于“用户”的动作可以由个人团队和/或个人与计算机辅助工具或其他机构的组合来执行。
[0414] 在权利要求中使用比如“第一”、“第二”、“第三”等的序数术语来修饰权利要求要素本身并不意味着一个权利要求要素优先于另一个权利要求要素的任何优先级、优先权或顺序,或者执行方法的动作的时间顺序,但仅用作标签以将具有特定名称的一个权利要求要素与具有同一名称的另一个要素进行区分(但为了使用序数术语)以区分权利要求要素。
[0415] 而且,在本文中使用的措辞和术语是用于描述的目的,而不应当被视为是限制性的。本文使用的“包括(including)”、“包括(comprising)”或“具有(having)”、“包含(containing)”、“涉及(involving)”及其变化形式旨在涵盖其后所列的项和其等效形式,以及其他项。
高效检索全球专利

专利汇是专利免费检索,专利查询,专利分析-国家发明专利查询检索分析平台,是提供专利分析,专利查询,专利检索等数据服务功能的知识产权数据服务商。

我们的产品包含105个国家的1.26亿组数据,免费查、免费专利分析。

申请试用

分析报告

专利汇分析报告产品可以对行业情报数据进行梳理分析,涉及维度包括行业专利基本状况分析、地域分析、技术分析、发明人分析、申请人分析、专利权人分析、失效分析、核心专利分析、法律分析、研发重点分析、企业专利处境分析、技术处境分析、专利寿命分析、企业定位分析、引证分析等超过60个分析角度,系统通过AI智能系统对图表进行解读,只需1分钟,一键生成行业专利分析报告。

申请试用

QQ群二维码
意见反馈