CN114968247A - 预编译方法、设备和计算机程序产品 - Google Patents
预编译方法、设备和计算机程序产品 Download PDFInfo
- Publication number
- CN114968247A CN114968247A CN202110199012.1A CN202110199012A CN114968247A CN 114968247 A CN114968247 A CN 114968247A CN 202110199012 A CN202110199012 A CN 202110199012A CN 114968247 A CN114968247 A CN 114968247A
- Authority
- CN
- China
- Prior art keywords
- header file
- header
- file
- determining
- target object
- 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.)
- Pending
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
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/20—Software design
- G06F8/24—Object-oriented
Landscapes
- Engineering & Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明实施例提供一种预编译方法、设备和计算机程序产品,该方法包括:解析目标对象包含的源文件,以确定被源文件直接引用的头文件和源文件的数量;确定头文件的特征信息;根据头文件的特征信息及源文件的数量,确定是否将头文件添加到与目标对象对应的预编译头文件中;对与目标对象对应的预编译头文件进行预编译处理。通过自动提取被源文件直接引用的头文件的特征信息,以结合头文件的特征信息,自动而准确地生成包含目标对象中真正引用到的、重要的头文件的预编译头文件,使得基于该预编译头文件对目标对象进行编译时,可以获得更高的编译效率。
Description
技术领域
本发明涉及计算机技术领域,尤其涉及一种预编译方法、设备和计算机程序产品。
背景技术
大型C/C++项目包含成百上千个头文件和源文件,编译一次通常需要几十分钟甚至几个小时。所幸,目前很多编译器都提供了预编译技术。通过在项目中使用预编译技术,可大幅缩短项目的整体编译时间。
传统方案中,开发人员会直接从项目中包含的若干头文件中选出需要进行预编译的头文件,以生成预编译头文件,以针对该预编译头文件进行预编译处理。但是,开发人员凭借主观经验来选择用以生成预编译头文件的头文件,最终结果可能对编译时间的提速效果有限。
发明内容
本发明实施例提供一种预编译方法、装置、设备和计算机程序产品,可以提升编译效率。
第一方面,本发明实施例提供一种预编译方法,该方法包括:
解析目标对象包含的源文件,以确定被源文件直接引用的头文件和源文件的数量;
确定所述头文件的特征信息;
根据所述头文件的特征信息及所述源文件的数量,确定是否将所述头文件添加到与所述目标对象对应的预编译头文件中;
对与所述目标对象对应的预编译头文件进行预编译处理。
第二方面,本发明实施例提供一种预编译装置,该装置包括:
解析模块,用于解析目标对象包含的源文件,以确定被源文件直接引用的头文件和源文件的数量;
第一确定模块,用于确定所述头文件的特征信息;
第二确定模块,用于根据所述头文件的特征信息及所述源文件的数量,确定是否将所述头文件添加到与所述目标对象对应的预编译头文件中;
预编译模块,用于对与所述目标对象对应的预编译头文件进行预编译处理。
第三方面,本发明实施例提供一种电子设备,包括:存储器、处理器;其中,所述存储器上存储有可执行代码,当所述可执行代码被所述处理器执行时,使所述处理器至少可以实现如第一方面所述的预编译方法。
第四方面,本发明实施例提供了一种计算机程序产品,包括:计算机程序,当所述计算机程序被电子设备的处理器执行时,使所述处理器至少可以实现如第一方面所述的预编译方法。
在本发明实施例中,在需要对包含若干源文件和若干头文件的目标对象(比如为一个项目或者是一个项目中的功能模块)进行编译前,首先生成与该目标对象对应的预编译头文件,以便基于对该预编译头文件的预编译结果来提高目标对象的编译效率。为生成与该目标对象对应的预编译头文件,首先,解析该目标对象包含的若干源文件,以得到被源文件直接引用的头文件,以及目标对象包含的源文件的数量。实际上,往往会得到多个头文件,其中每个头文件都是被一个或多个源文件直接引用到的,针对这多个头文件中的每个头文件都进行如下处理:确定头文件的特征信息,以结合头文件的特征信息及所述源文件的数量确定是否将该头文件添加到与目标对象对应的预编译头文件中,若确定结果为是,则将该头文件添加到预编译头文件中,这样在预编译的过程中便会对该头文件进行预编译。
在上述方案中,通过自动提取被源文件直接引用的头文件的特征信息,以结合头文件的特征信息,自动而准确地生成包含目标对象中真正引用到的、重要的头文件的预编译头文件,使得基于该预编译头文件对目标对象进行编译时,可以获得更高的编译效率。
附图说明
为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本发明实施例提供的一种预编译方法的流程图;
图2为本发明实施例提供的一种项目的组织结构示意图;
图3为本发明实施例提供的一种源文件的组织结构示意图;
图4为本发明实施例提供的一种预编译方法的流程图;
图5为本发明实施例提供的一种预编译装置的结构示意图;
图6为与图5所示实施例提供的预编译装置对应的电子设备的结构示意图。
具体实施方式
为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
在本发明实施例中使用的术语是仅仅出于描述特定实施例的目的,而非旨在限制本发明。在本发明实施例和所附权利要求书中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其他含义,“多种”一般包含至少两种。
取决于语境,如在此所使用的词语“如果”、“若”可以被解释成为“在……时”或“当……时”或“响应于确定”或“响应于检测”。类似地,取决于语境,短语“如果确定”或“如果检测(陈述的条件或事件)”可以被解释成为“当确定时”或“响应于确定”或“当检测(陈述的条件或事件)时”或“响应于检测(陈述的条件或事件)”。
另外,下述各方法实施例中的步骤时序仅为一种举例,而非严格限定。
本发明实施例提供的预编译方法可以由一电子设备来执行。该电子设备可以是诸如PC机、笔记本电脑、平板电脑等终端设备。该电子设备也可以是云端的服务器。该服务器可以是包含一独立主机的物理服务器,或者也可以为虚拟服务器,或者也可以为云服务器。上述电子设备中会具有某种类型的操作系统。上述电子设备中运行有编译器,具体可以由该编译器来执行上述预编译方法。
下面对本发明实施例提供的预编译方法的执行过程进行详细说明。
图1为本发明实施例提供的一种预编译方法的流程图,如图1所示,该方法包括如下步骤:
101、解析目标对象包含的源文件,以确定被源文件直接引用的头文件和源文件的数量。
102、确定所述头文件的特征信息。
103、根据所述头文件的特征信息及所述源文件的数量,确定是否将所述头文件添加到与目标对象对应的预编译头文件中。
104、对与目标对象对应的预编译头文件进行预编译处理。
本发明实施例中,上述目标对象可以是一个项目(project),也可以是一个项目中包含的任一功能模块,无论是一个项目还是一个项目中包含的任意功能模块,通过编译可以编译为目标操作系统的目标程序,即,目标操作系统是指最终运行编译得到的目标程序的操作系统,比如,项目的目标程序是windows程序,则目标操作系统是windows;如果项目的目标程序是linux程序,则目标操作系统是linux,头文件预编译的原理与此相同。
一个项目中可能会包含多个功能模块,在一个项目中包含多个功能模块的情况下,可以针对每个功能模块生成与之一一对应的预编译头文件,如图2中所示,假设一个项目中包括功能模块A、功能模块B和功能模块C,那么最终可以生成与功能模块A对应的预编译头文件1,与功能模块B对应的预编译头文件2,与功能模块C对应的预编译头文件3。
实际应用中,假设一个项目为开发一款图书借阅管理应用(App)的项目,在该项目中可能包括用户管理模块和书籍管理模块这两个功能模块,那么基于本发明实施例提供的方案,最终可以为这两个功能模块分别生成对应的预编译头文件。这样,在对这个项目进行编译的时候,当编译用户管理模块时会使用到与该功能模块对应的预编译头文件,当编译书籍管理模块时会使用到与这个功能模块对应的预编译头文件。
需要说明的是,本发明实施例中,预编译头文件是指由需要进行预编译的头文件构成的一个特殊的头文件。举例来说,假设需要进行预编译的头文件包括a.h,b.h,c.h这三个头文件,那么最终得到的预编译头文件中将包含这三个头文件,假设将这个预编译头文件命名为X1.h,那么即为X1.h这个头文件中包含需要预编译的a.h,b.h,c.h这三个头文件。
概括来说,预编译头文件在源文件编译过程中的作用方式为:先通过预编译的方式对预编译头文件X1.h进行预编译处理,以得到预编译头文件中包含的各个头文件所对应的预编译结果。当对某源文件(假设为Y.c)进行编译时,假设这个源文件Y.c中引用了包含在预编译头文件中的头文件a.h,则直接将该源文件Y.c中引用的头文件a.h替换为头文件a.h的预编译结果即可。
可以理解的是,在目标对象(如一个项目,或项目中包含的某个功能模块)中会包含若干源文件以及若干头文件,简单来说,生成与该目标对象对应的预编译头文件的过程即为从该目标对象包含的若干头文件中选出可以添加到该预编译头文件中的头文件。
另外,生成与目标对象对应的预编译头文件的时机可以是目标对象被初始创建出时,也可以是在对目标对象进行优化后,比如优化了目标对象中包含的一些源文件、头文件。假设在目标对象被初始创建完成后,得到与该目标对象对应的第一预编译头文件,随着目标对象的优化,原本生成的第一预编译头文件可能并不适合优化后的目标对象,此时,需要再一次触发针对优化后的目标对象进行第二预编译头文件的生成,此时得到的第二预编译头文件可能与第一预编译头文件不同。
为了得到与目标对象对应的预编译头文件,首先,需要对目标对象包含的若干源文件进行解析,以确定被源文件直接引用的头文件以及源文件的数量。其中,这里的源文件的数量是指目标对象包含的源文件的总数量。
为了说明被源文件直接引用的头文件的含义,结合图3来示例性说明源文件的组织结构。如图3中所示,假设某源文件命名为1.c,在该源文件中包括如下两句代码:#include<a.h>,#include<b.h>,也就是说,该源文件中通过预编译指令include直接引用了a.h和b.h这两个头文件。基于此,本文中被某源文件直接引用的头文件即为在源文件中直接通过预编译指令include引用的头文件。另外,假设a.h这个头文件中又通过预编译指令include引用了aa.h这个头文件,b.h这个头文件中又通过预编译指令include引用了bb.h和cc.h这两个头文件,那么此时aa.h、bb.h和cc.h是被源文件1.c间接引用的头文件。如图3中所示,如果逐层解析源文件,按照头文件的引用关系,可以形成图中示意的树状结构,树状结构的根节点为源文件1.c,第一级的子节点即为被该源文件直接引用的头文件,其他层级的子节点即为被源文件间接引用的头文件。但是,可以理解的是,比如在图3中,头文件aa.h虽然是被源文件1.c间接引用的头文件,但是头文件aa.h却是被头文件a.h直接引用的头文件。
通过对目标对象包含的每个源文件都进行上述解析,可以得到每个源文件中直接引用的头文件,汇总每个源文件中直接引用的头文件,即得到目标对象包含的若干头文件中被一个或多个源文件直接引用的头文件。假设目标对象中包括N个头文件,通过上述解析处理后确定出其中的M个头文件存在被源文件直接引用的情况,其中,N>M>1。
可以理解的是,这里并非是说M个头文件同时都被某个或某些个源文件直接引用,而是指M个头文件中的任一个头文件都存在直接引用他的一个或多个源文件。
另外,在从N个头文件中确定出上述M个头文件后,可以理解的是,与目标对象对应的预编译头文件即从这M个头文件中选择。
在得到上述M个头文件后,针对其中的每个头文件,确定反映其在目标对象中的重要程度的特征信息,以便于结合每个头文件的特征信息,从M个头文件中确定出需要添加到目标对象对应的预编译头文件中的头文件。
可选地,头文件的特征信息包括如下至少一种:头文件在源文件中被直接引用的次数,头文件的类型参数,头文件的复杂度参数。其中,可选地,头文件的复杂度参数包括如下至少一种参数:头文件中定义的宏的数量,头文件中引入的其他头文件的数量,头文件的文件大小。
以M个头文件中的任一个头文件i为例,通过对目标对象中包含的各个源文件进行解析可以得知各源文件是否直接引用了头文件i,统计直接引用了头文件i的源文件的数量,即为头文件i在源文件中被直接引用的次数。
实际应用中,头文件的类型可以包括如下几种:系统头文件、第三方库头文件、项目中自定义的头文件。其中,系统头文件是指目标操作系统自带的头文件,比如,目标程序是windows程序,则目标操作系统是windows,此时的系统头文件即为windows系统中自带的头文件;目标程序是linux,则目标操作系统是linux,此时的系统头文件即为linux系统中自带的头文件。第三方库头文件是指第三方函数库中提供的头文件。可以预先针对每种头文件的类型设置与之对应的类型参数,可以是一种系数。比如,系统头文件的类型参数为60,第三方库头文件的类型参数为30,本项目中自定义的头文件的类型参数为0。
开发人员在开发项目的过程中,会将不同类型的头文件存储在不同的目录下,因此,可以根据头文件所对应的存储目录的名称来确定头文件的类型。
因此,针对头文件i来说,通过查询存储头文件i的目录的名称以确定其对应的类型,进而确定对应的类型参数。
在头文件i中,可能会引入其他的头文件,也可能会包含宏定义、变量定义以及模板定义等操作,本发明实施例中,结合头文件内包含的操作,定义头文件的复杂度参数。比如,头文件i的复杂度参数可以包括如下三种参数中的一种或多种:头文件i中定义的宏的数量,头文件i中引入的其他头文件的数量,头文件i的文件大小。
在得到头文件i的以上特征信息之后,可以根据头文件i的特征信息及目标对象包含的源文件的数量,确定是否将头文件i添加到目标对象对应的预编译头文件中,即是否将头文件i作为目标对象对应的预编译对象。
可选地,当采用的头文件i的特征信息包括头文件i在源文件中被直接引用的次数时,可以根据如下方式确定是否将头文件i添加到目标对象对应的预编译头文件中:
确定头文件i在源文件(即目标对象包含的全部源文件)中被直接引用的次数,与目标对象中包含的源文件的数量的比值,若该比值大于设定阈值,则确定将头文件i添加到与目标对象对应的预编译头文件中。
假设将头文件i被源文件直接引用的次数表示为Tf,目标对象中包含的源文件的数量表示为Cf,即如果Tf/Cf大于设定阈值,则确定将头文件i添加到与目标对象对应的预编译头文件中,反之,可以不添加。此时,假设以Wf表示头文件i的重要程度值,则此时Wf=Tf/Cf。
可选地,当采用的头文件i的特征信息包括头文件i在源文件中被直接引用的次数,以及头文件i的类型参数时,可以根据如下方式确定是否将头文件i添加到目标对象对应的预编译头文件中:
确定头文件i在源文件中被直接引用的次数,与头文件i的类型参数的乘积;
若所述乘积大于设定阈值,则确定将头文件i添加到与目标对象对应的预编译头文件中。
假设头文件i的类型参数表示为Lf,将头文件i在源文件中被直接引用的次数表示为Tf,则如果Lf*Tf大于设定阈值,则确定将头文件i添加到与目标对象对应的预编译头文件中,反之,可以不添加。此时,假设以Wf表示头文件i的重要程度值,则Wf=Lf*Tf。
可选地,当采用的头文件i的特征信息包括头文件i在源文件中被直接引用的次数,以及头文件i的类型参数时,还可以根据如下方式确定是否将头文件i添加到目标对象对应的预编译头文件中:
确定头文件i在源文件中被直接引用的次数,与源文件的数量的比值;
确定头文件i在源文件中被直接引用的次数,与头文件i的类型参数的乘积;
确定所述比值与所述乘积的加和结果;
若加和结果大于设定阈值,则确定将头文件添加到与目标对象对应的预编译头文件中。
假设头文件i的类型参数表示为Lf,将头文件i在源文件(中被直接引用的次数表示为Tf,目标对象中包含的源文件的数量表示为Cf,则如果Tf/Cf+Lf*Tf大于设定阈值,则确定将头文件i添加到与目标对象对应的预编译头文件中,反之,可以不添加。此时,假设以Wf表示头文件i的重要程度值,则Wf=Tf/Cf+Lf*Tf。
可选地,当采用的头文件i的特征信息包括头文件i的复杂度参数,比如包括头文件i中定义的宏的数量,头文件i中引入的其他头文件的数量和头文件i的文件大小时,可以根据如下方式确定是否将头文件i添加到目标对象对应的预编译头文件中:
计算头文件i中定义的宏的数量,头文件i中引入的其他头文件的数量和头文件i的文件大小的加和结果,若该加和结果大于设定阈值,则确定将头文件i添加到与目标对象对应的预编译头文件中,反之,可以不添加。
其中,可选地,上述三项的加和具体可以采用如下方式计算:
If+Mf/100+Sf/1024
其中,If表示头文件i中引入的其他头文件的数量,Mf表示头文件i中定义的宏的数量,Sf表示头文件i的文件大小。此时,假设以Wf表示头文件i的重要程度值,则Wf=If+Mf/100+Sf/1024。其中,If+Mf/100+Sf/1024亦为头文件i的复杂度系数。
以上举例的是头文件i的复杂度中包括上述三种信息,当仅包含其中的一种或两种时,同理。
可选地,当采用的头文件i的特征信息包括头文件i在源文件中被直接引用的次数,头文件i的类型参数,头文件i中定义的宏的数量,头文件i中引入的其他头文件的数量,以及头文件i的文件大小时,可以根据如下方式确定是否将头文件i添加到目标对象对应的预编译头文件中:
确定头文件i在源文件中被直接引用的次数,与源文件的数量的比值;
确定头文件i在源文件中被直接引用的次数,与头文件i的类型参数的乘积;
根据头文件i的复杂度参数,确定头文件i的复杂度系数;
确定所述比值、所述乘积与所述复杂度系数的加和结果;
若所述加和结果大于设定阈值,则确定将头文件i添加到与目标对象对应的预编译头文件中。
结合上文中的假设,可选地,此时可以有:
Wf=Lf*Tf+(Tf/Cf)*100*3+(If+Mf/100+Sf/1024)*1.5
若Wf大于设定阈值,则确定将头文件i添加到目标对象对应的预编译头文件中,反之,不添加。
其中,Wf表示头文件i的重要程度值,3和1.5是预设的系数,这里仅为举例,还可以视为其他数值。
综上,可以结合头文件的一种或多种特征信息来确定某头文件在目标对象包含的若干头文件中的重要程度,只有重要程度符合要求的头文件才会被选择作为目标对象对应的预编译对象而添加到目标对象对应的预编译头文件中,从而实现针对该目标对象的预编译头文件的生成,在编译该目标对象时,基于该预编译头文件才能获得更好地编译效率。
图4为本发明实施例提供的一种预编译方法的流程图,如图4所示,该方法包括如下步骤:
401、解析目标对象包含的源文件,以确定被源文件直接引用的头文件和源文件的数量。
402、获取头文件的目标操作系统的操作系统类型。
其中,目标操作系统如前所述是指运行编译得到的目标程序的操作系统。
403、若操作系统类型为预设的第一操作系统,则确定头文件的特征信息。
404、若操作系统类型为预设的第二操作系统,则获取头文件中定义的目标参数的数量,若头文件中定义的目标参数的数量小于或等于设定阈值,则确定头文件的特征信息。
405、根据头文件的特征信息及源文件的数量,确定是否将头文件添加到与目标对象对应的预编译头文件中。
406、对与目标对象对应的预编译头文件进行预编译处理。
以上其他实施例中介绍的是如何根据头文件的特征信息来确定是否将某头文件添加到目标对象对应的预编译头文件中。本实施例中,确定是否将某头文件添加到目标对象对应的预编译头文件中,除了基于头文件的特征信息外,还可以结合目标对象的所对应的目标操作系统的操作系统类型。因为不同目标操作系统的编译器是不同的,比如,目标程序是windows程序,编译器可以是在windows上运行的visual studio编译器,也可以是在linux平台上用交叉编译器编译出能在windows上运行的程序,而不同编译器的计算处理能力是不同的。
可选地,在本发明实施例中,可以考虑两种不同类型的目标操作系统,分别称为第一操作系统和第二操作系统,其中,假设第一操作系统所支持的编译器的处理能力高于第二操作系统所支持的编译器的处理能力。
基于上述假设,可选地,可以根据头文件的目标操作系统的操作系统类型来确定是否执行确定头文件的特征信息的步骤。具体地,若头文件的目标操作系统的操作系统类型为第一操作系统,则执行确定头文件的特征信息的步骤。也就是说,当采用第一操作系统时,可以根据头文件的特征信息来确定是否将头文件添加到与目标对象对应的预编译头文件中。
而若头文件的目标操作系统的操作系统类型为第二操作系统,此时,需要先获取头文件中定义的目标参数的数量,以根据头文件中定义的目标参数的数量确定是否执行确定头文件的特征信息的步骤,其中,所述目标参数包括变量和/或模板。其中,若头文件中定义的目标参数的数量小于或等于设定阈值,则执行确定头文件的特征信息的步骤;若头文件中定义的目标参数的数量大于设定阈值,则不执行确定头文件的特征信息的步骤。也就是说,此时只有当头文件中定义的目标参数的数量小于或等于设定阈值时,才可以根据头文件的特征信息来确定是否将头文件添加到与目标对象对应的预编译头文件中。其中,上述设定阈值比如为0。
可选地,可以预先针对不同类型的目标操作系统设置对应的操作系统系数。参考前述其他实施例中的说明,在基于头文件i的特征信息确定出前文中的Wf后,以Wf与头文件的目标操作系统所对应的操作系统系数的乘积作为确定是否将头文i添加到与目标对象对应的预编译头文件中,具体地,如果该乘积大于设定阈值,则将头文i添加到与目标对象对应的预编译头文件中。可以理解的是,此时,支持处理能力更高的编译器的操作系统所对应的操作系统系数更高。
本实施例中,由于不同类型的目标操作系统所支持的编译器不同,而不同编译器对预编译的具体实现存在差异,因此在生成目标对象对应的预编译头文件时综合考虑操作系统类型的因素。对于第二操作系统(假设其支持的编译器的处理能力弱),由于将含有模板定义和变量定义的头文件加入到预编译头文件中,反而可能会减慢编译速度,因此,在第二操作系统下,当某头文件含有模板定义和变量定义(或者含有的数量较多)时,可以不将该头文件加入到预编译头文件中。
实际应用中,可以定义一个操作系统系数Of,针对上述第一操作系统和第二操作系统的划分,Of的取值可以包括0,1两种数值。其中,针对前文中的头文件i来说,当头文件的目标操作系统的操作系统类型为第一操作系统时,Of=1;当头文件的目标操作系统的操作系统类型为第二操作系统,且头文件i中定义的目标参数的数量小于或等于设定阈值时,Of=1;当头文件的目标操作系统的操作系统类型为第二操作系统,且头文件i中定义的目标参数的数量大于设定阈值时,Of=0。
在结合上述目标操作系统的操作系统类型来确定是否将某头文件添加到与目标对象对应的预编译头文件中的情形下,假设最终用以确定是否将某头文件添加到与目标对象对应的预编译头文件中的评价指标表示为Wf’,则Wf’=Wf*Of,其中,Wf是仅根据头文件的特征信息计算得到的结果,计算过程可以参考前述其他实施例中的说明,比如,可选地,Wf’=[Lf*Tf+(Tf/Cf)*100*3+(If+Mf/100+Sf/1024)*1.5]*Of。
以下将详细描述本发明的一个或多个实施例的预编译装置。本领域技术人员可以理解,这些装置均可使用市售的硬件组件通过本方案所教导的步骤进行配置来构成。
图5为本发明实施例提供的一种预编译装置的结构示意图,如图5所示,该装置包括:解析模块11、第一确定模块12、第二确定模块13、预编译模块14。
解析模块11,用于解析目标对象包含的源文件,以确定被源文件直接引用的头文件和源文件的数量。
第一确定模块12,用于确定所述头文件的特征信息。
第二确定模块13,用于根据所述头文件的特征信息及所述源文件的数量,确定是否将所述头文件添加到与所述目标对象对应的预编译头文件中。
预编译模块14,用于对与所述目标对象对应的预编译头文件进行预编译处理。
可选地,所述目标对象包括:项目中包含的任一功能模块。
可选地,第一确定模块12具体可以用于:获取所述头文件的目标操作系统的操作系统类型;根据所述操作系统类型,确定是否执行确定所述头文件的特征信息的步骤。
其中,可选地,第一确定模块12具体可以用于:若所述操作系统类型为预设的第一操作系统,则执行确定所述头文件的特征信息的步骤;若所述操作系统类型为预设的第二操作系统,则获取所述头文件中定义的目标参数的数量,所述目标参数包括变量和/或模板;根据所述头文件中定义的目标参数的数量,确定是否执行确定所述头文件的特征信息的步骤。
其中,在根据所述头文件中定义的目标参数的数量,确定是否执行确定所述头文件的特征信息的步骤的过程中,第一确定模块12具体可以用于:若所述头文件中定义的目标参数的数量小于或等于设定阈值,则执行确定所述头文件的特征信息的步骤;若所述头文件中定义的目标参数的数量大于设定阈值,则不执行确定所述头文件的特征信息的步骤。
可选地,所述特征信息包括如下至少一种:所述头文件在所述源文件中被直接引用的次数,所述头文件的类型参数,所述头文件的复杂度参数;所述头文件的复杂度参数包括如下至少一种参数:所述头文件中定义的宏的数量,所述头文件中引入的其他头文件的数量,所述头文件的文件大小。
可选地,所述第二确定模块13具体可以用于:确定所述头文件在所述源文件中被直接引用的次数,与所述源文件的数量的比值;确定所述头文件在所述源文件中被直接引用的次数,与所述头文件的类型参数的乘积;确定所述比值与所述乘积的加和结果;若所述加和结果大于设定阈值,则确定将所述头文件添加到与所述目标对象对应的预编译头文件中。
其中,可选地,所述第二确定模块13具体可以用于:确定所述头文件在所述源文件中被直接引用的次数,与所述源文件的数量的比值;确定所述头文件在所述源文件中被直接引用的次数,与所述头文件的类型参数的乘积;根据所述头文件的复杂度参数,确定所述头文件的复杂度系数;确定所述比值、所述乘积与所述复杂度系数的加和结果;若所述加和结果大于设定阈值,则确定将所述头文件添加到与所述目标对象对应的预编译头文件中。
图5所示装置可以执行前述图1至图4所示实施例中提供的预编译方法,详细的执行过程和技术效果参见前述实施例中的描述,在此不再赘述。
在一个可能的设计中,上述图5所示预编译装置的结构可实现为一电子设备,如图6所示,该电子设备可以包括:处理器21、存储器22。其中,存储器22上存储有可执行代码,当所述可执行代码被处理器21执行时,使处理器21至少可以实现如前述图1至图4所示实施例中提供的预编译方法。
可选地,该电子设备中还可以包括通信接口23,用于与其他设备进行通信。
另外,本发明实施例提供了一种计算机程序产品,所述计算机程序产品中包括计算机程序,当所述计算机程序被电子设备的处理器执行时,使所述处理器至少可以实现如前述图1至图4所示实施例中提供的预编译方法。
以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性的劳动的情况下,即可以理解并实施。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到各实施方式可借助加必需的通用硬件平台的方式来实现,当然也可以通过硬件和软件结合的方式来实现。基于这样的理解,上述技术方案本质上或者说对现有技术做出贡献的部分可以以计算机产品的形式体现出来,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。
Claims (10)
1.一种预编译方法,包括:
解析目标对象包含的源文件,以确定被源文件直接引用的头文件和源文件的数量;
确定所述头文件的特征信息;
根据所述头文件的特征信息及所述源文件的数量,确定是否将所述头文件添加到与所述目标对象对应的预编译头文件中;
对与所述目标对象对应的预编译头文件进行预编译处理。
2.根据权利要求1所述的方法,其中,所述方法还包括:
获取所述头文件的目标操作系统的操作系统类型;
根据所述操作系统类型,确定是否执行确定所述头文件的特征信息的步骤。
3.根据权利要求2所述的方法,其中,所述根据所述操作系统类型,确定是否执行确定所述头文件的特征信息的步骤,包括:
若所述操作系统类型为预设的第一操作系统,则执行确定所述头文件的特征信息的步骤。
4.根据权利要求2所述的方法,其中,所述根据所述操作系统类型,确定是否执行确定所述头文件的特征信息的步骤,包括:
若所述操作系统类型为预设的第二操作系统,则获取所述头文件中定义的目标参数的数量,所述目标参数包括变量和/或模板;
根据所述头文件中定义的目标参数的数量,确定是否执行确定所述头文件的特征信息的步骤。
5.根据权利要求4所述的方法,其中,所述根据所述头文件中定义的目标参数的数量,确定是否执行确定所述头文件的特征信息的步骤,包括:
若所述头文件中定义的目标参数的数量小于或等于设定阈值,则执行确定所述头文件的特征信息的步骤;
若所述头文件中定义的目标参数的数量大于设定阈值,则不执行确定所述头文件的特征信息的步骤。
6.根据权利要求1至5中任一项所述的方法,其中,所述头文件的特征信息包括如下至少一种:
所述头文件在所述源文件中被直接引用的次数,所述头文件的类型参数,所述头文件的复杂度参数;
所述头文件的复杂度参数包括如下至少一种参数:
所述头文件中定义的宏的数量,所述头文件中引入的其他头文件的数量,所述头文件的文件大小。
7.根据权利要求6所述的方法,其中,所述根据所述头文件的特征信息及所述源文件的数量,确定是否将所述头文件添加到与所述目标对象对应的预编译头文件中,包括:
确定所述头文件在所述源文件中被直接引用的次数,与所述源文件的数量的比值;
确定所述头文件在所述源文件中被直接引用的次数,与所述头文件的类型参数的乘积;
确定所述比值与所述乘积的加和结果;
若所述加和结果大于设定阈值,则确定将所述头文件添加到与所述目标对象对应的预编译头文件中。
8.根据权利要求6所述的方法,其中,所述根据所述头文件的特征信息及所述源文件的数量,确定是否将所述头文件添加到与所述目标对象对应的预编译头文件中,包括:
确定所述头文件在所述源文件中被直接引用的次数,与所述源文件的数量的比值;
确定所述头文件在所述源文件中被直接引用的次数,与所述头文件的类型参数的乘积;
根据所述头文件的复杂度参数,确定所述头文件的复杂度系数;
确定所述比值、所述乘积与所述复杂度系数的加和结果;
若所述加和结果大于设定阈值,则确定将所述头文件添加到与所述目标对象对应的预编译头文件中。
9.一种电子设备,包括:存储器、处理器;其中,所述存储器上存储有可执行代码,当所述可执行代码被所述处理器执行时,使所述处理器执行如权利要求1至8中任一项所述的预编译方法。
10.一种计算机程序产品,包括:计算机程序,当所述计算机程序被电子设备的处理器执行时,使所述处理器执行如权利要求1至8中任一项所述的预编译方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110199012.1A CN114968247A (zh) | 2021-02-22 | 2021-02-22 | 预编译方法、设备和计算机程序产品 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110199012.1A CN114968247A (zh) | 2021-02-22 | 2021-02-22 | 预编译方法、设备和计算机程序产品 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN114968247A true CN114968247A (zh) | 2022-08-30 |
Family
ID=82954735
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202110199012.1A Pending CN114968247A (zh) | 2021-02-22 | 2021-02-22 | 预编译方法、设备和计算机程序产品 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN114968247A (zh) |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116069338A (zh) * | 2023-03-07 | 2023-05-05 | 深圳开源互联网安全技术有限公司 | 一种函数库引用检测方法、装置、设备及可读存储介质 |
CN118550549A (zh) * | 2024-07-30 | 2024-08-27 | 浙江大华技术股份有限公司 | 软件编译优化方法、设备以及存储介质 |
-
2021
- 2021-02-22 CN CN202110199012.1A patent/CN114968247A/zh active Pending
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116069338A (zh) * | 2023-03-07 | 2023-05-05 | 深圳开源互联网安全技术有限公司 | 一种函数库引用检测方法、装置、设备及可读存储介质 |
CN116069338B (zh) * | 2023-03-07 | 2023-08-11 | 深圳开源互联网安全技术有限公司 | 一种函数库引用检测方法、装置、设备及可读存储介质 |
CN118550549A (zh) * | 2024-07-30 | 2024-08-27 | 浙江大华技术股份有限公司 | 软件编译优化方法、设备以及存储介质 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US9798648B2 (en) | Transitive source code violation matching and attribution | |
US8893102B2 (en) | Method and system for performing backward-driven path-sensitive dataflow analysis | |
Scanniello et al. | Clustering support for static concept location in source code | |
CN111209005B (zh) | 程序文件的编译方法、装置和计算机可读存储介质 | |
EP3365772B1 (en) | Missing include suggestions for external files | |
US11675575B2 (en) | Checking source code validity at time of code update | |
US20110137634A1 (en) | Canonicalized versions of reuse candidates in graphical state diagrams | |
CN114968247A (zh) | 预编译方法、设备和计算机程序产品 | |
US8516457B2 (en) | Method, system and program storage device that provide for automatic programming language grammar partitioning | |
CN113377342B (zh) | 一种项目构建方法、装置、电子设备及存储介质 | |
US9367307B2 (en) | Staged points-to analysis for large code bases | |
WO2015003452A1 (en) | Methods and systems for file processing | |
US9116714B2 (en) | Methods and systems for file processing | |
US20210173641A1 (en) | Generation of knowledge graphs based on repositories of code | |
US11288044B1 (en) | System and method for interprocedural analysis | |
KR101798705B1 (ko) | 유연성을 갖춘 메타데이터 구성 기법 | |
CN110297639B (zh) | 用于检测代码的方法和装置 | |
CN116578282A (zh) | 代码生成方法、装置、电子设备及介质 | |
CN117785213B (zh) | 基于Rust开发的前端构建工具及构建方法 | |
US11615014B2 (en) | Using relocatable debugging information entries to save compile time | |
García-Díaz et al. | MCTest: towards an improvement of match algorithms for models | |
CN117539492A (zh) | 代码中冗余语句的删除方法、装置、电子设备及存储介质 | |
US11157252B2 (en) | Assessment of the benefit of post-inlining program transformation in inlining decisions | |
Nusrat | An Empirical Analysis of Unity Performance Bugs | |
Ahn et al. | A weighted call graph approach for finding relevant components in source code |
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 |