一种C++程序编译方法和装置与流程

文档序号:17396663发布日期:2019-04-13 00:52阅读:194来源:国知局
一种C++程序编译方法和装置与流程

本发明涉及计算机技术领域,特别是涉及一种c++程序编译方法和装置。



背景技术:

编译c++文件通常使用编译器,比如采用clang,gcc等c++编译器对其进行编译。在编译多个c++文件时,比如2000多个甚至更多个文件时,现有编译器是对c++文件逐个编译,这样会消耗大量的时间。c++编译器在编译文件的时候,每编译一个文件就会启动一个进程,加载各种系统资源会产生大量的时间开销和系统开销。

目前,对大量的c++文件进行编译,主要使用分布式编译技术,把c++文件发送到不同的机器进行编译,最后返回结果集成。这种方式需要第三方分布式软件的支持,并消耗大量的硬件环境,比如编译2000多个文件,至少需要10台机器,才能提高编译速度。

因此,在尽量节约硬件编译环境和编译时间开销的前提下,提高c++文件的编译速度是目前急需解决的技术问题。



技术实现要素:

为了提高c++文件的编译速度,本发明提供了一种c++程序编译加速方法,以解决在尽量节约硬件编译环境和编译时间开销的前提下,提高c++文件编译速度的问题。该方法通过采用合并编译方式,将大量c++文件合并成一个文件,再对合并后的文件进行编译,这样就只需要加载一次系统资源,对c++文件进行集中编译,可极大的缩短编译时间。

该方法的具体技术方案如下:

一种c++程序编译方法,其特征在于,所述方法包括如下步骤:

获取多个cpp文件;

对所述多个cpp文件进行合并算法处理,生成待编译的目标cpp文件;

对所述目标cpp文件进行编译。

进一步地,对所述cpp文件进行合并算法处理,生成待编译的目标cpp文件之前,包括如下步骤:

将每个所述cpp文件生成抽象语法树;

判断所述抽象语法树之间是否包括相同的内部变量和/或函数。

进一步地,若所述抽象语法树之间不包括相同的内部变量和/或函数,则对所述多个cpp文件进行合并算法处理,生成待编译的目标cpp文件。

进一步地,所述方法还包括,

若所述抽象语法树之间包括相同的内部变量和/或函数,则生成错误信息;

对所述错误信息进行修改;

其中,所述错误信息包括具有相同内部变量和/或函数的抽象对象树所对应的文件的文件名、内部变量名和/或函数名、所述内部变量名和/或函数名所在文件的行数。

进一步地,所述合并算法处理包括如下步骤:

采用include伪指令调用所述cpp文件;

将调用的所述cpp文件添加至预先设置的cpp文件,生成待编译的目标cpp文件。

进一步地,判断所述抽象语法树之间是否包括相同的内部变量和/或函数,具体包括如下步骤:

获取抽象语法树的节点信息;

遍历所述节点信息并判断其是否满足预设的判断条件;

若满足预设的判断条件,则判定所述抽象语法树之间包括相同的内部变量和/或函数。

本发明还提供一种c++程序编译装置,其特征在于,该装置包括,

获取模块,用于获取多个cpp文件;

合并算法处理模块,用于对获取的所述多个cpp文件进行合并算法处理,并生成待编译的目标cpp文件;

编译模块,用于对所述目标cpp文件进行编译。

进一步地,所述合并算法处理模块还包括:

抽象语法树生成模块,用于对每个cpp文件生成抽象语法树;

判断模块,用于判断所述抽象语法树之间是否包括相同的内部变量和/或函数;

错误信息生成,用于在判断出所述抽象语法树之间包括相同的内部变量和/或函数时,生成错误信息;

错误修改模块,用于对所述错误信息进行修改,并生成新的抽象语法树。

进一步地,所述合并算法处理模块还包括,

include伪指令调用模块,用于调用获取的所述cpp文件;

cpp文件添加模块,用于将所述cpp文件添加至预先设置的cpp文件,生成待编译的目标cpp文件。

进一步地,所述判断模块还包括,

节点信息获取模块,用于获取所述抽象语法树中的节点信息;

节点信息判断模块,用于遍历所述节点信息并判断其是否满足预设的判断条件;若满足预设的判断条件,则判定所述抽象语法树之间包括相同的内部变量和/或函数。

本发明提供一种c++程序编译方法,该方法通过采用特定方法将大量的cpp文件合并成一个待编译的目标cpp文件,即先获取多个cpp文件,然后对所述多个cpp文件进行合并算法处理,生成待编译的目标cpp文件,最后对合并后的目标cpp文件进行编译的方法,避免在对大量的cpp文件编译时,需要对每一个cpp文件都进行单独的预处理、编译、汇编和产生目标链接的过程,而直接对合并后的cpp文件进行统一的预处理、编译、汇编和产生目标链接的过程,完成c++程序的编译过程,系统进程从多次cpp文件编译过程变为一次性完成c++程序的编译过程,节省了各种系统资源以及大量的时间开销和系统开销,加速了c++程序的编译进程,提高了系统性能。

进一步地,本发明提供的方法在对所述cpp文件进行合并算法处理,生成待编译的目标cpp文件之前,将每个cpp文件生成抽象语法树,该抽象语法树包括内部变量、内部函数等大量节点信息,对每个抽象语法树中的内部变量和内部函数等信息进行判断,判断抽象语法树之间是否包括相同的内部变量和/或函数。在生成待编译的目标cpp文件之前,对大量的cpp文件内包含的内部变量和函数进行分析判断,减少在对后来生成目标cpp文件时,由于cpp文件之间存在相同的内部变量和函数,使得编译过程中产生c++或者编译出现语法错误,需要反复对c++程序进行修改和编译,导致的编译效率降低的问题,本发明提供的方法能够减少该过程耗费的时间,提高编译的效率。

进一步地,本发明直接采用include伪指令调用所述cpp文件,将调用的所述cpp文件添加至预先设置的cpp文件,生成待编译的目标cpp文件,程序性能得到很好的优化的同时,采用最为简便的伪指令调用方法,功能易实现,程序简单,且能实现较现有技术更好的效果。

本发明还提供一种c++程序编译装置,该装置包括,获取模块,用于获取多个cpp文件;合并算法处理模块,用于对获取的所述多个cpp文件进行合并算法处理,并生成待编译的目标cpp文件;编译模块,用于对所述目标cpp文件进行编译。该装置通过获取模块获取多个cpp文件,由合并算法处理模块对获取的多个cpp文件进行合并算法处理,并生成待编译的目标cpp文件,最后由编译模块对生成的目标cpp文件进行编译,避免在对大量的cpp文件编译时,需要对每个cpp文件都进行单独的预处理、编译、汇编和产生目标链接的过程,而直接对大量的cpp文件进行合并,并直接对合并后的算法进行统一的预处理、编译、汇编和产生目标链接的过程,完成c++程序的编译过程,节省了各种系统资源以及大量的时间开销和系统开销,加速了c++程序的编译进程,提高了系统的性能。

附图说明

为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明中记载的一些实施例,对于本领域普通技术人员来讲,还可以根据这些附图获得其他的附图。

图1为本发明一种c++程序编译方法的流程示意图;

图2为本发明一种c++程序编译方法的一优选实施例的示意图;

图3为本发明一种c++程序编译装置的结构示意图;

图4为本发明一种c++程序编译装置的一优选结构示意图。

具体实施方式

下面结合附图,对本发明做进一步具体详细的描述。

参见图1,是本发明一种c++程序编译方法的流程示意图,该示意图包括如下步骤:

s1.获取多个cpp文件;

s2.对所述多个cpp文件进行合并算法处理,生成待编译的目标cpp文件;

s3.对所述目标cpp文件进行编译。

上述步骤s1,获取多个cpp文件,本发明通过打开编译系统载入预先建立的c++开发工程,当编译系统运行程序时,使用文件遍历系统函数readdir,对预先建立的c++开发工程中的目录进行递归遍历,查找以cpp为后缀名的文件,获取所述多个cpp文件,并将获取的、用以表示该cpp文件的文件名存入到预先设置的变量中,例如,变量名为filelists,变量的类型为vector<string>。

上述步骤s2,对获取到的多个cpp文件,可以直接采用合并算法处理,生成待编译的目标cpp文件。需要说明的是,本发明所述合并算法处理可以是手动将多个cpp文件编辑到一个预先设置的文件中,并将该文件作为待编译的目标cpp文件。优选地,本发明将获取到的所述多个cpp文件采用伪指令include将其调用,然后将调用的cpp文件添加至预先设置的cpp文件,生成待编译的目标cpp文件。

上述步骤s3,对所述目标cpp文件进行编译。在本发明中,在clang编译平台上,对生成的目标cpp文件进行编译。

本发明提供一种c++程序编译方法,该方法通过采用特定方法将大量的cpp文件合并成一个待编译的目标cpp文件,即先获取多个cpp文件,然后对所述多个cpp文件进行合并算法处理,生成待编译的目标cpp文件,最后对合并后的目标cpp文件进行编译的方法,避免在对大量的cpp文件编译时,需要对每一个cpp文件都进行单独的预处理、编译、汇编和产生目标链接的过程,而直接对合并后的cpp文件进行统一的预处理、编译、汇编和产生目标链接的过程,完成c++程序的编译过程,系统进程从多次cpp文件编译过程变为一次性完成c++程序的编译过程,节省了各种系统资源以及大量的时间开销和系统开销,加速了c++程序的编译进程,提高了系统性能。

参见图2,是本发明一种c++程序编译方法的一优选的实施方式。

该方法包括:

l1:获取多个cpp文件;

l2:将每个所述cpp文件生成抽象语法树,获得内部变量和函数;

l3:判断所述抽象语法树之间是否包括相同的内部变量和/或函数;

l4:若所述抽象语法树之间不包括相同的内部变量和/或函数,则对所述多个cpp文件进行合并算法处理,生成待编译的目标cpp文件;

l5:对所述目标cpp文件进行编译。

步骤l1:本发明通过打开编译系统载入预先建立的c++工程,当编译系统运行程序时,使用文件遍历系统函数readdir,对预先建立的c++开发工程中的目录进行递归遍历,查找以cpp为后缀名的文件,获取多个cpp文件,并将获取的、用以表示该文件的文件名存入到预先设置的变量中,例如,变量名为filelists,变量类型为vector<string>。

步骤l2:获取到多个cpp文件后,首先构造一个全局变量,该全局变量用以存放变量或者函数的名字;然后引入clangsdk,调用clangsdk中集成的抽象语法树函数clang_parsetranslationunit对获取的cpp文件进行算法处理,生成抽象语法树。需要说明的是,抽象语法树是源代码的抽象语法结构的树状表现形式,树上有众多节点,每个节点都表示源代码中的一种结构,包含内部变量和内部函数。

步骤l3:判断所述抽象语法树之间是否包括相同的内部变量和/或函数;遍历生成的多个抽象语法树,查找其中的内部变量和函数,并记录其名字。具体过程如下:

若成功生成c++的抽象语法树之后,调用clang_gettranslationunitcursor方法,获得抽象语法树的遍历游标cursor;调用函数clang_visitchildren使用cursor遍历语法树的每一个节点,对每个节点调用clang_getcursorkind函数,获取节点类型nodetype,再调用clang_getcursorlinkage获取节点链接类型nodelinktype;若nodetype是cxcursor_functiondecl或者cxcursor_vardecl,并且nodelinktype是cxlinkage_internal这种类型。我们认为该节点是内部变量或者内部函数。若发现该节点是内部变量或者内部函数,调用方法clang_getcursorspelling获取该节点的名字,即变量或者方法名字,叫做variableormethodname,再调用方法clang_getcursorlocation方法获取节点位置信息,然后使用clang_getexpansionlocation和clang_getfilename方法,获取节点所在的文件cpp文件名cppfilename,行号row,列号column。我们将这些信息存储到变量m_variables中,以variableormethodname为key,以cppfilename为子key,以行号和列号为值,即:

m_variables[variableormethodname][cppfilename]=“rowcolumn”

对m_variables进行遍历,若它的每一个键值对variableelement的子键的数量大于1,则说明有重复出现的变量或者函数名。即判断variableelement.size()>1的情况下,就说明出现了相同的内部变量或者函数名。若出现大于1的情况,我们遍历variableelement,将它的每一个键值输出打印出来,其键为cpp文件名cppfilename,值为行号row和列号column。

综上所述,即获取抽象语法树的节点信息,所述节点信息包括函数、内部变量;遍历节点信息并判断节点信息是否满足上述的预设判断条件,若满足上述预设的判断条件,则判定抽象语法树之间包括相同的内部变量和/或函数。

l4:若上述抽象语法树之间不包括相同的内部变量和/或函数,则对所述多个cpp文件进行合并算法处理,生成待编译的目标cpp文件;

l5:对所述目标cpp文件进行编译。在本发明中,在clang编译平台上,对生成的目标cpp文件进行编译。

需要说明的是,本发明还包括步骤l4,若判断出所述抽象语法树之间包括相同的内部变量和/或函数,则生成错误信息;并对错误信息进行修改,直至再次对所述抽象语法树之间的内部变量和/或函数进行相同判断时,抽象语法树之间不再出现相同的内部变量和/或函数,则采用将多个cpp文件调用include伪指令合并处理到一个cpp文件中,并将此cpp文件作为目标cpp文件,最后再对合并后的目标cpp文件进行编译;其中,所述错误信息包括具有相同内部变量和/或函数的抽象对象树所对应的文件的文件名、内部变量名和/或函数名、所述内部变量名和/或函数名所在文件的行数。

本发明提供一种c++程序编译方法,该方法通过采用特定方法将大量的cpp文件合并成一个待编译的目标cpp文件,即先获取多个cpp文件,然后将每个cpp文件生成抽象语法树,该抽象语法树包括内部变量、内部函数等大量节点信息,对每个抽象语法树中的内部变量和内部函数等信息进行判断,判断抽象语法树之间是否包括相同的内部变量和/或函数。若所述抽象语法树之间不包括相同的内部变量和/或函数,则对所述多个cpp文件进行合并算法处理,生成待编译的目标cpp文件;最后对合并后的目标cpp文件进行编译处理,完成c++程序的编译。在生成待编译的目标cpp文件之前,对大量的cpp文件内包含的内部变量和函数进行分析判断,减少在对后来生成目标cpp文件时,由于cpp文件之间存在相同的内部变量和函数,使得编译过程中产生c++或者编译出现语法错误,需要反复对c++程序进行修改和编译,导致的编译效率降低的问题,本发明提供的方法能够减少该过程耗费的时间,提高编译的效率。同时,本发明对所述多个cpp文件进行合并算法处理,生成待编译的目标cpp文件,最后对合并后的目标cpp文件进行编译的方法,避免在对大量的cpp文件编译时,需要对每一个cpp文件都进行单独的预处理、编译、汇编和产生目标链接的过程,而直接对合并后的cpp文件进行统一的预处理、编译、汇编和产生目标链接的过程,完成c++程序的编译过程,系统进程从多次cpp文件编译过程变为一次性完成c++程序的编译过程,节省了各种系统资源以及大量的时间开销和系统开销,加速了c++程序的编译进程,提高了系统性能。

进一步地,本发明直接采用include伪指令调用所述cpp文件,将调用的所述cpp文件添加至预先设置的cpp文件,生成待编译的目标cpp文件,程序性能得到很好的优化的同时,采用最为简便的伪指令调用方法,功能易实现,程序简单,且能实现较现有技术更好的效果。

