CN113296777A - 依赖分析和程序编译方法、设备及存储介质 - Google Patents
依赖分析和程序编译方法、设备及存储介质 Download PDFInfo
- Publication number
- CN113296777A CN113296777A CN202010280806.6A CN202010280806A CN113296777A CN 113296777 A CN113296777 A CN 113296777A CN 202010280806 A CN202010280806 A CN 202010280806A CN 113296777 A CN113296777 A CN 113296777A
- Authority
- CN
- China
- Prior art keywords
- program
- target file
- analyzed
- source code
- dependency relationship
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/44—Encoding
Landscapes
- Engineering & Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Stored Programmes (AREA)
Abstract
本申请实施例提供一种依赖分析和程序编译方法、设备及存储介质。在本申请一些实施例中,可根据待分析程序的源代码编译得到的目标文件和其它源代码编译得到的目标文件,确定待分析程序依赖的未定义符号,并从其它源代码对应的目标文件中,确定与未定义符号具有依赖关系的目标文件;之后,依据与未定义符号具有依赖关系的目标文件,生成待分析程序的源代码与其它源代码之间的依赖关系。由于待分析程序的目标文件为待分析程序的源代码完整的编译结果,因此,基于待分析程序的目标文件和其它源代码的目标文件之间的依赖关系,生成待分析程序的源代码与其它源代码之间的依赖关系,有助于提高依赖分析的完整性和准确性。
Description
技术领域
本申请涉及数据处理技术领域,尤其涉及一种依赖分析和程序编译方法、设备及存储介质。
背景技术
在软件开发过程中,经常会依赖现有代码库,这样可减少开发工作量。如果将软件所依赖的代码库中的代码全部编译,代码编译过程开销巨大;且最终产生的静态库文件体积较大,不便于软件的分发。
为了解决上述问题,在现有技术中,利用代码头文件,分析主程序所依赖的所有头文件。但是,这种依赖分析方式得到的依赖关系不完整,进而导致后续基于该依赖关系对软件进行编译时,编译出错。
发明内容
本申请的多个方面提供一种依赖分析和程序编译方法、设备及存储介质,用以提高依赖分析的完整性和准确性,进而有助于提高后续基于依赖分析结果进行程序编译的准确性。
本申请实施例提供一种依赖分析方法,包括:
对待分析程序的源代码和其它源代码分别进行编译,得到所述待分析程序的第一目标文件和所述其它源代码的至少一个第二目标文件;
根据所述第一目标文件和所述至少一个第二目标文件,确定所述待分析程序依赖的未定义符号;
从所述至少一个第二目标文件中,确定与所述未定义符号具有依赖关系的第三目标文件;
依据所述第三目标文件,生成所述待分析程序的源代码与所述其它源代码之间的依赖关系。
本申请实施例还提供一种程序编译方法,包括:
获取待编译程序的源代码与其它源代码之间的依赖关系;所述依赖关系是根据所述待编译程序所依赖的符号中的未定义符号确定的;
根据所述依赖关系,对所述待编译程序的源代码进行编译,得到所述待编译程序的目标文件;
对所述目标文件进行代码链接,得到所述待编译程序的可执行文件。
本申请实施例还提供一种计算机设备,包括:存储器和处理器;其中,所述存储器,用于存储计算机程序;
所述处理器耦合至所述存储器,用于执行所述计算机程序以用于:对待分析程序的源代码和其它源代码分别进行编译,得到所述待分析程序的第一目标文件和所述其它源代码的至少一个第二目标文件;根据所述第一目标文件和所述至少一个第二目标文件,确定所述待分析程序依赖的未定义符号;并从所述至少一个第二目标文件中,确定与所述未定义符号具有依赖关系的第三目标文件;以及依据所述第三目标文件,生成所述待分析程序的源代码与所述其它源代码之间的依赖关系。
本申请实施例还提供一种计算机设备,包括:存储器和处理器;其中,所述存储器,用于存储计算机程序;
所述处理器耦合至所述存储器,用于执行所述计算机程序以用于:获取待编译程序的源代码与其它源代码之间的依赖关系;所述依赖关系是根据所述待编译程序所依赖的符号中的未定义符号确定的;根据所述依赖关系,对所述待编译程序的源代码进行编译,得到所述待编译程序的第一目标文件;并对所述第一目标文件进行代码链接,得到所述待编译程序的可执行文件。
本申请实施例还提供一种存储有计算机指令的计算机可读存储介质,当所述计算机指令被一个或多个处理器执行时,致使所述一个或多个处理器执行上述各方法中的步骤。
在本申请实施例中,可根据待分析程序的源代码编译得到的目标文件和其它源代码编译得到的目标文件,确定待分析程序依赖的未定义符号,并从其它源代码对应的目标文件中,确定与未定义符号具有依赖关系的目标文件;之后,依据与未定义符号具有依赖关系的目标文件,生成待分析程序的源代码与其它源代码之间的依赖关系。由于待分析程序的目标文件为待分析程序的源代码完整的编译结果,因此,基于待分析程序的目标文件和其它源代码的目标文件之间的依赖关系,生成待分析程序的源代码与其它源代码之间的依赖关系,有助于提高依赖分析的完整性和准确性。
附图说明
此处所说明的附图用来提供对本申请的进一步理解,构成本申请的一部分,本申请的示意性实施例及其说明用于解释本申请,并不构成对本申请的不当限定。在附图中:
图1a和图1b为本申请实施例提供的依赖分析方法的流程示意图;
图2和图3为本申请实施例提供的程序编译方法的流程示意图;
图4和图5为本申请实施例提供的计算机设备的结构示意图。
具体实施方式
为使本申请的目的、技术方案和优点更加清楚,下面将结合本申请具体实施例及相应的附图对本申请技术方案进行清楚、完整地描述。显然,所描述的实施例仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
针对现有依赖分析方式无法得到完整的依赖关系的技术问题,在本申请一些实施例中,可根据待分析程序的源代码编译得到的目标文件和其它源代码编译得到的目标文件,确定待分析程序依赖的未定义符号,并从其它源代码对应的目标文件中,确定与未定义符号具有依赖关系的目标文件;之后,依据与未定义符号具有依赖关系的目标文件,生成待分析程序的源代码与其它源代码之间的依赖关系。由于待分析程序的目标文件为待分析程序的源代码完整的编译结果,因此,基于待分析程序的目标文件和其它源代码的目标文件之间的依赖关系,生成待分析程序的源代码与其它源之间的依赖关系,有助于提高依赖分析的完整性和准确性。
以下结合附图,详细说明本申请各实施例提供的技术方案。
应注意到:相同的标号在下面的附图以及实施例中表示同一物体,因此,一旦某一物体在一个附图或实施例中被定义,则在随后的附图和实施例中不需要对其进行进一步讨论。
图1a为本申请实施例提供的一种依赖分析方法的流程示意图。如图1a所示,该方法包括:
101、对待分析程序的源代码和其它源代码分别进行编译,得到待分析程序的第一目标文件和其它源代码的至少一个第二目标文件。
102、根据第一目标文件和至少一个第二目标文件,确定待分析程序依赖的未定义符号。
103、从至少一个第二目标文件中,确定与未定义符号具有依赖关系的第三目标文件。
104、依据第三目标文件,生成待分析程序的源代码与其它源代码之间的依赖关系。
在程序开发过程中,为了减少开发工作量,开发人员在开发过程中,可引用他人开发的源代码,这种引用关系,也可称为依赖关系,即实现开发人员开发的程序功能的实现依赖于他人开发的源代码。例如,可引用代码库中的源代码等。在程序开发完成后,还需对程序进行编译生成可执行文件,才可实现程序功能。
在程序编译时,可将待编译程序所依赖的代码库完整地编译成静态库,最终链接到待编译程序中。但此过程需要完整编译所依赖的全部代码,非常耗时;且最终产生的静态库文件体积较大,不便于软件的分发。
在实际软件开发过程中,待编译程序可能只依赖其它源代码中的部分源代码,例如,图1b所示,待分析程序依赖代码库中的部分源代码,即代码库中待分析程序真实依赖的源代码,基于此,为了减少待编译程序进行编译所消耗的时间,提高编译效率,可先分析待编译程序的源代码和其它源代码之间的依赖关系,之后,只对其它源代码中与待编译程序存在依赖关系的源代码进行编译,而无需对所有其它源代码进行编译,可减少编译代码的工作量,从而减少待编译程序的代码编译时间,有助于提高代码编译效率。
其中,其它源代码是指待编译程序所引用的其它开发完成的源代码,例如代码库中的源代码等。
为了分析待编译程序的源代码与其它源代码之间的依赖关系,本实施例提供一种依赖分析方法,下面对本申请实施例提供的依赖分析方法进行说明。
在本实施例步骤101中,可对待分析程序的源代码进行编译,得到待分析程序的目标文件(object文件);还可对其它源代码进行编译,得到其它源代码的目标文件。为了便于描述和区分,在本申请实施例中,将待分析程序的目标文件定义为第一目标文件,并将其它源代码的目标文件定义为第二目标文件。例如,图1b中在代码编译阶段,对待分析程序的源代码和代码库中的源代码分析进行编译,得到待分析程序的第一目标文件以及代码库的第二目标文件。
其中,待分析程序的源代码包括1个或多个源代码文件,相应地,待分析程序的第一目标文件的数量也为1个或多个。1个源代码文件可对应1个第一目标文件。在本申请实施例中,多个是指2个或2个以上。
其它源代码可包括1个或多个(即至少一个)源代码文件,相应地,其它源代码的第二目标文件的数量也为1个或多个,即第二目标文件为至少一个。1个源代码文件可对应1个第二目标文件。
进一步,在步骤102中,可根据第一目标文件和至少一个第二目标文件,确定待分析程序依赖的未定义符号(undefined symbol)。未定义符号是指:类型(Type)为未定义的符号,具体指第一目标文件所引用的,但其值未在第一目标文件中定义的符号。
其中,待分析程序依赖的未定义符号可包括:待分析程序直接依赖的未定义符号和间接依赖的未定义符号。待分析程序直接依赖的未定义符号是指:待分析程序的第一目标文件中包含的未定义符号。待分析程序间接依赖的未定义符号是指:与待分析程序的第一目标文件中包含的未定义符号关联的未定义符号。例如,与第一目标文件中包含的未定义符号存在关联关系的第二目标文件中的未定义符号等。
由于除未定义符号之外的其它类型的符号,通常指定义出的函数、全局变量等,为待分析程序的开发者自定义的符号,而未定义符号为待分析程序引用的其它源代码编译得到的目标代码符号,基于此,为了分析待分析程序的源代码与其它源代码之间的依赖关系,可从其它源代码的至少一个第二目标文件中,确定与待分析程序依赖的未定义符号具有依赖关系的第三目标文件。其中,第三目标文件可为至少一个第二目标文件中的部分或全部目标文件。第三目标文件的数量的具体数量可为待分析程序所引用的其它源代码而确定。
在本申请实施例中,不限定确定所述待分析程序依赖的未定义符号以及确定与所述未定义符号具有依赖关系的第三目标文件的具体实施方式,也不限定步骤102和103的先后执行顺序。可选地,步骤102和103可并行执行,也可顺序执行。当步骤102和103顺序执行时,不限定二者执行的先后顺序。
可选地,可对待分析程序的第一目标文件包含的符号的类型进行分析,以识别出第一目标文件包含的未定义符号。在本实施例中,为了便于描述和区分,将第一目标文件包含的未定义符号,定义为基准未定义符号。进一步,可根据基准未定义符号和其它源代码编译得到的至少一个第二目标文件,确定待分析程序依赖的未定义符号。
进一步,可对其它源代码编译得到的至少一个第二目标文件进行扫描,得到至少一个第二目标文件包含的符号;并根据基准未定义符号和至少一个第二目标文件包含的符号,确定待分析程序依赖的未定义符号。
可选地,进入依赖传递分析阶段,可从至少一个第二目标文件中,确定包含基准未定义符号的基准目标文件,并从基准目标文件中识别出除基准未定义符号之外的其它未定义符号。之后,将识别出的其它未定义符号作为新的基准未定义符号,并循环执行上述基准未定义符号的基准目标文件的操作,直至不再出现新的未定义符号为止,并将循环停止时已识别出的未定义符号作为待分析程序依赖的未定义符号。相应地,将每次循环得到的基准目标文件作为与未定义符号具有依赖关系的第三目标文件。其中,如图1b所示,第三目标文件包括:与第一目标文件存在直接依赖关系的第二目标文件,以及与第一目标文件存在间接依赖关系的第二目标文件。其中,与第一目标文件存在直接依赖关系的第二目标文件是指:待分析程序直接依赖的未定义符号所在的第二目标文件;与第一目标文件存在间接依赖关系的第二目标文件是指:待分析程序间接依赖的未定义符号所在的第二目标文件,如图1b中的间接依赖1和间接依赖2。或者,在依赖传递分析阶段,也可将第一目标文件包含的基准未定义符号基准未定义符号加入未定义符号集,从未定义符号集中依次读取未定义符号在至少一个第二目标文件中进行匹配,确定包含未定义符号的基准目标文件。之后,从基准目标文件中识别出除基准未定义符号之外的其它未定义符号,将识别出的其它未定义符号加入未定义符号集,并循环执行上述确定包含未定义符号的基准目标文件的操作,直至未定义符号集为空集为止。相应地,将每次循环确定出的基准目标文件作为第三目标文件,并将每次循环得到的第三目标文件中包含的未定义符号,作为待分析程序依赖的未定义符号。
进一步,在步骤104中,进入反向构建依赖关系阶段,可依据与待分析程序依赖的未定义符号具有依赖关系的第三目标文件,生成待分析程序的源代码与其它源代码之间的依赖关系。
可选地,由于第三目标文件是其它源代码进行编译得到的,因此可根据第三目标文件,从其它源代码中,确定第三目标文件对应的目标源代码,并生成待分析程序的源代码与目标源代码之间的依赖关系,从而实现了基于待分析程序的目标文件与其它源代码的目标文件之间的依赖关系,反向构建出待分析程序的源代码与其它源代码之间的依赖关系。例如,如图1b所示,可根据与第一目标文件存在直接依赖关系的第二目标文件,从代码库中确定与第一目标文件存在直接依赖关系的第二目标文件对应的源代码1;并根据与间接依赖关系的第二目标文件(间接依赖1和间接依赖2),从代码库中确定与间接依赖关系的第二目标文件的源代码(源代码1.1和源代码1.2);之后,基于待分析程序的源代码与代码库中与待分析程序存在依赖关系的源代码(源代码1、源代码1.1和源代码1.2),反向构建出待分析程序的源代码和代码库中的源代码之间的依赖关系。
在本实施例中,可根据待分析程序的源代码编译得到的目标文件和其它源代码编译得到的目标文件,确定待分析程序依赖的未定义符号,并从其它源代码对应的目标文件中,确定与未定义符号具有依赖关系的目标文件;之后,依据与未定义符号具有依赖关系的目标文件,生成待分析程序的源代码与其它源代码之间的依赖关系。由于待分析程序的目标文件为待分析程序的源代码完整的编译结果,因此,基于待分析程序的目标文件和其它源代码的目标文件之间的依赖关系,生成待分析程序的源代码与其它源代码之间的依赖关系,有助于提高依赖分析的完整性和准确性。
在本实施例中,在生成待分析程序的源代码与其它源代码之间的依赖关系之后,可根据待分析程序的源代码与目标源代码之间的依赖关系,对待分析程序的源代码进行编译,得到新的目标文件。可选地,可根据待分析程序的源代码与目标源代码之间的依赖关系,从待分析程序所引用的其它源代码的代码中,删除除目标源代码之外的源代码,并对待分析程序中保留的源代码进行重新编译,得到新的目标文件。进一步,可对新的目标文件进行代码链接,得到待分析程序的可执行文件。可选地,可将新的目标文件整合到静态库,以生成待分析程序的可执行文件。
由于本实施例生成的待分析程序的源代码与其它源代码之间的依赖关系,具有较高的完整性和准确性,因此,根据本实施例生成的依赖关系,对待分析程序进行重新编译,有助于提高待分析程序编译的准确性。
另一方面,由于本实施例生成的待分析程序的源代码与其它源代码之间的依赖关系,具有较高的完整性,因此,根据本实施例生成的依赖关系,对待分析程序进行重新编译,可从待分析程序所引用的其它源代码的代码中,删除除目标源代码之外的源代码,使待分析程序的编译过程尽可能的减少对其它源代码的依赖,有助于提高编译效率。
可选地,本申请实施例可记录生成的待分析程序的源代码与其它源代码之间的依赖关系,形成依赖清单,即依赖清单。这样,在对待分析程序进行编译时,可判断是否存在依赖清单,若存在则从依赖清单中读取待分析程序的源代码与其它源代码之间的依赖关系。相应地,若依赖清单不存在,则可根据上述图1a及其可选实施方式中所示的依赖分析方式,生成待分析程序与其它源代码之间的依赖关系。
可选地,可查询包含的文件的文件名,若查询到依赖清单的文件名,则确定依赖清单存在;否则,确定依赖清单不存在。
值得说明的是,本实施例提供的依赖分析方法可形成一种依赖分析服务,例如SaaS服务,向用户提供依赖分析服务。待分析程序可为用户提供的程序。这样,在依赖分析完成后,可向用户所使用的客户端返回依赖分析结果。
还值得说明的是,除了上述基于待分析程序的目标文件中的未定义符号,进行源代码依赖关系分析,也可以直接基于待分析程序的源代码的语义分析源代码之间的依赖关系。
相应地,本申请实施例还提供一种存储有计算机指令的计算机可读存储介质,当所述计算机指令被一个或多个处理器执行时,致使所述一个或多个处理器执行上述依赖分析方法及其可选实施方式中的步骤。
除了上述实施例提供的依赖分析方法之外,本申请实施例还提供程序编译方法。如图2所示,本申请实施例提供的程序编译方法包括:
201、获取待编译程序的源代码与其它源代码之间的依赖关系;其中,依赖关系是根据待编译程序所依赖的符号中的未定义符号确定的。
202、根据依赖关系,对待编译程序的源代码进行编译,得到待编译程序的目标文件。
203、对目标文件进行代码链接,得到待编译程序的可执行文件。
在本实施例中,待编译程序的源代码与其它源代码之间的依赖关系,可根据待编译程序所依赖的符号中的未定义符号来确定。在本实施例中,待编译程序的源代码与其它源代码之间的依赖关系,可为根据待编译程序所依赖的符号中的未定义符号预先生成的,也可为根据待编译程序所依赖的符号中的未定义符号实时生成的。
可选地,可判断记录依赖关系的依赖清单是否存在,若存在,则从依赖清单中读取待分析程序的源代码与其它源代码之间的依赖关系。相应地,若依赖清单不存在,则可根据待编译程序所依赖的符号中的未定义符号,生成待编译程序的源代码与其它源代码之间的依赖关系。其中,关于待编译程序的源代码与其它源代码之间的依赖关系的具体实施方式可参见上述图1a及其可选实施方式中所示的依赖分析方式,在此不再赘述。
可选地,可查询包含的文件的文件名,若查询到依赖清单的文件名,则确定依赖清单存在;否则,确定依赖清单不存在。
由于本实施例生成的待分析程序的源代码与其它源代码之间的依赖关系,具有较高的完整性和准确性,因此,根据本实施例生成的依赖关系,对待分析程序进行编译,有助于提高待分析程序编译的准确性。
可选地,可根据待编译程序的源代码与目标源代码之间的依赖关系,从待编译程序所引用的其它源代码的代码中,删除除目标源代码之外的源代码,并对待编译程序中保留的源代码进行编译,得到待编译程序的目标文件。进一步,可对目标文件进行代码链接,得到待编译程序的可执行文件。
由于本实施例生成的待分析程序的源代码与其它源代码之间的依赖关系,具有较高的完整性,因此,根据本实施例生成的依赖关系,对待分析程序进行重新编译,可从待分析程序所引用的其它源代码的代码中,删除除目标源代码之外的源代码,使待分析程序的编译过程尽可能的减少对其它源代码的依赖,有助于提高编译效率。
为了更清楚地说明上述待编译程序的代码编译过程,下面以其它源代码为代码库中的源代码为例,并结合图3所示的具体实施方式进行示例性说明。如图3所示,本申请实施例提供的代码编译过程主要包括:
S1:获取待编译程序。
S2:判断是否存在依赖清单。其中,依赖清单是用于记录待编译程序的源代码与代码库的源代码之间的依赖关系的若判断结果为是,则执行步骤S3和S4。若判断结果为否,则执行步骤S5。
S3:根据依赖清单记录的待编译程序的源代码与代码库的源代码之间的依赖关系,进行最小依赖编译,得到待编译程序的目标文件。
即,根据待编译程序的源代码与目标源代码之间的依赖关系,从待编译程序所引用的代码库的代码中,删除除目标源代码之外的源代码,并对待编译程序中保留的源代码进行编译,得到待编译程序的目标文件。
S4:对目标文件进行静态库链接,以生成待编译程序的可执行文件。
S5:对待编译程序的源代码和代码库的源代码分别进行编译,得到待编译程序的第一目标文件和代码库对应的至少一个第二目标文件。
S6:根据第一目标文件和至少一个第二目标文件,确定待编译程序依赖的未定义符号。
S7:从至少一个第二目标文件中,确定与未定义符号具有依赖关系的第三目标文件。
S8:依据第三目标文件,生成待编译程序的源代码与代码库的源代码之间的依赖关系。
S9:形成记录该依赖关系的依赖清单,并返回执行步骤S2。
关于步骤S1-S8的描述可参见上述实施例中的相关内容,在此不再赘述。
值得说明的是,本实施例提供的程序编译方法可形成一种程序编译服务,例如SaaS服务,向用户提供程序编译服务。待编译程序可为用户提供的程序。这样,在程序编译完成后,可向用户所使用的客户端返回待编译程序对应的可执行文件。
需要说明的是,上述实施例所提供方法的各步骤的执行主体均可以是同一设备,或者,该方法也由不同设备作为执行主体。比如,步骤101和102的执行主体可以为设备A;又比如,步骤101的执行主体可以为设备A,步骤102的执行主体可以为设备B;等等。
另外,在上述实施例及附图中的描述的一些流程中,包含了按照特定顺序出现的多个操作,但是应该清楚了解,这些操作可以不按照其在本文中出现的顺序来执行或并行执行,操作的序号如102、103等,仅仅是用于区分开各个不同的操作,序号本身不代表任何的执行顺序。另外,这些流程可以包括更多或更少的操作,并且这些操作可以按顺序执行或并行执行。
相应地,本申请实施例还提供一种存储有计算机指令的计算机可读存储介质,当所述计算机指令被一个或多个处理器执行时,致使所述一个或多个处理器执行上述程序编译方法及其可选实施方式中的步骤。
图4为本申请实施例提供的计算机设备的结构示意图。计算机设备可以为单一服务器设备,也可以云化的服务器阵列,或者为云化的服务器阵列中运行的虚拟机(VirtualMachine,VM)。另外,服务端设备也可以指具备相应服务能力的其他计算设备(运行服务程序),例如智能手机、平板电脑、个人电脑、穿戴设备等终端设备。
如图4所示,该计算机设备包括:存储器40a和处理器40b。其中,存储器40a,用于存储计算机程序。
处理器40b耦合至存储器40a,用于执行计算机程序以用于:对待分析程序的源代码和其它源代码分别进行编译,得到待分析程序的第一目标文件和其它源代码的至少一个第二目标文件;根据第一目标文件和至少一个第二目标文件,确定待分析程序依赖的未定义符号;并从至少一个第二目标文件中,确定与未定义符号具有依赖关系的第三目标文件;以及依据第三目标文件,生成待分析程序的源代码与其它源代码之间的依赖关系。
可选地,其它源代码为代码库中的源代码。
在一些实施例中,处理器40b在确定待分析程序依赖的未定义符号时,具体用于:对第一目标文件包含的符号的类型进行分析,以识别出第一目标文件包含的基准未定义符号;根据基准未定义符号和至少一个第二目标文件,确定未定义符号。
可选地,处理器40b在确定待分析程序依赖的未定义符号时,具体用于:对至少一个第二目标文件进行扫描,得到至少一个第二目标文件包含的符号;根据基准未定义符号和至少一个第二目标文件包含的符号,确定未定义符号。
进一步,处理器40b在确定未定义符号时,具体用于:从至少一个第二目标文件中,确定包含基准未定义符号的基准目标文件;从基准目标文件中识别出除基准未定义符号之外的其它未定义符号;将其它未定义符号作为新的基准未定义符号,并循环执行确定包含基准未定义符号的基准目标文件的操作,直至不再出现新的未定义符号为止;以及将循环停止时已识别出的未定义符号作为未定义符号。
相应地,处理器40b在确定与未定义符号具有依赖关系的第三目标文件时,具体用于:将每次循环得到的基准目标文件作为第三目标文件。
在另一些实施例中,处理器40b在生成待分析程序的源代码与其它源代码之间的依赖关系时,具体用于:从其它源代码中,确定第三目标文件对应的目标源代码;并生成待分析程序的源代码与目标源代码之间的依赖关系。
在又一些实施例中,处理器40b还用于:在生成待分析程序的源代码与目标源代码之间的依赖关系之后,根据依赖关系,对待分析程序的源代码进行编译,得到新的目标文件;对新的目标文件进行代码链接,得到待分析程序的可执行文件。
可选地,处理器40b在对待分析程序进行编译时,具体用于:根据依赖关系,从待分析程序包含的第一源代码中,删除除目标源代码之外的源代码;第一源代码为其它源代码中的部分或全部代码;对待分析程序中保留的源代码进行重新编译,得到新的目标文件。
在一些可选实施方式中,如图4所示,该计算机设备还可以包括:通信组件40c、电源组件40d等组件。可选地,对于电脑等终端设备,还可包括:显示屏40e和音频组件40f等可选组件。图4中仅示意性给出部分组件,并不意味着计算机设备必须包含图4所示全部组件,也不意味着计算机设备只能包括图4所示组件。
本实施例提供的计算机设备,可根据待分析程序的源代码编译得到的目标文件和其它源代码编译得到的目标文件,确定待分析程序依赖的未定义符号,并从其它源代码对应的目标文件中,确定与未定义符号具有依赖关系的目标文件;之后,依据与未定义符号具有依赖关系的目标文件,生成待分析程序的源代码与其它源代码之间的依赖关系。由于待分析程序的目标文件为待分析程序的源代码完整的编译结果,因此,基于待分析程序的目标文件和其它源代码的目标文件之间的依赖关系,生成待分析程序的源代码与其它源代码之间的依赖关系,有助于提高依赖分析的完整性和准确性。
图5为本申请实施例提供的另一计算机设备的结构示意图。其中,计算机设备的实现形态可参见上述实施例的相关内容,在此不再赘述。如图5所示,该计算机设备包括:存储器50a和处理器50b。其中,存储器50a,用于存储计算机程序。
处理器50b耦合至存储器50a,用于执行计算机程序以用于:获取待编译程序的源代码与其它源代码之间的依赖关系;依赖关系是根据待编译程序所依赖的符号中的未定义符号确定的;根据依赖关系,对待编译程序的源代码进行编译,得到待编译程序的第一目标文件;并对第一目标文件进行代码链接,得到待编译程序的可执行文件。
可选地,其它源代码为代码库中的源代码。
可选地,处理器50b在获取待编译程序的源代码与其它源代码之间的依赖关系时,具体用于:在记录依赖关系的依赖清单存在时,从依赖清单中获取待编译程序的源代码与其它源代码之间的依赖关系;在记录依赖关系的依赖清单不存在时,根据待编译程序依赖的未定义符号,生成待编译程序的源代码与其它源代码之间的依赖关系。其中,依赖关系的具体生成过程可参见上述实施例的相关内容,在此不再赘述。
在一些可选实施方式中,如图5所示,该计算机设备还可以包括:通信组件50c、电源组件50d等组件。可选地,对于电脑等终端设备,还可包括:显示屏50e和音频组件50f等可选组件。图5中仅示意性给出部分组件,并不意味着计算机设备必须包含图5所示全部组件,也不意味着计算机设备只能包括图5所示组件。
本实施例提供的计算机设备,由于本实施例生成的待分析程序的源代码与其它源代码之间的依赖关系,具有较高的完整性和准确性,因此,根据本实施例生成的依赖关系,对待分析程序进行编译,有助于提高待分析程序编译的准确性。
由于本实施例生成的待分析程序的源代码与其它源代码之间的依赖关系,具有较高的完整性,因此,根据本实施例生成的依赖关系,对待分析程序进行重新编译,可从待分析程序所引用的其它源代码的代码中,删除除目标源代码之外的源代码,使待分析程序的编译过程尽可能的减少对其它源代码的依赖,有助于提高编译效率。
在本申请实施例中,存储器用于存储计算机程序,并可被配置为存储其它各种数据以支持在其所在设备上的操作。其中,处理器可执行存储器中存储的计算机程序,以实现相应控制逻辑。存储器可以由任何类型的易失性或非易失性存储设备或者它们的组合实现,如静态随机存取存储器(SRAM),电可擦除可编程只读存储器(EEPROM),可擦除可编程只读存储器(EPROM),可编程只读存储器(PROM),只读存储器(ROM),磁存储器,快闪存储器,磁盘或光盘。
在本申请实施例中,处理器可以为任意可执行上述方法逻辑的硬件处理设备。可选地,处理器可以为中央处理器(Central Processing Unit,CPU)、图形处理器(GraphicsProcessing Unit,GPU)或微控制单元(Microcontroller Unit,MCU);也可以为现场可编程门阵列(Field-Programmable Gate Array,FPGA)、可编程阵列逻辑器件(ProgrammableArray Logic,PAL)、通用阵列逻辑器件(General Array Logic,GAL)、复杂可编程逻辑器件(Complex Programmable Logic Device,CPLD)等可编程器件;或者为先进精简指令集(RISC)处理器(Advanced RISC Machines,ARM)或***芯片(System on Chip SOC)等等,但不限于此。
在本申请实施例中,通信组件被配置为便于其所在设备和其他设备之间有线或无线方式的通信。通信组件所在设备可以接入基于通信标准的无线网络,如WiFi,2G或3G,4G,5G或它们的组合。在一个示例性实施例中,通信组件经由广播信道接收来自外部广播管理***的广播信号或广播相关信息。在一个示例性实施例中,通信组件还可基于近场通信(NFC)技术、射频识别(RFID)技术、红外数据协会(IrDA)技术、超宽带(UWB)技术、蓝牙(BT)技术或其他技术来实现。
在本申请实施例中,显示屏可以包括液晶显示器(LCD)和触摸面板(TP)。如果显示屏包括触摸面板,显示屏可以被实现为触摸屏,以接收来自用户的输入信号。触摸面板包括一个或多个触摸传感器以感测触摸、滑动和触摸面板上的手势。所述触摸传感器可以不仅感测触摸或滑动动作的边界,而且还检测与所述触摸或滑动操作相关的持续时间和压力。
在本申请实施例中,电源组件被配置为其所在设备的各种组件提供电力。电源组件可以包括电源管理***,一个或多个电源,及其他与为电源组件所在设备生成、管理和分配电力相关联的组件。
在本申请实施例中,音频组件可被配置为输出和/或输入音频信号。例如,音频组件包括一个麦克风(MIC),当音频组件所在设备处于操作模式,如呼叫模式、记录模式和语音识别模式时,麦克风被配置为接收外部音频信号。所接收的音频信号可以被进一步存储在存储器或经由通信组件发送。在一些实施例中,音频组件还包括一个扬声器,用于输出音频信号。例如,对于具有语言交互功能的设备,可通过音频组件实现与用户的语音交互等。
需要说明的是,本文中的“第一”、“第二”等描述,是用于区分不同的消息、设备、模块等,不代表先后顺序,也不限定“第一”和“第二”是不同的类型。
本领域内的技术人员应明白,本申请的实施例可提供为方法、***、或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本申请是参照根据本申请实施例的方法、设备(***)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
在一个典型的配置中,计算设备包括一个或多个处理器(CPU)、输入/输出接口、网络接口和内存。
内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(RAM)和/或非易失性内存等形式,如只读存储器(ROM)或闪存(flash RAM)。内存是计算机可读介质的示例。
计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、商品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、商品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、商品或者设备中还存在另外的相同要素。
以上所述仅为本申请的实施例而已,并不用于限制本申请。对于本领域技术人员来说,本申请可以有各种更改和变化。凡在本申请的精神和原理之内所作的任何修改、等同替换、改进等,均应包含在本申请的权利要求范围之内。
Claims (14)
1.一种依赖分析方法,包括:
对待分析程序的源代码和其它源代码分别进行编译,得到所述待分析程序的第一目标文件和所述其它源代码的至少一个第二目标文件;
根据所述第一目标文件和所述至少一个第二目标文件,确定所述待分析程序依赖的未定义符号;
从所述至少一个第二目标文件中,确定与所述未定义符号具有依赖关系的第三目标文件;
依据所述第三目标文件,生成所述待分析程序的源代码与所述其它源代码之间的依赖关系。
2.根据权利要求1所述的方法,所述根据所述第一目标文件和所述至少一个第二目标文件,确定所述待分析程序依赖的未定义符号,包括:
对所述第一目标文件包含的符号的类型进行分析,以识别出所述第一目标文件包含的基准未定义符号;
根据所述基准未定义符号和所述至少一个第二目标文件,确定所述未定义符号。
3.根据权利要求2所述的方法,所述根据所述基准未定义符号和所述至少一个第二目标文件,确定所述待分析程序依赖的未定义符号,包括:
对所述至少一个第二目标文件进行扫描,得到所述至少一个第二目标文件包含的符号;
根据所述基准未定义符号和所述至少一个第二目标文件包含的符号,确定所述未定义符号。
4.根据权利要求3所述的方法,所述根据所述基准未定义符号和所述至少一个第二目标文件包含的符号,确定所述未定义符号,包括:
从所述至少一个第二目标文件中,确定包含所述基准未定义符号的基准目标文件;
从所述基准目标文件中识别出除所述基准未定义符号之外的其它未定义符号;
将所述其它未定义符号作为新的基准未定义符号,并循环执行所述确定包含所述基准未定义符号的基准目标文件的操作,直至不再出现新的未定义符号为止;
将循环停止时已识别出的未定义符号作为所述未定义符号。
5.根据权利要求4所述的方法,从所述至少一个第二目标文件中,确定与所述未定义符号具有依赖关系的第三目标文件,包括:
将每次循环得到的基准目标文件作为所述第三目标文件。
6.根据权利要求1-5任一项所述的方法,所述依据所述第三目标文件,生成所述待分析程序的源代码与所述其它源代码之间的依赖关系,包括:
从所述其它源代码中,确定所述第三目标文件对应的目标源代码;并生成所述待分析程序的源代码与所述目标源代码之间的依赖关系。
7.根据权利要求6所述的方法,在生成所述待分析程序的源代码与所述目标源代码之间的依赖关系之后,还包括:
根据所述依赖关系,对所述待分析程序的源代码进行编译,得到新的目标文件;
对所述新的目标文件进行代码链接,得到所述待分析程序的可执行文件。
8.根据权利要求7所述的方法,所述根据所述依赖关系,对所述待分析程序进行编译,包括:
根据所述依赖关系,从所述待分析程序包含的第一源代码中,删除除所述目标源代码之外的源代码;所述第一源代码为所述其它源代码中的部分或全部代码;
对所述待分析程序中保留的源代码进行重新编译,得到所述新的目标文件。
9.根据权利要求1-5任一项所述的方法,所述其它源代码为代码库中的源代码。
10.一种程序编译方法,包括:
获取待编译程序的源代码与其它源代码之间的依赖关系;所述依赖关系是根据所述待编译程序所依赖的符号中的未定义符号确定的;
根据所述依赖关系,对所述待编译程序的源代码进行编译,得到所述待编译程序的目标文件;
对所述目标文件进行代码链接,得到所述待编译程序的可执行文件。
11.根据权利要求10所述的方法,所述获取待编译程序的源代码与其它源代码之间的依赖关系,包括:
在记录所述依赖关系的依赖清单存在时,从所述依赖清单中获取所述待编译程序的源代码与其它源代码之间的依赖关系;
在记录所述依赖关系的依赖清单不存在时,根据所述待编译程序依赖的未定义符号,生成所述待编译程序的源代码与其它源代码之间的依赖关系。
12.一种计算机设备,包括:存储器和处理器;其中,所述存储器,用于存储计算机程序;
所述处理器耦合至所述存储器,用于执行所述计算机程序以用于:对待分析程序的源代码和其它源代码分别进行编译,得到所述待分析程序的第一目标文件和所述其它源代码的至少一个第二目标文件;根据所述第一目标文件和所述至少一个第二目标文件,确定所述待分析程序依赖的未定义符号;并从所述至少一个第二目标文件中,确定与所述未定义符号具有依赖关系的第三目标文件;以及依据所述第三目标文件,生成所述待分析程序的源代码与所述其它源代码之间的依赖关系。
13.一种计算机设备,包括:存储器和处理器;其中,所述存储器,用于存储计算机程序;
所述处理器耦合至所述存储器,用于执行所述计算机程序以用于:获取待编译程序的源代码与其它源代码之间的依赖关系;所述依赖关系是根据所述待编译程序所依赖的符号中的未定义符号确定的;根据所述依赖关系,对所述待编译程序的源代码进行编译,得到所述待编译程序的第一目标文件;并对所述第一目标文件进行代码链接,得到所述待编译程序的可执行文件。
14.一种存储有计算机指令的计算机可读存储介质,当所述计算机指令被一个或多个处理器执行时,致使所述一个或多个处理器执行权利要求1-11任一项所述方法中的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010280806.6A CN113296777B (zh) | 2020-04-10 | 2020-04-10 | 依赖分析和程序编译方法、设备及存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010280806.6A CN113296777B (zh) | 2020-04-10 | 2020-04-10 | 依赖分析和程序编译方法、设备及存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN113296777A true CN113296777A (zh) | 2021-08-24 |
CN113296777B CN113296777B (zh) | 2022-05-27 |
Family
ID=77317873
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202010280806.6A Active CN113296777B (zh) | 2020-04-10 | 2020-04-10 | 依赖分析和程序编译方法、设备及存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN113296777B (zh) |
Citations (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101739339A (zh) * | 2009-12-29 | 2010-06-16 | 北京航空航天大学 | 一种基于程序动态依赖关系的软件故障定位方法 |
CN102279800A (zh) * | 2011-08-31 | 2011-12-14 | 中国信息安全测评中心 | 处理路径敏感符号定义的源代码静态缺陷分析器及其方法 |
US8677314B1 (en) * | 2011-08-18 | 2014-03-18 | Google Inc. | Modifying a source code file to reduce dependencies included therein |
CN104820613A (zh) * | 2015-05-27 | 2015-08-05 | 中国科学院自动化研究所 | 一种异构多核程序的编译方法 |
CN105335137A (zh) * | 2014-07-23 | 2016-02-17 | 国际商业机器公司 | 用于处理源文件的方法和装置 |
CN106469049A (zh) * | 2015-08-19 | 2017-03-01 | 腾讯科技(深圳)有限公司 | 一种文件扫描的方法及装置 |
CN106909434A (zh) * | 2017-02-28 | 2017-06-30 | 杭州迪普科技股份有限公司 | 可执行程序中未定义函数的检测方法及装置 |
CN107608677A (zh) * | 2017-09-05 | 2018-01-19 | 腾讯科技(深圳)有限公司 | 一种编译处理方法、装置及电子设备 |
CN108614707A (zh) * | 2018-04-27 | 2018-10-02 | 深圳市腾讯网络信息技术有限公司 | 静态代码检查方法、装置、存储介质和计算机设备 |
-
2020
- 2020-04-10 CN CN202010280806.6A patent/CN113296777B/zh active Active
Patent Citations (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101739339A (zh) * | 2009-12-29 | 2010-06-16 | 北京航空航天大学 | 一种基于程序动态依赖关系的软件故障定位方法 |
US8677314B1 (en) * | 2011-08-18 | 2014-03-18 | Google Inc. | Modifying a source code file to reduce dependencies included therein |
CN102279800A (zh) * | 2011-08-31 | 2011-12-14 | 中国信息安全测评中心 | 处理路径敏感符号定义的源代码静态缺陷分析器及其方法 |
CN105335137A (zh) * | 2014-07-23 | 2016-02-17 | 国际商业机器公司 | 用于处理源文件的方法和装置 |
CN104820613A (zh) * | 2015-05-27 | 2015-08-05 | 中国科学院自动化研究所 | 一种异构多核程序的编译方法 |
CN106469049A (zh) * | 2015-08-19 | 2017-03-01 | 腾讯科技(深圳)有限公司 | 一种文件扫描的方法及装置 |
CN106909434A (zh) * | 2017-02-28 | 2017-06-30 | 杭州迪普科技股份有限公司 | 可执行程序中未定义函数的检测方法及装置 |
CN107608677A (zh) * | 2017-09-05 | 2018-01-19 | 腾讯科技(深圳)有限公司 | 一种编译处理方法、装置及电子设备 |
CN108614707A (zh) * | 2018-04-27 | 2018-10-02 | 深圳市腾讯网络信息技术有限公司 | 静态代码检查方法、装置、存储介质和计算机设备 |
Non-Patent Citations (2)
Title |
---|
CHUN-HAO LI 等: "A New MCDM Approach Based on Cross-Impact Analysis for Ranking Dependent Alternatives", 《THE 2008 4TH INTERNATIONAL CONFERENCE ON WIRELESS COMMUNICATIONS, NETWORKING AND MOBILE COMPUTING》 * |
于康 等: "基于VxWorks的模块自动加载机制", 《计算机工程》 * |
Also Published As
Publication number | Publication date |
---|---|
CN113296777B (zh) | 2022-05-27 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US11379943B2 (en) | Optimizing compilation of shaders | |
CN110955431B (zh) | 编译环境的处理方法及装置 | |
CN110223682B (zh) | 一种语音指令仲裁方法和装置 | |
CN112947934A (zh) | 一种动态变换业务逻辑的方法、设备及介质 | |
CN115328454A (zh) | 程序编译和程序加载方法 | |
CN112604273B (zh) | 数据驱动的游戏***功能加载方法、设备及存储介质 | |
CN112256355B (zh) | 数据驱动的***功能加载方法、设备及存储介质 | |
CN114185874A (zh) | 一种基于大数据的建模方法、装置、开发框架及设备 | |
CN112699044B (zh) | 压力测试方法、设备及存储介质 | |
CN114201144A (zh) | 基于领域驱动设计的微服务***构建方法、设备及介质 | |
CN113296777B (zh) | 依赖分析和程序编译方法、设备及存储介质 | |
CN112764796A (zh) | 安装包生成*** | |
CN117763024A (zh) | 一种数据分片抽取方法及装置 | |
CN113672222B (zh) | 一种应用程序接口管理装置及其构建方法 | |
CN112346761B (zh) | 前端资源上线方法、设备、***及存储介质 | |
CN115048083A (zh) | 组件的可视化方法、装置、存储介质及电子设备 | |
CN114168183A (zh) | 前端资源信息处理方法、装置、设备及存储介质 | |
CN114546359A (zh) | Dsl描述文件生成方法、装置、设备及存储介质 | |
CN110908876B (zh) | 一种硬件性能数据的获取方法及装置 | |
CN110737515B (zh) | 一种数据任务指令的处理方法、计算机设备、存储介质 | |
CN117193731A (zh) | 组件引入的方法、装置、非易失性存储介质和电子设备 | |
CN115543323B (zh) | 一种页面开发方法及装置 | |
CN114490244A (zh) | 网络监测方法、装置、设备、存储介质及计算机程序产品 | |
CN116303719A (zh) | 电子表格文件导入方法、装置、设备、介质及程序产品 | |
CN114238259A (zh) | 一种生成日志的方法及装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |