1.本说明书涉及计算机技术领域,尤其涉及一种编译方法、装置以及设备。
背景技术:2.在软件研发过程中,代码编译是一项需要频繁迭代执行的操作,尤其是一些大中型软件,频繁编译会耗费大量时间,从而不利于提高研发效率。
3.以某个大型数据库为例,其拥有300多万行核心代码,其超大的代码量使得编译耗时相比于一些小型软件大大增加,单机编译该数据库的一个debug版本需要40分钟,而编译一个release版本需要一个小时以上。
4.基于此,需要更为高效的编译方案,以帮助提高大中型软件的研发效率。
技术实现要素:5.本说明书一个或多个实施例提供一种编译方法、装置、设备以及存储介质,用以解决如下技术问题:需要更为高效的编译方案,以帮助提高大中型软件的研发效率。
6.为解决上述技术问题,本说明书一个或多个实施例是这样实现的:
7.本说明书一个或多个实施例提供的一种编译方法,包括:
8.触发编译过程启动;
9.根据待编译数据,在本地查询是否存在相应的已编译的第一缓存数据;
10.若是,则根据所述第一缓存数据,确定所述待编译数据的编译结果;
11.否则,向后端查询是否存在相应的已编译的第二缓存数据,若存在,则根据所述第二缓存数据,确定所述待编译数据的编译结果。
12.本说明书一个或多个实施例提供的一种编译装置,包括:
13.编译过程触发模块,触发编译过程启动;
14.本地缓存查询模块,根据待编译数据,在本地查询是否存在相应的已编译的第一缓存数据;
15.编译结果确定模块,若是,则根据所述第一缓存数据,确定所述待编译数据的编译结果;
16.后端缓存查询模块,否则,向后端查询是否存在相应的已编译的第二缓存数据,若存在,则所述编译结果确定模块,根据所述第二缓存数据,确定所述待编译数据的编译结果。
17.本说明书一个或多个实施例提供的一种编译设备,包括:
18.至少一个处理器;以及,
19.与所述至少一个处理器通信连接的存储器;其中,
20.所述存储器存储有可被所述至少一个处理器执行的指令,所述指令被所述至少一个处理器执行,以使所述至少一个处理器能够:
21.触发编译过程启动;
22.根据待编译数据,在本地查询是否存在相应的已编译的第一缓存数据;
23.若是,则根据所述第一缓存数据,确定所述待编译数据的编译结果;
24.否则,向后端查询是否存在相应的已编译的第二缓存数据,若存在,则根据所述第二缓存数据,确定所述待编译数据的编译结果。
25.本说明书一个或多个实施例提供的一种非易失性计算机存储介质,所述介质存储有计算机可执行指令,所述计算机可执行指令设置为:
26.触发编译过程启动;
27.根据待编译数据,在本地查询是否存在相应的已编译的第一缓存数据;
28.若是,则根据所述第一缓存数据,确定所述待编译数据的编译结果;
29.否则,向后端查询是否存在相应的已编译的第二缓存数据,若存在,则根据所述第二缓存数据,确定所述待编译数据的编译结果。
30.本说明书一个或多个实施例采用的上述至少一个技术方案能够达到以下有益效果:通过在工作机(比如,开发机、测试机等)本地,以及局域网后端,乃至互联网后端等非本地位置构建多级缓存,对以往的一些编译结果进行缓存,之后再有编译需求时,对待编译数据进行分析,尝试在多级缓存中查询并复用已缓存的编译结果,从而未必要完全从头重新编译,因此,有助于提高编译效率,尤其是大中型软件迭代研发过程中,有更多的机会实现编译结果复用,能够提高软件研发效率。
附图说明
31.为了更清楚地说明本说明书实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本说明书中记载的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
32.图1为本说明书一个或多个实施例提供的一种编译方法的流程示意图;
33.图2为本说明书一个或多个实施例提供的图1中方法的一种具体实施方案的流程示意图;
34.图3为本说明书一个或多个实施例提供的图1中方法的另一种具体实施方案的流程示意图;
35.图4为本说明书一个或多个实施例提供的大规模开发机共建共享缓存的示意图;
36.图5为本说明书一个或多个实施例提供的一种编译装置的结构示意图;
37.图6为本说明书一个或多个实施例提供的一种编译设备的结构示意图。
具体实施方式
38.本说明书实施例提供一种编译方法、装置、设备以及存储介质。
39.为了使本技术领域的人员更好地理解本说明书中的技术方案,下面将结合本说明书实施例中的附图,对本说明书实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本技术一部分实施例,而不是全部的实施例。基于本说明书实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本技术保护的范围。
40.针对背景技术中的问题,本技术考虑通过缓存并复用历史的编译结果来解决,不过缓存局限于本地,不同的开发机之间无法共享缓存;不仅局限于所在的开发机,一个相同的编译命令在研发的各个周期也会重复无效编译,本地编译、单测检查编译、合入检查编译、软件发版编译等各个阶段,严重影响效率。基于此,考虑再引入网络文件系统(network file system,nfs)机制。
41.nfs是基于udp/ip协议的应用,其实现主要是采用远程过程调用(remote procedure call,rpc)机制,rpc提供了一组与机器、操作系统以及低层传送协议无关的存取远程文件的操作。rpc采用了xdr的支持。xdr是一种与机器无关的数据描述编码的协议,他以独立与任意机器体系结构的格式对网上传送的数据进行编码和解码,支持在异构系统之间数据的传送。基于nfs使得不同的开发机的磁盘能够相互访问,从而可以共享缓存的编译结果,
42.比如,以centos为例,通过命令“yum install nfs-utils portmap nfs4-acl-tools”,安装nfs,通过命令“sudo mkdir/home/nfs”、“sudo chmod 777/home/nfs”,类似地,还通过一系列相关命令,让不同的机器能够访问/home/nfs目录,还需要对缓存相关的环境变量进行一系列的配置动作,以将相应的缓存映射到/home/nfs目录下,等等,这里不再展开说明。
43.不过,nfs方案缺点也很明显,包括:配置nfs部署和初始化较为繁琐,操作负担较重而且容易出错,另外,nfs需要仔细留意用户权限问题,容易出现无法写入或者读取问题,而且如果权限过高,又容易造成缓存污染问题。
44.针对上面的这些问题,本技术又提出了多级缓存的方案,以工作机本地、一级或者多级局域网后端、一级或者多级互联网后端等分别作为各层级,然后部署相应的多级缓存,用于对历史的编译结果相关数据进行存储,以提供给需要进行编译的工作机使用,从而能够兼顾编译效率和可靠性,而且又避免了复杂操作,避免了给工作机带来负担。下面主要针对这种思路详细说明。
45.图1为本说明书一个或多个实施例提供的一种编译方法的流程示意图。该方法可以应用于不同的业务领域中,这些业务领域比如包括:电子支付业务领域、电商业务领域、即时通讯业务领域、游戏业务领域、公务业务领域等。该流程可以在这些领域中有代码编译需求的设备上执行,典型的如开发机,除了开发机以外,还可以部署到软件研发的各个周期,比如准入检查编译机器、单测编译机器和发版编译的机器上等。流程中的某些输入参数或者中间结果允许人工干预调节,以帮助提高准确性。
46.图1中的流程可以包括以下步骤:
47.s102:触发编译过程启动。
48.在本说明书一个或多个实施例中,通过编译脚本来触发针对指定的待编译数据的编译过程。具体在指定的目录下设置编译器前缀,将其关联指定的编译命令构成脚本,编译命令可以具体地指示待编译数据以及一些可选的编译参数。
49.s104:根据待编译数据(可以称当前的待编译数据,以便于与历史数据区分),在本地查询是否存在相应的已编译的第一缓存数据。第一缓存数据是通过对历史的一些待编译数据进行编译得到,并在本地缓存的,历史的这些编译数据有可能与当前的待编译数据部分相同。
50.以该步骤的执行主体是开发机为例,则这里的本地指该开发机本机上。预先在本地构建有缓存(这是多级缓存中的其中一级缓存,为了便于区分称为一级缓存),用于存储本地历史的一些编译结果或者相关的中间数据,将这些数据称为第一缓存数据,为了便于查询缓存,可以构建这些数据与其对应的编译前数据之前的对应关系,从而可以基于待编译数据,在该缓存中进行索引查询。
51.在本地查询缓存,成本(比如通讯成本、计算成本等)较小,因此优先在本地的一级缓存中查询。对于待编译数据而言,其中可能存在一部分甚至全部内容,以往已经在本地编译过,而且编译结果已存储在第一缓存中,则可以通过查询,确定一级缓存中是否存在待编译数据对应的至少部分编译结果,若存在,则可以进行复用,以避免完全重新编译待编译数据。
52.在本说明书一个或多个实施例中,在本地缓存历史的编译结果时,可以建立该编译结果与对应的编译前数据的哈希信息之间的对应关系,从而可以基于哈希信息高效地索引查询。比如,在s104中,对当前的至少部分待编译数据进行哈希计算,得到当前的哈希信息(称为第一哈希信息),根据第一哈希信息,在本地缓存的历史的各哈希信息中进行索引查询,以确定是否能够命中某些历史的哈希信息,进而查询到是否存在历史缓存的、相应的已编译的第一缓存数据,比如,命中的哈希信息所对应的历史的编译结果。
53.可以将待编译数据划分为多个数据块(比如,可以独立编译的多个代码块),分别查询,如此,有助于提高命中概率,进而虽然未必能够全部复用,但也可能实现部分复用,则只需要重新编译一部分待编译数据即可,同样也能够实现提高编译效率的目的。
54.s106:若是,则根据所述第一缓存数据,确定所述待编译数据的编译结果。
55.在本说明书一个或多个实施例中,将查询得到的第一缓存数据拷贝使用,复用为待编译数据的至少部分编译结果。若第一缓存数据包含了编译过程中的中间数据,则也可以将中间数据继续编译完成,作为待编译数据的至少部分编译结果,同样也节省了部分编译过程耗时。
56.s108:否则,向后端查询是否存在相应的已编译的第二缓存数据,若存在,则根据所述第二缓存数据,确定所述待编译数据的编译结果。
57.在本说明书一个或多个实施例中,单凭本地的一级缓存局限性仍然过大,一级缓存比较方便本机本地使用,但是对于其他的机器而言使用仍然不方便甚至无法使用。基于此,进一步地在后端构建另一级或者另多级缓存(称为二级缓存),以通过二级缓存,将历史的编译结果或者编译中间数据为各工作机共享使用。
58.这种方式无需各工作机相互之间访问磁盘,而是各工作机根据自己需要都访问后端即可,后端比如是预先部署的服务器,或者提供公共服务的开发机等。如此,相比于nfs更容易部署,降低了各工作机上的操作负担,而且能够便利可靠地进行权限管控。
59.在本说明书一个或多个实施例中,在实际应用中,多个工作机往往处于同一个公司的同一个局域网内,因此,可以将后端部署于该局域网内,称为局域网后端。则同处一个局域网的各工作机需要编译时,首先尝试在本地的一级缓存中查询,若未命中还可以很便利地访问局域网后端,在二级缓存中再次查询。
60.相比于一级缓存,可以在二级缓存中保存更多的历史数据,这些历史数据可以来自不同的工作机,从而突破了各工作机本地的局限,有效地共享了各工作机产生的历史的
编译结果等相关数据。
61.类似地,对于局域网后端,可以将局域网后端也细分为多级后端,相应地对应多级缓存。比如,按照公司的部门、部门内的小组等组织结构划分。
62.在本说明书一个或多个实施例中,若后端查询也未命中有效的查询结果,则可以对待编译数据正常进行编译,之后,将编译得到的编译结果在本地和/或后端,作为相应的已编译的第一缓存数据或者第二缓存数据进行缓存,用于后续查询和复用。
63.通过图1的方法,通过在工作机本地,以及局域网后端,乃至互联网后端等非本地位置构建多级缓存,对以往的一些编译结果进行缓存,之后再有编译需求时,对待编译数据进行分析,尝试在多级缓存中查询并复用已缓存的编译结果,从而未必要完全从头重新编译,因此,有助于提高编译效率,尤其是大中型软件迭代研发过程中,有更多的机会实现编译结果复用,能够提高软件研发效率。
64.基于图1的方法,本说明书还提供了该方法的一些具体实施方案和扩展方案,下面继续进行说明。
65.在本说明书一个或多个实施例中,在实际应用中,待编译数据往往是大中型软件当前的一个最新版本,历史的编译结果则包括对该最新版本之前的版本的编译结果,为了便于描述将该最新版本称为第二版本,之前的版本(即早于第二版本的其他版本)称为第一版本。版本迭代时,往往是代码的大部分内容是不变的,只有一小部分内容改变,这一小部分内容其中的某些内容尤其容易频繁迭代,或者这些内容有多个不同的相对成熟的可选子版本,本技术将这些内容的特性用迭代熟练度来表示,迭代熟练度越大表示对应的局部内容越容易频繁迭代,或者越有多个不同的相对成熟的可选子版本并行存在,对于这样的内容的编译结果可以在后端单独进行缓存,而未必要在后端缓存整个版本全量的编译结果,从而有助于降低后端负担,也更容易命中,相应地,可以将其他不容易改变的大块内容的编译结果优先在本地缓存。
66.基于这样的思路,当前的待编译数据为指定软件的第二版本,在根据待编译数据,在本地查询是否存在相应的已编译的第一缓存数据之前,可以对指定软件的早于第二版本的第一版本进行编译,得到第一版本的编译结果,在第一版本中确定迭代熟练度大于设定阈值的一个或者多个局部代码块(包括上述的这样的内容),在第一版本的编译结果中,确定对应于局部代码块的局部编译结果,将所述局部编译结果作为所述相应的已编译的第二缓存数据,在所述后端进行缓存。
67.进一步地,对于不同的工作机而言,可能属于不同的研发小组或者研发人员,以大版本为基础,在不同的工作机上阶段性可能产生一些分支版本。那么某些工作机上的当前版本内的某些代码块可能在别的工作机上是没有的,主要在该工作机上阶段性使用,之后可能合并入大版本,也可能抛弃,其可能具有一些独特的功能,将这样的代码块称为特异性局部代码块。但是,在实际应中,不同的工作机之间可能具有一定的隔离性,对于特异性局部代码块而言,也许其他某些工作机也有需要使用(比如,配合公共模块测试功能性能等),但是其并不知道该特异性局部代码块的存在,从而影响了开发资源的统筹使用,甚至可能造成重复开发浪费资源,基于此,将特异性局部代码块的局部编码结果主动在后端提供,以供其他工作机若有需要扩展选用,从而有助于其他工作机直接得到一个扩展的版本编译结果,而无需回头调整代码再重新编译。
68.具体比如,在各局部代码块中确定是否存在多个工作机中由当前的工作机提供的特异性局部代码块,将特异性局部代码块的局部编码结果确定为特异性拼插编码结果(其他工作机上没有对应部分的源代码,也无需具有对应部分的源代码),将特异性拼插编码结果作为相应的已编译的第二缓存数据中的至少部分内容,在后端进行缓存,以便当前的工作机以外的其他工作机,若有需求,能够可选地将特异性拼插编码结果作为扩展的编码结果拼插使用。
69.在本说明书一个或多个实施例中,无论是在本地查询还是向后端查询,又提供了两种不同的处理模式,称为直接模式和预处理模式。
70.在直接模式下,待编译数据包括原始的待编译文件的源代码以及所述源代码依赖的递归头文件(该头文件具体包含有头文件的代码,该代码中可能也有依赖的另一个头文件,如此构成递归关系),根据该源代码和该递归头文件进行查询。
71.若直接模式下,未命中有效的查询结果,则可以采用预处理模式。在预处理模式下,可以对直接模式下的源代码进行预处理编译得到预处理文件,然后根据预处理文件进行查询。
72.这样的处理逻辑的原理在于:在正常的代码编译过程中,也需要进行预处理编译,对于不完全一致的两份代码,它们经过预处理编译后得到的预处理文件是有可能一致的,因此预处理编译可能会忽略或者同质化处理某些不重要的参数,在这种情况下,它们最终的编译结果是相同的。比如,在上述的源代码以及其依赖的递归头文件(称为第一份代码)中,除了包含头文件本身的代码以外,还可能包含头文件的时间戳,对于另一份代码(称为第二份代码),可能只有该时间戳与第一份代码的时间戳不一致,其他都是一致的,这样的时间戳实际上不会影响最终的编译结果。
73.那么,这对这样的两份代码,假定第一份代码以往已经编译过并缓存了编译结果,之后,在面对待编译的第二份代码时,若采用直接模式进行查询,由于时间戳不一致,导致在缓存中可能无法命中该编译结果,从而无法复用该编译结果。而若再采用预处理模式进行查询,则可能命中该编译结果,当前,前提是第一份代码的编译结果,也预先通过对应的预处理文件或者预处理文件的哈希信息构建了查询索引。
74.上面说明了多级缓存与双模式查询的配合思路,为了便于理解,更直观地,本说明书一个或多个实施例提供了图1中方法的一种具体实施方案的流程示意图,如图2所示。
75.在图2中,可以基于编译脚本触发编译,之后,在进入直接模式前,还可以可选地对编译基础信息进行判别,主要包括编译器信息、编译参数、环境变量等,若这些信息都一致再进行后续判断,否则,也可以直接结束进入重新编译。
76.继续图2中的流程,若编译基础信息一致,则进入直接模式。在直接模式下,待编译数据包括原始的待编译文件的源代码以及该源代码依赖的递归头文件,对该源代码和该递归头文件进行哈希计算,得到第一哈希信息,根据所述第一哈希信息,在本地查询是否存在相应的已编译的第一缓存数据,第一缓存数据包括对该源代码和/或该递归头文件的编译结果。类似地,向后端查询时,根据第一哈希信息,向后端本地查询是否存在第二缓存数据,第二缓存数据包括对该源代码和/或该递归头文件的编译结果。
77.在图2中比如:计算该源代码和该递归头文件的哈希信息,据此依次查询在本地的一级缓存中,以及后端的二级缓存中查询,若查询命中则可以直接复用缓存,若均未命中则
可以进入预处理模式再次尝试。即若在本地和后端均未查询到对该源代码和/或该递归头文件的编译结果,则对该源代码进行预处理编译得到预处理文件,对预处理文件进行哈希计算,得到第二哈希信息,根据第二哈希信息,在本地查询是否存在相应的已编译的第一缓存数据,第一缓存数据包括对预处理文件的编译结果。类似地,向后端查询时,若在本地未查询到对预处理文件的编译结果,则根据第二哈希信息,向后端查询是否存在相应的已编译的第二缓存数据,第二缓存数据包括对预处理文件的编译结果。
78.在图2中比如:在直接模式下未命中结果,则回退到预处理模式,
79.计算该源代码对应的预处理文件的哈希信息,据此依次查询在本地的一级缓存中,以及后端的二级缓存中查询,若查询命中则可以直接复用缓存,若均未命中则可以考虑放弃尝试复用,改而进行常规的重新编译过程,编译产出将会进行缓存,用于下一次判断。
80.在本说明书一个或多个实施例中,配合于上述思路,还提供了相应的配置方式,以便于后端存储的访问和管理。可以在后端划分出一个或者多个缓存区域,对缓存区域的名称、访问接口进行配置,对于编译得到的缓存数据,对指定缓存进行使能配置,以指示是否允许将缓存数据写入后端的缓存区域内,这些步骤可以在后端上操作,或者通过工作机向后端下达指令执行。比如,假定当前的某大型软件名称为“xxx”,本方案作为一个项目命名为“x”,通过示例性的环境变量“x_region”进行缓存区域命名,在后端采用如下命令为其构建一个名称为“xxx_build”的存储区域:“export x_region=xxx_build”;通过示例性的环境变量“x_backend”进行接口配置,在后端采用如下命令为其配置访问接口:“export x_backend=http://www.xxx-dev.com/x/api”;通过示例性的环境变量“x_readonly_backend”进行使能配置,在后端采用如下命令为其配置,以指示允许(取值为1,若不允许则取值为0)写入缓存数据:“export x_readonly_backend=1”。
81.在本说明书一个或多个实施例中,后端的缓存的实现方式是多样的,可以采用key-value存储,通过nginx(是一个开源高性能的http和反向代理web服务器)作为资源承载,以lua(是一个小巧的脚本语言,可用于nginx模块开发)脚本实现,具体通过set、get和del这三个接口实现。比如,假定对某个缓存资源“75fe93c3807ee0d30-3202.manifest”进行操作,后端的缓存区域为x_build。
82.则示例性的上传请求为:
[0083]“http://www.xxx-dev.com/x/set/xxx_build/75fe93c3807ee0d30-3202.manifest”;
[0084]
示例性的下载请求为:
[0085]“http://www.xxx-dev.com/x/get/xxx_build/75fe93c3807ee0d30-3202.manifest”;
[0086]
示例性的删除请求为:
[0087]“http://www.xxx-dev.com/x/del/xxx_build/75fe93c3807ee0d30-3202.manifest”。
[0088]
后端的缓存除了nginx+lua的实现方式,还可以采用tomacat+java、httpd+php、python web等其他实现方式。
[0089]
前面提到了nfs的方式权限控制复杂,在本方案中,可以在后端基于白名单或者黑名单,更便利有效地进行权限控制。在默认情况下,任意开发机的都具备对后端缓存完整的
读写权限,但是,这样的话可能会一些问题,主要是一些脏缓存,一些临时测试代码可能不需要进行缓存,极端情况下可能出现攻击请求,将后端存储磁盘打满,影响整个编译缓存稳定性。
[0090]
基于此,为后端的用于存储第二缓存数据的缓存区域设置白名单或者黑名单,根据白名单或者黑名单,对存储区域进行查询权限控制。比如,以白名单为例,只允许白名单中列出的ip地址访问后端缓存,对于示例性的白名单设置指令“white_networks="10.0.0.0/8192.168.0.0/16"”,该指令中列出的网段是允许访问的;以黑名单为例,不允许黑名单中的ip地址访问后端缓存,对于示例性的黑名单设置指令“black_networkds="172.16.100.2"”,该指令中列出的ip地址是不允许访问的。
[0091]
前面对本地+局域网后端的多级缓存方案进行了说明,按照类似的思路,还可以扩展更多级的缓存,比如,扩展至互联网后端(即,相对于局域网的公网后端)。在这种情况下,向后端查询是否存在相应的已编译的第二缓存数据之后,还可以执行:若不存在,则向局域网之外的互联网后端查询是否存在相应的已编译的第三缓存数据,若查询得到第三缓存数据,则根据第三缓存数据,确定待编译数据的编译结果。更直观地,本说明书一个或多个实施例还提供了图1中方法的另一种具体实施方案的流程示意图,如图3所示。
[0092]
在图3中,在图2中的两级缓存的基础上,进一步扩展了另一级缓存(称为三级缓存),总共具备,本地的一级缓存、局域网后端的二级缓存、互联网后端的共3级缓存,形成多级级联的效果。新扩展的三级缓存的访问原理与二级缓存类似,参照图示理解即可,这里不再重复具体说明。
[0093]
如此扩展的原因在于:局域网的合作仅限于一个大型公司内部编译系统,提供互联网后端缓存可以用于不具备内网办公环境的团队,另外,更便于针对互联网上的一些开源项目进行编译加速。
[0094]
在实际应用中,引入三级缓存后还需要考虑适配条件。在一个局域网内,速度是非常快的,目前的网卡间数据传输速度可以媲美本机拷贝速度,但是,在互联网上网速则没有这么高,为了提高三级缓存的访问速度,对于互联网后端可以考虑一些云服务提供的内容分发网络(content delivery network,cdn)能力。
[0095]
当然,三级缓存乃至更多级缓存还有多种实现方法,可以根据实际情况来划分,一般是从小到大的一个布局。比如,公司小部门建立一个相对小的后端二级缓存,然后,整个公司集团再建立一个大的后端三级缓存。
[0096]
图4为本说明书一个或多个实施例提供的大规模开发机共建共享缓存的示意图。通过扩展出多级缓存,能够实现针对大中型软件的,在其内部大规范开发团队(比如表现为:开发机1~开发机n)中实现编译缓存的共建共享,团队中的任意开发机只要编译过某个待编译单元,则其他的开发机就能够快速进行复用。
[0097]
综上所述,本方案实现了针对历史编译结果的后端缓存功能,实现了编译缓存的共建共享能力,通过本地结合后端的多级缓存复用方式,有效提高了编译效率和编译复用效率;提供了更多级缓存的可选方案,满足了各种场景,有助于大规模落地;解决了nfs部署麻烦的问题,有效降低了配置复杂度,实现了后端缓存便利的权限控制,能够更加安全和高效地管理缓存;对于用于测试方案效果的某大型数据库软件,采用本方案后,其编译速度从单机debug版本编译耗时40分钟缩短至10分钟左右,而在全部复用的情况下甚至可以实现2
分钟内完成编译。
[0098]
基于同样的思路,本说明书一个或多个实施例还提供了上述方法对应的装置和设备,如图5、图6所示。
[0099]
图5为本说明书一个或多个实施例提供的一种编译装置的结构示意图,所述装置包括:
[0100]
编译过程触发模块502,触发编译过程启动;
[0101]
本地缓存查询模块504,根据待编译数据,在本地查询是否存在相应的已编译的第一缓存数据;
[0102]
编译结果确定模块506,若是,则根据所述第一缓存数据,确定所述待编译数据的编译结果;
[0103]
后端缓存查询模块508,否则,向后端查询是否存在相应的已编译的第二缓存数据,若存在,则所述编译结果确定模块506,根据所述第二缓存数据,确定所述待编译数据的编译结果。
[0104]
可选地,所述待编译数据包括原始的待编译文件的源代码以及所述源代码依赖的递归头文件;
[0105]
所述本地缓存查询模块504,对所述源代码和所述递归头文件进行哈希计算,得到第一哈希信息;
[0106]
根据所述第一哈希信息,在本地查询是否存在相应的已编译的第一缓存数据,所述第一缓存数据包括对所述源代码和/或所述递归头文件的编译结果;和/或,
[0107]
所述后端缓存查询模块508,根据所述第一哈希信息,向后端本地查询是否存在所述第二缓存数据,所述第二缓存数据包括对所述源代码和/或所述递归头文件的编译结果。
[0108]
可选地,所述本地缓存查询模块504,若在所述本地和所述后端均未查询到对所述源代码和/或所述递归头文件的编译结果,则对所述源代码进行预处理编译得到预处理文件,对所述预处理文件进行哈希计算,得到第二哈希信息;
[0109]
根据所述第二哈希信息,在所述本地查询是否存在相应的已编译的第一缓存数据,所述第一缓存数据包括对所述预处理文件的编译结果;和/或,
[0110]
所述后端缓存查询模块508,若在所述本地未查询到对所述预处理文件的编译结果,则根据所述第二哈希信息,向所述后端查询是否存在相应的已编译的第二缓存数据,所述第二缓存数据包括对所述预处理文件的编译结果。
[0111]
可选地,所述编译结果确定模块506,将所述第一缓存数据和/或所述第二缓存数据,复用为所述待编译数据的至少部分编译结果。
[0112]
可选地,所述待编译数据为指定软件的第二版本;
[0113]
所述装置还包括:
[0114]
编译结果缓存模块512,对所述指定软件的早于所述第二版本的第一版本进行编译,得到所述第一版本的编译结果;
[0115]
在所述第一版本中确定迭代熟练度大于设定阈值的一个或者多个局部代码块;
[0116]
在所述第一版本的编译结果中,确定对应于所述局部代码块的局部编译结果;
[0117]
将所述局部编译结果作为所述相应的已编译的第二缓存数据,在所述后端进行缓存。
[0118]
可选地,所述编译结果缓存模块512,在各所述局部代码块中确定是否存在多个工作机中由当前的工作机提供的特异性局部代码块;
[0119]
将所述特异性局部代码块的局部编码结果确定为特异性拼插编码结果;
[0120]
将所述特异性拼插编码结果作为所述相应的已编译的第二缓存数据中的至少部分内容,在所述后端进行缓存,以便所述当前的工作机以外的其他工作机,将所述特异性拼插编码结果作为扩展的编码结果拼插使用。
[0121]
可选地,所述后端为与所述本地处于同一个局域网内的局域网后端;
[0122]
所述装置还包括:
[0123]
互联网查询模块510,在所述向后端查询是否存在相应的已编译的第二缓存数据之后,若不存在,则向所述局域网之外的互联网后端查询是否存在相应的已编译的第三缓存数据;
[0124]
若查询得到所述第三缓存数据,则根据所述第三缓存数据,确定所述待编译数据的编译结果。
[0125]
可选地,还包括:
[0126]
编译结果缓存模块512,在所述向后端查询是否存在相应的已编译的第二缓存数据之后,若不存在,则对所述待编译数据进行编译,将编译得到的编译结果在所述本地和/或所述后端进行缓存,用于后续查询。
[0127]
可选地,还包括:
[0128]
编译缓存配置模块514,在所述后端划分出一个或者多个缓存区域;
[0129]
对所述缓存区域的名称、访问接口进行配置;
[0130]
对于编译得到的缓存数据,对所述指定缓存进行使能配置,以指示是否允许将所述缓存数据写入所述后端的所述缓存区域内。
[0131]
可选地,还包括:
[0132]
缓存权限控制模块516,为所述后端的用于存储所述第二缓存数据的缓存区域设置白名单或者黑名单;
[0133]
根据所述白名单或者所述黑名单,对所述存储区域进行查询权限控制。
[0134]
图6为本说明书一个或多个实施例提供的一种编译设备的结构示意图,所述设备包括:
[0135]
至少一个处理器;以及,
[0136]
与所述至少一个处理器通信连接的存储器;其中,
[0137]
所述存储器存储有可被所述至少一个处理器执行的指令,所述指令被所述至少一个处理器执行,以使所述至少一个处理器能够:
[0138]
触发编译过程启动;
[0139]
根据待编译数据,在本地查询是否存在相应的已编译的第一缓存数据;
[0140]
若是,则根据所述第一缓存数据,确定所述待编译数据的编译结果;
[0141]
否则,向后端查询是否存在相应的已编译的第二缓存数据,若存在,则根据所述第二缓存数据,确定所述待编译数据的编译结果。
[0142]
处理器与存储器之间可以通过总线通信,设备还可以包括与其他设备通信的输入/输出接口。
[0143]
基于同样的思路,本说明书一个或多个实施例还提供了对应于图1中方法的一种非易失性计算机存储介质,存储有计算机可执行指令,所述计算机可执行指令设置为:
[0144]
触发编译过程启动;
[0145]
根据待编译数据,在本地查询是否存在相应的已编译的第一缓存数据;
[0146]
若是,则根据所述第一缓存数据,确定所述待编译数据的编译结果;
[0147]
否则,向后端查询是否存在相应的已编译的第二缓存数据,若存在,则根据所述第二缓存数据,确定所述待编译数据的编译结果。
[0148]
在20世纪90年代,对于一个技术的改进可以很明显地区分是硬件上的改进(例如,对二极管、晶体管、开关等电路结构的改进)还是软件上的改进(对于方法流程的改进)。然而,随着技术的发展,当今的很多方法流程的改进已经可以视为硬件电路结构的直接改进。设计人员几乎都通过将改进的方法流程编程到硬件电路中来得到相应的硬件电路结构。因此,不能说一个方法流程的改进就不能用硬件实体模块来实现。例如,可编程逻辑器件(programmable logic device,pld)(例如现场可编程门阵列(field programmable gate array,fpga))就是这样一种集成电路,其逻辑功能由用户对器件编程来确定。由设计人员自行编程来把一个数字系统“集成”在一片pld上,而不需要请芯片制造厂商来设计和制作专用的集成电路芯片。而且,如今,取代手工地制作集成电路芯片,这种编程也多半改用“逻辑编译器(logic compiler)”软件来实现,它与程序开发撰写时所用的软件编译器相类似,而要编译之前的原始代码也得用特定的编程语言来撰写,此称之为硬件描述语言(hardware description language,hdl),而hdl也并非仅有一种,而是有许多种,如abel(advanced boolean expression language)、ahdl(altera hardware description language)、confluence、cupl(cornell university programming language)、hdcal、jhdl(java hardware description language)、lava、lola、myhdl、palasm、rhdl(ruby hardware description language)等,目前最普遍使用的是vhdl(very-high-speed integrated circuit hardware description language)与verilog。本领域技术人员也应该清楚,只需要将方法流程用上述几种硬件描述语言稍作逻辑编程并编程到集成电路中,就可以很容易得到实现该逻辑方法流程的硬件电路。
[0149]
控制器可以按任何适当的方式实现,例如,控制器可以采取例如微处理器或处理器以及存储可由该(微)处理器执行的计算机可读程序代码(例如软件或固件)的计算机可读介质、逻辑门、开关、专用集成电路(application specific integrated circuit,asic)、可编程逻辑控制器和嵌入微控制器的形式,控制器的例子包括但不限于以下微控制器:arc 625d、atmel at91sam、microchip pic18f26k20以及silicone labs c8051f320,存储器控制器还可以被实现为存储器的控制逻辑的一部分。本领域技术人员也知道,除了以纯计算机可读程序代码方式实现控制器以外,完全可以通过将方法步骤进行逻辑编程来使得控制器以逻辑门、开关、专用集成电路、可编程逻辑控制器和嵌入微控制器等的形式来实现相同功能。因此这种控制器可以被认为是一种硬件部件,而对其内包括的用于实现各种功能的装置也可以视为硬件部件内的结构。或者甚至,可以将用于实现各种功能的装置视为既可以是实现方法的软件模块又可以是硬件部件内的结构。
[0150]
上述实施例阐明的系统、装置、模块或单元,具体可以由计算机芯片或实体实现,或者由具有某种功能的产品来实现。一种典型的实现设备为计算机。具体的,计算机例如可
以为个人计算机、膝上型计算机、蜂窝电话、相机电话、智能电话、个人数字助理、媒体播放器、导航设备、电子邮件设备、游戏控制台、平板计算机、可穿戴设备或者这些设备中的任何设备的组合。
[0151]
为了描述的方便,描述以上装置时以功能分为各种单元分别描述。当然,在实施本说明书时可以把各单元的功能在同一个或多个软件和/或硬件中实现。
[0152]
本领域内的技术人员应明白,本说明书实施例可提供为方法、系统、或计算机程序产品。因此,本说明书实施例可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本说明书实施例可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、cd-rom、光学存储器等)上实施的计算机程序产品的形式。
[0153]
本说明书是参照根据本说明书实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
[0154]
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
[0155]
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
[0156]
在一个典型的配置中,计算设备包括一个或多个处理器(cpu)、输入/输出接口、网络接口和内存。
[0157]
内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(ram)和/或非易失性内存等形式,如只读存储器(rom)或闪存(flash ram)。内存是计算机可读介质的示例。
[0158]
计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(pram)、静态随机存取存储器(sram)、动态随机存取存储器(dram)、其他类型的随机存取存储器(ram)、只读存储器(rom)、电可擦除可编程只读存储器(eeprom)、快闪记忆体或其他内存技术、只读光盘只读存储器(cd-rom)、数字多功能光盘(dvd)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
[0159]
还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的
包含,从而使得包括一系列要素的过程、方法、商品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、商品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个
……”
限定的要素,并不排除在包括所述要素的过程、方法、商品或者设备中还存在另外的相同要素。
[0160]
本说明书可以在由计算机执行的计算机可执行指令的一般上下文中描述,例如程序模块。一般地,程序模块包括执行特定任务或实现特定抽象数据类型的例程、程序、对象、组件、数据结构等等。也可以在分布式计算环境中实践本说明书,在这些分布式计算环境中,由通过通信网络而被连接的远程处理设备来执行任务。在分布式计算环境中,程序模块可以位于包括存储设备在内的本地和远程计算机存储介质中。
[0161]
本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于装置、设备、非易失性计算机存储介质实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
[0162]
上述对本说明书特定实施例进行了描述。其它实施例在所附权利要求书的范围内。在一些情况下,在权利要求书中记载的动作或步骤可以按照不同于实施例中的顺序来执行并且仍然可以实现期望的结果。另外,在附图中描绘的过程不一定要求示出的特定顺序或者连续顺序才能实现期望的结果。在某些实施方式中,多任务处理和并行处理也是可以的或者可能是有利的。
[0163]
以上所述仅为本说明书的一个或多个实施例而已,并不用于限制本说明书。对于本领域技术人员来说,本说明书的一个或多个实施例可以有各种更改和变化。凡在本说明书的一个或多个实施例的精神和原理之内所作的任何修改、等同替换、改进等,均应包含在本说明书的权利要求范围之内。
技术特征:1.一种编译方法,包括:触发编译过程启动;根据待编译数据,在本地查询是否存在相应的已编译的第一缓存数据;若是,则根据所述第一缓存数据,确定所述待编译数据的编译结果;否则,向后端查询是否存在相应的已编译的第二缓存数据,若存在,则根据所述第二缓存数据,确定所述待编译数据的编译结果。2.如权利要求1所述的方法,所述待编译数据包括原始的待编译文件的源代码以及所述源代码依赖的递归头文件;所述根据待编译数据,在本地查询是否存在相应的已编译的第一缓存数据,具体包括:对所述源代码和所述递归头文件进行哈希计算,得到第一哈希信息;根据所述第一哈希信息,在本地查询是否存在相应的已编译的第一缓存数据,所述第一缓存数据包括对所述源代码和/或所述递归头文件的编译结果;和/或,所述向后端查询是否存在相应的已编译的第二缓存数据,具体包括:根据所述第一哈希信息,向后端本地查询是否存在所述第二缓存数据,所述第二缓存数据包括对所述源代码和/或所述递归头文件的编译结果。3.如权利要求2所述的方法,所述根据待编译数据,在本地查询是否存在相应的已编译的第一缓存数据,还包括:若在所述本地和所述后端均未查询到对所述源代码和/或所述递归头文件的编译结果,则对所述源代码进行预处理编译得到预处理文件,对所述预处理文件进行哈希计算,得到第二哈希信息;根据所述第二哈希信息,在所述本地查询是否存在相应的已编译的第一缓存数据,所述第一缓存数据包括对所述预处理文件的编译结果;和/或,所述向后端查询是否存在相应的已编译的第二缓存数据,还包括:若在所述本地未查询到对所述预处理文件的编译结果,则根据所述第二哈希信息,向所述后端查询是否存在相应的已编译的第二缓存数据,所述第二缓存数据包括对所述预处理文件的编译结果。4.如权利要求1所述的方法,所述确定所述待编译数据的编译结果,具体包括:将所述第一缓存数据和/或所述第二缓存数据,复用为所述待编译数据的至少部分编译结果。5.如权利要求1所述的方法,所述待编译数据为指定软件的第二版本;所述根据待编译数据,在本地查询是否存在相应的已编译的第一缓存数据之前,所述方法还包括:对所述指定软件的早于所述第二版本的第一版本进行编译,得到所述第一版本的编译结果;在所述第一版本中确定迭代熟练度大于设定阈值的一个或者多个局部代码块;在所述第一版本的编译结果中,确定对应于所述局部代码块的局部编译结果;将所述局部编译结果作为所述相应的已编译的第二缓存数据,在所述后端进行缓存。6.如权利要求5所述的方法,所述在所述第一版本中确定迭代熟练度大于设定阈值的一个或者多个局部代码块,还包括:
在各所述局部代码块中确定是否存在多个工作机中由当前的工作机提供的特异性局部代码块;所述将所述局部编译结果作为所述相应的已编译的第二缓存数据,在所述后端进行缓存,具体包括:将所述特异性局部代码块的局部编码结果确定为特异性拼插编码结果;将所述特异性拼插编码结果作为所述相应的已编译的第二缓存数据中的至少部分内容,在所述后端进行缓存,以便所述当前的工作机以外的其他工作机,将所述特异性拼插编码结果作为扩展的编码结果拼插使用。7.如权利要求1所述的方法,所述后端为与所述本地处于同一个局域网内的局域网后端;所述向后端查询是否存在相应的已编译的第二缓存数据之后,所述方法还包括:若不存在,则向所述局域网之外的互联网后端查询是否存在相应的已编译的第三缓存数据;若查询得到所述第三缓存数据,则根据所述第三缓存数据,确定所述待编译数据的编译结果。8.如权利要求1所述的方法,所述向后端查询是否存在相应的已编译的第二缓存数据之后,所述方法还包括:若不存在,则对所述待编译数据进行编译,将编译得到的编译结果在所述本地和/或所述后端进行缓存,用于后续查询。9.如权利要求1所述的方法,还包括:在所述后端划分出一个或者多个缓存区域;对所述缓存区域的名称、访问接口进行配置;对于编译得到的缓存数据,对所述指定缓存进行使能配置,以指示是否允许将所述缓存数据写入所述后端的所述缓存区域内。10.如权利要求1所述的方法,还包括:为所述后端的用于存储所述第二缓存数据的缓存区域设置白名单或者黑名单;根据所述白名单或者所述黑名单,对所述存储区域进行查询权限控制。11.一种编译装置,包括:编译过程触发模块,触发编译过程启动;本地缓存查询模块,根据待编译数据,在本地查询是否存在相应的已编译的第一缓存数据;编译结果确定模块,若是,则根据所述第一缓存数据,确定所述待编译数据的编译结果;后端缓存查询模块,否则,向后端查询是否存在相应的已编译的第二缓存数据,若存在,则所述编译结果确定模块,根据所述第二缓存数据,确定所述待编译数据的编译结果。12.如权利要求11所述的装置,所述待编译数据包括原始的待编译文件的源代码以及所述源代码依赖的递归头文件;所述本地缓存查询模块,对所述源代码和所述递归头文件进行哈希计算,得到第一哈希信息;
根据所述第一哈希信息,在本地查询是否存在相应的已编译的第一缓存数据,所述第一缓存数据包括对所述源代码和/或所述递归头文件的编译结果;和/或,所述后端缓存查询模块,根据所述第一哈希信息,向后端本地查询是否存在所述第二缓存数据,所述第二缓存数据包括对所述源代码和/或所述递归头文件的编译结果。13.如权利要求12所述的装置,所述本地缓存查询模块,若在所述本地和所述后端均未查询到对所述源代码和/或所述递归头文件的编译结果,则对所述源代码进行预处理编译得到预处理文件,对所述预处理文件进行哈希计算,得到第二哈希信息;根据所述第二哈希信息,在所述本地查询是否存在相应的已编译的第一缓存数据,所述第一缓存数据包括对所述预处理文件的编译结果;和/或,所述后端缓存查询模块,若在所述本地未查询到对所述预处理文件的编译结果,则根据所述第二哈希信息,向所述后端查询是否存在相应的已编译的第二缓存数据,所述第二缓存数据包括对所述预处理文件的编译结果。14.如权利要求11所述的装置,所述编译结果确定模块,将所述第一缓存数据和/或所述第二缓存数据,复用为所述待编译数据的至少部分编译结果。15.如权利要求11所述的装置,所述待编译数据为指定软件的第二版本;所述装置还包括:编译结果缓存模块,对所述指定软件的早于所述第二版本的第一版本进行编译,得到所述第一版本的编译结果;在所述第一版本中确定迭代熟练度大于设定阈值的一个或者多个局部代码块;在所述第一版本的编译结果中,确定对应于所述局部代码块的局部编译结果;将所述局部编译结果作为所述相应的已编译的第二缓存数据,在所述后端进行缓存。16.如权利要求15所述的装置,所述编译结果缓存模块,在各所述局部代码块中确定是否存在多个工作机中由当前的工作机提供的特异性局部代码块;将所述特异性局部代码块的局部编码结果确定为特异性拼插编码结果;将所述特异性拼插编码结果作为所述相应的已编译的第二缓存数据中的至少部分内容,在所述后端进行缓存,以便所述当前的工作机以外的其他工作机,将所述特异性拼插编码结果作为扩展的编码结果拼插使用。17.如权利要求11所述的装置,所述后端为与所述本地处于同一个局域网内的局域网后端;所述装置还包括:互联网查询模块,在所述向后端查询是否存在相应的已编译的第二缓存数据之后,若不存在,则向所述局域网之外的互联网后端查询是否存在相应的已编译的第三缓存数据;若查询得到所述第三缓存数据,则根据所述第三缓存数据,确定所述待编译数据的编译结果。18.如权利要求11所述的装置,还包括:编译结果缓存模块,在所述向后端查询是否存在相应的已编译的第二缓存数据之后,若不存在,则对所述待编译数据进行编译,将编译得到的编译结果在所述本地和/或所述后端进行缓存,用于后续查询。19.如权利要求11所述的装置,还包括:
编译缓存配置模块,在所述后端划分出一个或者多个缓存区域;对所述缓存区域的名称、访问接口进行配置;对于编译得到的缓存数据,对所述指定缓存进行使能配置,以指示是否允许将所述缓存数据写入所述后端的所述缓存区域内。20.如权利要求11所述的装置,还包括:缓存权限控制模块,为所述后端的用于存储所述第二缓存数据的缓存区域设置白名单或者黑名单;根据所述白名单或者所述黑名单,对所述存储区域进行查询权限控制。21.一种编译设备,包括:至少一个处理器;以及,与所述至少一个处理器通信连接的存储器;其中,所述存储器存储有可被所述至少一个处理器执行的指令,所述指令被所述至少一个处理器执行,以使所述至少一个处理器能够:触发编译过程启动;根据待编译数据,在本地查询是否存在相应的已编译的第一缓存数据;若是,则根据所述第一缓存数据,确定所述待编译数据的编译结果;否则,向后端查询是否存在相应的已编译的第二缓存数据,若存在,则根据所述第二缓存数据,确定所述待编译数据的编译结果。
技术总结本说明书实施例公开了一种编译方法、装置以及设备。方案包括:触发编译过程启动;根据待编译数据,在本地查询是否存在相应的已编译的第一缓存数据;根据待编译数据,在本地查询是否存在相应的已编译的第一缓存数据;若是,则根据所述第一缓存数据,确定所述待编译数据的编译结果;否则,向后端查询是否存在相应的已编译的第二缓存数据,若存在,则根据所述第二缓存数据,确定所述待编译数据的编译结果。确定所述待编译数据的编译结果。确定所述待编译数据的编译结果。
技术研发人员:温兴森 侯宇轩 傅榕锋
受保护的技术使用者:北京奥星贝斯科技有限公司
技术研发日:2022.08.05
技术公布日:2022/12/1