参见图3,本发明还提供一种c++程序编译装置,该装置包括,获取模块,用于获取多个cpp文件;合并算法处理模块,用于对获取的所述多个cpp文件进行合并算法处理,并生成待编译的目标cpp文件;编译模块,用于对所述目标cpp文件进行编译。

本发明该通过打开编译系统载入预先建立的c++开发工程,当编译系统运行程序时,该装置的获取模块获取多个cpp文件,并调用文件遍历系统函数readdir,对预先建立的c++开发工程中的目录进行递归遍历,查找以cpp为后缀名的文件,获取所述多个cpp文件,并将获取的、用以表示该cpp文件的文件名存入到预先设置的变量中,例如,变量名为filelists,变量的类型为vector<string>。合并算法处理模块对获取到的多个cpp文件,可以直接采用合并算法处理,生成待编译的目标cpp文件。需要说明的是,本发明所述的合并算法处理模块可以是手动将多个cpp文件编辑到一个预先设置的文件中,并将该文件作为待编译的目标cpp文件。优选地,本发明将获取到的所述多个cpp文件采用伪指令include将其调用,然后将调用的cpp文件添加至预先设置的cpp文件,生成待编译的目标文件。最后在clang编译平台上,编译模块将生成的目标cpp文件进行编译。

参见图4,是本发明一种c++程序编译装置的一优选实施方式。该装置包括,获取模块,用于获取多个cpp文件;合并算法处理模块,用于对获取的所述多个cpp文件进行合并算法处理,并生成待编译的目标cpp文件;编译模块,用于对所述目标cpp文件进行编译。

该装置通过获取模块获取多个cpp文件,由合并算法处理模块对获取的多个cpp文件进行合并算法处理,并生成待编译的目标cpp文件,最后由编译模块对生成的目标cpp文件进行编译,避免在对大量的cpp文件编译时,需要对每个cpp文件都进行单独的预处理、编译、汇编和产生目标链接的过程,而直接对大量的cpp文件进行合并,并直接对合并后的算法进行统一的预处理、编译、汇编和产生目标链接的过程,完成c++程序的编译过程,节省了各种系统资源以及大量的时间开销和系统开销,加速了c++程序的编译进程,提高了系统的性能。

进一步地,其中,合并算法处理模块还包括:

抽象语法树生成模块,用于对每个cpp文件生成抽象语法树;判断模块,用于判断所述抽象语法树之间是否包括相同的内部变量和/或函数;错误信息生成,用于在判断出所述抽象语法树之间包括相同的内部变量和/或函数时,生成错误信息;错误修改模块,用于对所述错误信息进行修改,并生成新的抽象语法树。合并算法处理模块还包括,include伪指令调用模块,用于调用获取的所述cpp文件;cpp文件添加模块,用于将所述cpp文件添加至预先设置的cpp文件,生成待编译的目标cpp文件。所述判断模块还包括,

节点信息获取模块,用于获取所述抽象语法树中的节点信息;节点信息判断模块,用于对所述节点信息进行判断。

通过以上的实施方式的描述可知,本领域的技术人员可以清楚地了解到上述实施例方法中的全部或部分步骤可借助软件加通用硬件平台的方式来实现。基于这样的理解,本发明的技术方案可以以软件产品的形式体现出来,该计算机软件产品可以存储在存储介质中,如只读存储器(英文:read-onlymemory,rom)/ram、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者诸如路由器等网络通信设备)执行本发明各个实施例或者实施例的某些部分所述的方法。

本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于装置实施例而言,由于其基本相似于方法实施例,所以描述得比较简单,相关之处参见方法实施例的部分说明即可。以上所描述的装置统实施例仅仅是示意性的,其中作为分离部件说明的模块可以是或者也可以不是物理上分开的,作为模块显示的部件可以是或者也可以不是物理模块,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性劳动的情况下,即可以理解并实施。

以上所述仅是本发明的优选实施方式,并非用于限定本发明的保护范围。应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明的前提下,还可以作出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1