CN111459499A - 程序编译方法及装置、计算机存储介质、电子设备 - Google Patents
程序编译方法及装置、计算机存储介质、电子设备 Download PDFInfo
- Publication number
- CN111459499A CN111459499A CN202010313591.3A CN202010313591A CN111459499A CN 111459499 A CN111459499 A CN 111459499A CN 202010313591 A CN202010313591 A CN 202010313591A CN 111459499 A CN111459499 A CN 111459499A
- Authority
- CN
- China
- Prior art keywords
- module
- dependency
- dependent
- compiling
- compiled
- 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
- G06F8/43—Checking; Contextual analysis
- G06F8/433—Dependency analysis; Data or control flow analysis
-
- 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
Abstract
本公开涉及计算机技术领域,提供了一种程序编译方法、程序编译装置、计算机存储介质、电子设备,其中,程序编译方法包括:获取各代码模块之间的调用依赖关系,根据所述调用依赖关系确定待编译模块对应的第一依赖模块;对所述第一依赖模块中包含的依赖接口代码进行打包,得到第二依赖模块;根据所述第二依赖模块对所述待编译模块进行编译。本公开中的程序编译方法打破了传统方案需要下层功能接口的限制,使得单一功能模块遵循实现封闭,接口开放的软件设计原则,限制功能模块越界处理其他功能,同时避免产生共享模块,极大简化了维护成本。
Description
技术领域
本公开涉及计算机技术领域,特别涉及一种程序编译方法、程序编译装置、计算机存储介质及电子设备。
背景技术
在Android(安卓系统,是一种基于Linux的自由及开放源代码的操作系统)日常开发过程中,常以模块作为工程单元进行某种聚合功能的开发。在模块化模式的开发过程中,由于模块是封装独立功能的,所以模块间依赖是非常常见的。当某些模块的业务复杂度相对较高时,可能需要互相依赖进而实现调用对方模块的功能接口,进而,可能会导致编译失败并终止编译。比如聊天模块除了封装聊天的业务功能外,还提供了跳转到单聊,群聊的功能接口;信息流模块除了封装信息流的业务外,还提供跳转到某个信息流卡片的详情介绍页的功能接口,在主端模块同时依赖聊天模块和信息流模块的场景下,就会提示“Circulardependency”告知编译失败并中止编译。
目前,在多个模块互相依赖的复杂场景下(比如B模块和C模块互相依赖时),一般是把B模块中暴露的功能接口和C模块中暴露的功能接口聚合在一起后放到一个共享模块用于共享,同时让B模块和C模块依赖该共享模块。然而,工程上的模块概念被模糊,模块功能的实现容易出现越界现象,且随着业务模块增多,膨胀的共享模块带来了极大的维护成本,同时违背了功能模块设计的初衷。
鉴于此,本领域亟需开发一种新的程序编译方法及装置。
需要说明的是,上述背景技术部分公开的信息仅用于加强对本公开的背景的理解。
发明内容
本公开的目的在于提供一种程序编译方法、程序编译装置、计算机存储介质及电子设备,进而至少在一定程度上避免了功能越界现象及模块维护成本较高的缺陷。
本公开的其他特性和优点将通过下面的详细描述变得显然,或部分地通过本公开的实践而习得。
根据本公开的第一方面,提供一种程序编译方法,包括:获取各代码模块之间的调用依赖关系,根据所述调用依赖关系确定待编译模块对应的第一依赖模块;对所述第一依赖模块中包含的依赖接口代码进行打包,得到第二依赖模块;根据所述第二依赖模块对所述待编译模块进行编译。
在本公开的示例性实施例中,在根据所述依赖关系确定待编译模块对应的第一依赖模块之后,所述方法还包括:对所述第一依赖模块中的剩余代码进行移除处理;所述剩余代码为除所述依赖接口代码之外的代码。
在本公开的示例性实施例中,所述方法还包括:当所述待编译模块不存在第一依赖模块时,对所述待编译模块进行打包,得到第一打包文件。
在本公开的示例性实施例中,所述对所述第一依赖模块中包含的依赖接口代码进行打包,得到第二依赖模块,包括:基于Java编译器和/或kotlin编译器对所述第一依赖模块中包含的依赖接口代码进行编译,得到编译文件;对所述编译文件进行打包,得到所述第二依赖模块。
在本公开的示例性实施例中,在根据所述第二依赖模块对所述待编译模块进行编译之后,所述方法还包括:当检测到当前运行任务为打包任务时,对所述第一依赖模块中的剩余代码进行打包,得到第二打包文件;采用自动化构建工具对所述第二依赖模块、所述第一打包文件与所述第二打包文件进行打包,得到应用程序包。
在本公开的示例性实施例中,所述第二依赖模块、第一打包文件、第二打包文件的文件格式为Jar格式。
在本公开的示例性实施例中,所述获取各代码模块之间的调用依赖关系,包括:预先对所述代码模块之间的调用依赖关系进行分析处理,形成依赖关系树;其中,依赖关系树中的每个节点对应一个模块;依赖关系树的节点包括父节点和子节点,子节点为父节点的依赖项;基于编译插件对所述依赖关系树进行解析处理,得到所述各代码模块之间的调用依赖关系;其中,所述调用依赖关系包括直接依赖关系以及间接依赖关系。
根据本公开的第二方面,提供一种程序编译装置,包括:获取模块,用于获取各代码模块之间的调用依赖关系,根据所述调用依赖关系确定待编译模块对应的第一依赖模块;打包模块,用于对所述第一依赖模块中包含的依赖接口代码进行打包,得到第二依赖模块;处理模块,用于根据所述第二依赖模块对所述待编译模块进行编译。
根据本公开的第三方面,提供一种计算机存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现上述第一方面所述的程序编译方法。
根据本公开的第四方面,提供一种电子设备,包括:处理器;以及存储器,用于存储所述处理器的可执行指令;其中,所述处理器配置为经由执行所述可执行指令来执行上述第一方面所述的程序编译方法。
由上述技术方案可知,本公开示例性实施例中的程序编译方法、程序编译装置、计算机存储介质及电子设备至少具备以下优点和积极效果:
在本公开的一些实施例所提供的技术方案中,一方面,获取各代码模块之间的调用依赖关系,根据调用依赖关系确定待编译模块对应的第一依赖模块,对第一依赖模块中包含的依赖接口代码进行打包,得到第二依赖模块,能够预先对需要被其他模块调用的各个依赖模块的依赖接口代码进行独立编译,打破了传统方案需要下层功能接口的限制,避免产生共享模块,解决了相关技术中因多个依赖模块的依赖接口代码聚合在一起导致功能模块越界处理其他功能的技术问题。另一方面,根据第二依赖模块对待编译模块进行编译,提供了一种全新的解决模块化互相依赖出现编译失败的技术方案,使得单一功能模块遵循实现封闭,接口开放的软件设计原则,限制功能模块越界处理其他功能,极大简化了维护成本。
本公开应当理解的是,以上的一般描述和后文的细节描述仅是示例性和解释性的,并不能限制本公开。
附图说明
此处的附图被并入说明书中并构成本说明书的一部分,示出了符合本公开的实施例,并与说明书一起用于解释本公开的原理。显而易见地,下面描述中的附图仅仅是本公开的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1A示出相关技术中一模块依赖关系的示意图;
图1B示出相关技术另一模块依赖关系的示意图;
图2示出本公开一示例性实施例中程序编译方法的流程示意图;
图3示出本公开一示例性实施例中程序编译方法的子流程示意图;
图4示出本公开示例性实施例中编译装置的结构示意图;
图5示出本公开示例性实施例中计算机存储介质的结构示意图;
图6示出本公开示例性实施例中电子设备的结构示意图。
具体实施方式
现在将参考附图更全面地描述示例实施方式。然而,示例实施方式能够以多种形式实施,且不应被理解为限于在此阐述的范例;相反,提供这些实施方式使得本公开将更加全面和完整,并将示例实施方式的构思全面地传达给本领域的技术人员。所描述的特征、结构或特性可以以任何合适的方式结合在一个或更多实施方式中。在下面的描述中,提供许多具体细节从而给出对本公开的实施方式的充分理解。然而,本领域技术人员将意识到,可以实践本公开的技术方案而省略所述特定细节中的一个或更多,或者可以采用其它的方法、组元、装置、步骤等。在其它情况下,不详细示出或描述公知技术方案以避免喧宾夺主而使得本公开的各方面变得模糊。
本说明书中使用用语“一个”、“一”、“该”和“所述”用以表示存在一个或多个要素/组成部分/等;用语“包括”和“具有”用以表示开放式的包括在内的意思并且是指除了列出的要素/组成部分/等之外还可存在另外的要素/组成部分/等;用语“第一”和“第二”等仅作为标记使用,不是对其对象的数量限制。
此外,附图仅为本公开的示意性图解,并非一定是按比例绘制。图中相同的附图标记表示相同或类似的部分,因而将省略对它们的重复描述。附图中所示的一些方框图是功能实体,不一定必须与物理或逻辑上独立的实体相对应。
目前,在处理模块互相依赖的复杂场景下(示例性的,可以参考图1A,图1A示出相关技术中一模块依赖关系的示意图,具体示出主端模块同时依赖聊天模块和信息流模块,并且聊天模块和信息流模块互相依赖的依赖关系示意图,相关的处理方案(可以参考图1B,图1B示出相关技术中另一模块依赖关系的示意图,具体示出对上述复杂场景的依赖关系进行调整之后得到的依赖关系示意图)一般是将聊天模块中暴露的功能接口和信息流模块中暴露的功能接口聚合在一起放入共享模块用于共享,同时让聊天模块和信息流模块依赖该共享模块。然而,虽然提供了解决循环依赖编译失败的问题,却导致了一系列新问题的产生:
第一,如果把开放的接口下层,则实现层在编译时不仅仅能依赖到原本属于自己的功能接口,同时还会依赖到不属于自己的功能接口,在注入实现的时候需要屏蔽这部分不属于自己的功能接口;
第二,在开发聊天模块时能依赖到不属于自己的功能接口,容易造成功能实现的越界现象,比如信息流模块不应该实现其他模块的功能接口却覆盖了其他模块的实现;
第三,共享模块会随着需要下沉功能接口的模块增加而不断膨胀,最终该模块成为聚合大量业务接口的共享模块,如果某个功能接口需要修改必定导致漫长的编译过程,且不断加大前两个问题的隐藏风险。
在本公开的实施例中,首先提供了一种程序编译方法,至少在一定程度上克服相关技术中提供的编译方法功能越界现象及模块维护成本较高的缺陷。
图2示出本公开一示例性实施例中程序编译方法的流程示意图,该程序编译方法的执行主体可以是对程序进行编译的服务器。
参考图2,根据本公开的一个实施例的程序编译方法包括以下步骤:
步骤S210,获取各代码模块之间的调用依赖关系,根据调用依赖关系确定待编译模块对应的第一依赖模块;
步骤S220,对第一依赖模块中包含的依赖接口代码进行打包,得到第二依赖模块;
步骤S230,根据第二依赖模块对待编译模块进行编译。
在图2所示实施例所提供的技术方案中,一方面,获取各代码模块之间的调用依赖关系,根据调用依赖关系确定待编译模块对应的第一依赖模块,对第一依赖模块中包含的依赖接口代码进行打包,得到第二依赖模块,能够预先对需要被其他模块调用的各个依赖模块的依赖接口代码进行独立编译,打破了传统方案需要下层功能接口的限制,避免产生共享模块,解决了相关技术中因多个依赖模块的依赖接口代码聚合在一起导致功能模块越界处理其他功能的技术问题。另一方面,根据第二依赖模块对待编译模块进行编译,提供了一种全新的解决模块化互相依赖出现编译失败的技术方案,使得单一功能模块遵循实现封闭,接口开放的软件设计原则,限制功能模块越界处理其他功能,极大简化了维护成本。
以下对图2中的各个步骤的具体实现过程进行详细阐述:
在本公开的示例性实施例中,软件程序产品可以被看作是由一系列具有特定功能的组件组成,作为一个完整的系统也可以被分解成一系列功能模块,这些模块之间的相互作用就形成了系统的所有功能。
在软件的模块化开发过程中,所谓模块是指可组成系统的、具有某种确定独立功能的半自律性的子系统,它能够由设计者独立设计出来,同时又可以作为一个整体在系统中运转,高度模块化的源代码结构给软件开发者和使用者均带来了极大的好处。
一方面,把一个系统分解成各个不同的子模块,不同的开发者专注于对其中某一模块的开发,既实现了劳动的分工,也提高了自由软件开发的效率。基于模块化的性质,每个模块在开发出来以后都可以通过一个被称作是内核的原系统进行信息交流,发挥整个模块的功能,同时也并不会影响其他模块功能的发挥。而且在各个不同的模块整合在一起后,由于外部性的存在,会使整个系统增加的功能要超过该模块本身的功能。在此过程中实现了价值的分割与整合。另一方面,对于开发者而言,基于模块化的自由软件开发具有更大的吸引力,其在参与开发过程中可以得到更高的期望收益。因此,在基于模块化的开发过程中,所有的开发者都更倾向于参与开发不同的模块,从而实现整个系统的开发。
在步骤S210中,获取各代码模块之间的调用依赖关系,根据调用依赖关系确定待编译模块对应的第一依赖模块。
在本公开的示例性实施例中,可以获取各代码模块之间的调用依赖关系,以根据调用依赖关系确定出待编译模块对应的第一依赖模块。
具体的,可以参考图3,图3示出本公开一示例性实施例中程序编译方法的子流程示意图,具体示出获取代码模块之间的调用依赖关系的子流程示意图,包含步骤S301-步骤S302,以下结合图3对具体的实施方式进行解释。
在步骤S301中,预先对代码模块之间的调用依赖关系进行分析处理,形成依赖关系树。
在本公开的示例性实施例中,可以预先对代码模块之间的调用依赖关系(包括直接依赖关系以及间接依赖关系)进行分析处理,形成依赖关系树,其中,依赖关系树中的每个节点对应一个模块;依赖关系树的节点包括父节点和子节点,子节点为父节点的依赖项。
示例性的,当A模块在编译时需要调用B模块,而B模块在编译时需要调用C模块时,则A模块与B模块之间为直接依赖关系(B模块为A模块的依赖项),B模块与C模块之间为直接调用关系(C模块为B模块的依赖项),而A模块与C模块之间为间接调用关系。进而,在构建依赖关系树时,可以将A模块作为父节点,B模块为A模块的子节点,C模块为B模块的子节点。
在步骤S302中,基于编译插件对依赖关系树进行解析处理,得到各代码模块之间的调用依赖关系。
在本公开的示例性实施例中,在得到依赖关系树之后,可以基于编译插件对依赖关系树进行解析处理,得到各代码模块之间的调用依赖关系(包含上述直接调用关系和间接调用关系),以根据调用依赖关系确定出各个待编译模块对应的第一依赖模块。其中,编译插件可以是预先编写好的用于对各个代码模块进行相关处理及编译的插件,具体的,可以通过插件配置信息对编译插件的具体功能进行配置,以使得编译插件自动化执行相关代码处理步骤。其中,编译插件用于对程序代码进行相关处理及编译,插件配置信息用于对编译插件的功能进行配置。
代码模块可以是开发人员编写好的以模块为单位进行独立封装的代码单元。示例性的,可以先通过编译插件读取SourceSet资源表以获取到代码模块的存储路径,进而,通过存储路径检索得到上述代码模块。
待编译模块即执行编译任务时,需要进行编译的各个代码模块。依赖模块即与待编译模块存在调用依赖关系的模块。
举例而言,以聊天模块为待编译模块进行说明,当用户在聊天中接收到对方分享的信息流卡片,点击信息流卡片之后需要跳转到详情介绍页时,则需要在聊天模块内调用信息流模块的功能接口,即确定出聊天模块和信息流模块存在调用依赖关系,信息流模块为聊天模块的依赖模块。同理,以信息流模块为待编译模块进行说明,当用户在某个信息流列表的详情页介绍页中点击“私聊他”的功能按钮时,则需要在信息流模块内调用聊天模块的功能接口,即确定出信息流模块和聊天模块存在调用依赖关系,聊天模块为信息流模块的第一依赖模块。
在确定出第一依赖模块之后,可以对上述第一依赖模块中的依赖接口代码和剩余代码(非依赖接口代码)进行分离,进而,基于上述编译插件在编译前修改SourceSet目录(SourceSet是一个逻辑变量,也可以理解成一份规则清单),以将第一依赖模块拆分为包含依赖接口代码的第一子模块和包含剩余代码(非依赖接口代码)的第二子模块。
继续参考图2,在步骤S220中,对第一依赖模块中包含的依赖接口代码进行打包,得到第二依赖模块。
在本公开的示例性实施例中,在获取到上述第一依赖模块中的依赖接口代码之后,可以对依赖接口代码进行打包,得到第二依赖模块。具体的,可以基于Java编译器和/或kotlin编译器对第一依赖模块中的依赖接口代码进行编译,得到编译文件,并对编译文件进行打包,得到第二依赖模块。从而,能够预先对需要被其他模块调用的各个第一依赖模块的依赖接口代码进行独立编译,打破了传统方案需要下层功能接口的限制,避免产生共享模块,解决了相关技术中因多个第一依赖模块的依赖接口代码聚合在一起导致功能模块越界处理其他功能的技术问题。
需要说明的是,上述第二依赖模块的文件格式为Jar文件格式,Jar文件(Java归档,英语:Java Archive)是一种软件包文件格式,通常用于聚合大量的Java类文件、相关的元数据和资源(文本、图片等)文件到一个文件,以便开发Java平台应用软件或库。
通过将编译文件打包为Jar文件,能够实现传统的ZIP格式(ZIP文件格式是一种数据压缩和文档储存的文件格式)或RAR格式(是一种文件格式,用于数据压缩与归档打包)无法达到的优势和功能,例如:①安全性:可以对Jar文件加上数字化签名,这样,能够识别签名的工具就可以有选择地为用户授予软件安全特权,这是其他文件做不到的,它还可以检测代码是否被篡改过。②减少下载时间:如果一个applet捆绑到一个Jar文件中,那么浏览器就可以在一个HTTP(HyperText Transfer Protocol,简称:HTTP,超文本传输协议)事务中下载这个applet的类文件和相关的资源,而不是对每一个文件打开一个新连接。③压缩:Jar格式允许压缩文件以提高存储效率。④传输平台扩展:Java扩展框架(Java ExtensionsFramework)提供了向Java核心平台添加功能的方法,这些扩展是用Jar打包的。
在本公开的示例性实施例中,在对所有第一依赖模块的依赖接口代码进行打包得到第二依赖模块(Jar文件)之后,可以将得到的多个第二依赖模块统一存放至目标目录中。
进而,在Android系统中,可以通过Gradle脚本(是一个基于Apache Ant和ApacheMaven概念的项目自动化构建开源工具)指定所有待编译模块的依赖路径为上述目标目录的存放路径。从而,便于后续编译过程中,能够根据目标目录快速获取到第二依赖模块,提高数据获取效率。
需要说明的是,可以通过插件配置信息对编译插件的具体功能进行配置,以使得编译插件执行上述步骤S210-步骤S220中的所有实施步骤。
具体的,可以通过开发人员编写的插件配置信息对编译插件进行配置,以使得编译插件对根项目及所有的代码模块进行评估(评估顺序为先对根项目进行评估,在根项目评估完成后对所有的代码模块进行评估,其中,根项目是所有模块的容器),以确定程序代码是否可编译,以及,各代码模块之间的调用依赖关系是否能够正确编译。每一次评估都会读取对应目录下的Gradle脚本,读取脚本的时序和评估的时序相同,以确定出因存在依赖关系而不能被正确编译的依赖模块。
在根项目评估阶段,编译插件可以实现对SourceSet资源表的目录初始化,以及,对Android编译版本/Java编译版本的初始化。在根项目评估完成后,编译插件可以分离第一依赖模块的依赖接口代码,并将依赖接口代码编译打包为第二依赖模块存放至目标目录。在对代码模块的评估阶段,编译插件可以将第二依赖模块确定为待编译模块对应的依赖(即将待编译模块与第一依赖模块之间的依赖关系动态切换为待编译模块与第二依赖模块之间的依赖关系)。在模块评估完成后,编译插件可以对依赖接口代码编译打包得到的Jar文件进行命名并存放至上述目标目录中。
在步骤S230中,根据第二依赖模块对待编译模块进行编译。
在本公开的示例性实施例中,在对第一依赖模块的依赖接口代码进行打包后,可以将得到的第二依赖模块确定为待编译模块对应的依赖模块。进而,在对工程代码进行整体编译时,可以直接根据第二依赖模块对待编译模块进行编译。从而,能够使得单一功能模块遵循实现封闭,接口开放的软件设计原则,限制功能模块越界处理其他功能,极大简化了维护成本。
在本公开的示例性实施例中,具体的,参照上述步骤S220的相关解释,在对工程项目进行整体编译时,可以直接从上述目标目录中获取到待编译模块对应的第二依赖模块,进而,无需对第一依赖模块进行编译,直接将第二依赖模块(Jar文件)确定为待编译模块的第一依赖模块,以根据第二依赖模块(Jar文件)对待编译模块进行编译。
在本公开的示例性实施例中,当待编译模块不存在第一依赖模块时,则可以在对工程项目进行整体编译时,直接对待编译模块进行编译,得到第一打包文件。
在本公开的示例性实施例中,可以通过上述编译插件监听所有模块的评估完成时刻,进而,在项目评估完成时判断当前运行任务是否是打包任务,当检测到当前运行任务为打包任务时,可以对第一依赖模块中分离出来的剩余代码(非依赖接口代码)进行打包,得到第二打包文件,进而,可以基于安卓项目的自动化构建工具(例如:Gradle)对依赖接口代码进行编译得到的第二依赖模块、对不存在第一依赖模块的待编译模块进行编译得到的第一打包文件以及剩余代码(非依赖接口代码)进行编译得到的第二打包文件共同打包为应用程序包(APK,全称:Android application package,Android应用程序包,是Android操作系统使用的一种应用程序包文件格式,用于分发和安装移动应用及中间件),以确保程序包能够被安卓系统识别以及在安卓系统上正常运行。
在本公开的示例性实施例中,通过预先对第一依赖模块中的依赖接口代码进行打包得到JAR文件,提供了一种全新的解决模块化互相依赖出现编译失败的技术方案,打破了传统方案需要下层功能接口的限制。使得单一功能模块遵循实现封闭,接口开放的软件设计原则,限制功能模块越界处理其他功能,同时避免产生共享模块,极大简化了维护成本。
本公开还提供了一种程序编译装置,图4示出本公开示例性实施例中程序编译装置的结构示意图;如图4所示,程序编译装置400可以包括获取模块401、打包模块402和处理模块403。其中:
获取模块401,用于获取各代码模块之间的调用依赖关系,根据调用依赖关系确定待编译模块对应的第一依赖模块。
在本公开的示例性实施例中,获取模块用于获取各代码模块之间的调用依赖关系,根据调用依赖关系确定待编译模块对应的第一依赖模块。
打包模块402,用于对第一依赖模块中包含的依赖接口代码进行打包,得到第二依赖模块。
在本公开的示例性实施例中,打包模块用于基于Java编译器和/或kotlin编译器对第一依赖模块中包含的依赖接口代码进行编译,得到编译文件;对编译文件进行打包,得到第二依赖模块。
在本公开的示例性实施例中,打包模块用于对第一依赖模块中的剩余代码进行移除处理;剩余代码为除依赖接口代码之外的代码。
在本公开的示例性实施例中,打包模块用于基于Java编译器和/或kotlin编译器对第一依赖模块中包含的依赖接口代码进行编译,得到编译文件;对编译文件进行打包,得到第二依赖模块。
在本公开的示例性实施例中,第二依赖模块、第一打包文件、第二打包文件的文件格式为Jar格式。
处理模块403,用于根据第二依赖模块对待编译模块进行编译。
在本公开的示例性实施例中,当待编译模块不存在第一依赖模块时,对待编译模块进行打包,得到第一打包文件。
在本公开的示例性实施例中,处理模块用于当检测到当前运行任务为打包任务时,对第一依赖模块中的剩余代码进行打包,得到第二打包文件;采用自动化构建工具对第二依赖模块、第一打包文件与第二打包文件进行打包,得到应用程序包。
在本公开的示例性实施例中,处理模块用于预先对代码模块之间的调用依赖关系进行分析处理,形成依赖关系树;其中,依赖关系树中的每个节点对应一个模块;依赖关系树的节点包括父节点和子节点,子节点为父节点的依赖项;基于编译插件对依赖关系树进行解析处理,得到各代码模块之间的调用依赖关系;其中,调用依赖关系包括直接依赖关系以及间接依赖关系。
上述程序编译装置中各模块的具体细节已经在对应的程序编译方法中进行了详细的描述,因此此处不再赘述。
应当注意,尽管在上文详细描述中提及了用于动作执行的设备的若干模块或者单元,但是这种划分并非强制性的。实际上,根据本公开的实施方式,上文描述的两个或更多模块或者单元的特征和功能可以在一个模块或者单元中具体化。反之,上文描述的一个模块或者单元的特征和功能可以进一步划分为由多个模块或者单元来具体化。
此外,尽管在附图中以特定顺序描述了本公开中方法的各个步骤,但是,这并非要求或者暗示必须按照该特定顺序来执行这些步骤,或是必须执行全部所示的步骤才能实现期望的结果。附加的或备选的,可以省略某些步骤,将多个步骤合并为一个步骤执行,以及/或者将一个步骤分解为多个步骤执行等。
通过以上的实施方式的描述,本领域的技术人员易于理解,这里描述的示例实施方式可以通过软件实现,也可以通过软件结合必要的硬件的方式来实现。因此,根据本公开实施方式的技术方案可以以软件产品的形式体现出来,该软件产品可以存储在一个非易失性存储介质(可以是CD-ROM,U盘,移动硬盘等)中或网络上,包括若干指令以使得一台计算设备(可以是个人计算机、服务器、移动终端、或者网络设备等)执行根据本公开实施方式的方法。
在本公开示例性实施方式中,还提供了一种能够实现上述方法的计算机存储介质。其上存储有能够实现本说明书上述方法的程序产品。在一些可能的实施例中,本公开的各个方面还可以实现为一种程序产品的形式,其包括程序代码,当所述程序产品在终端设备上运行时,所述程序代码用于使所述终端设备执行本说明书上述“示例性方法”部分中描述的根据本公开各种示例性实施方式的步骤。
参考图5所示,描述了根据本公开的实施方式的用于实现上述方法的程序产品500,其可以采用便携式紧凑盘只读存储器(CD-ROM)并包括程序代码,并可以在终端设备,例如个人电脑上运行。然而,本公开的程序产品不限于此,在本文件中,可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。
所述程序产品可以采用一个或多个可读介质的任意组合。可读介质可以是可读信号介质或者可读存储介质。可读存储介质例如可以为但不限于电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。可读存储介质的更具体的例子(非穷举的列表)包括:具有一个或多个导线的电连接、便携式盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、光纤、便携式紧凑盘只读存储器(CD-ROM)、光存储器件、磁存储器件、或者上述的任意合适的组合。
计算机可读信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了可读程序代码。这种传播的数据信号可以采用多种形式,包括但不限于电磁信号、光信号或上述的任意合适的组合。可读信号介质还可以是可读存储介质以外的任何可读介质,该可读介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。
可读介质上包含的程序代码可以用任何适当的介质传输,包括但不限于无线、有线、光缆、RF等等,或者上述的任意合适的组合。
可以以一种或多种程序设计语言的任意组合来编写用于执行本公开操作的程序代码,所述程序设计语言包括面向对象的程序设计语言—诸如Java、C++等,还包括常规的过程式程序设计语言—诸如“C”语言或类似的程序设计语言。程序代码可以完全地在用户计算设备上执行、部分地在用户设备上执行、作为一个独立的软件包执行、部分在用户计算设备上部分在远程计算设备上执行、或者完全在远程计算设备或服务器上执行。在涉及远程计算设备的情形中,远程计算设备可以通过任意种类的网络,包括局域网(LAN)或广域网(WAN),连接到用户计算设备,或者,可以连接到外部计算设备(例如利用因特网服务提供商来通过因特网连接)。
此外,在本公开的示例性实施例中,还提供了一种能够实现上述方法的电子设备。
所属技术领域的技术人员能够理解,本公开的各个方面可以实现为系统、方法或程序产品。因此,本公开的各个方面可以具体实现为以下形式,即:完全的硬件实施方式、完全的软件实施方式(包括固件、微代码等),或硬件和软件方面结合的实施方式,这里可以统称为“电路”、“模块”或“系统”。
下面参照图6来描述根据本公开的这种实施方式的电子设备600。图6显示的电子设备600仅仅是一个示例,不应对本公开实施例的功能和使用范围带来任何限制。
如图6所示,电子设备600以通用计算设备的形式表现。电子设备600的组件可以包括但不限于:上述至少一个处理单元610、上述至少一个存储单元620、连接不同系统组件(包括存储单元620和处理单元610)的总线630以及显示单元640。
其中,所述存储单元存储有程序代码,所述程序代码可以被所述处理单元610执行,使得所述处理单元610执行本说明书上述“示例性方法”部分中描述的根据本公开各种示例性实施方式的步骤。例如,所述处理单元610可以执行如图2中所示的:步骤S210,获取各代码模块之间的调用依赖关系,根据所述调用依赖关系确定待编译模块对应的第一依赖模块;步骤S220,对所述第一依赖模块中包含的依赖接口代码进行打包,得到第二依赖模块;步骤S230,根据所述第二依赖模块对所述待编译模块进行编译。
存储单元620可以包括易失性存储单元形式的可读介质,例如随机存取存储单元(RAM)6201和/或高速缓存存储单元6202,还可以进一步包括只读存储单元(ROM)6203。
存储单元620还可以包括具有一组(至少一个)程序模块6205的程序/实用工具6204,这样的程序模块6205包括但不限于:操作系统、一个或者多个应用程序、其它程序模块以及程序数据,这些示例中的每一个或某种组合中可能包括网络环境的实现。
总线630可以为表示几类总线结构中的一种或多种,包括存储单元总线或者存储单元控制器、外围总线、图形加速端口、处理单元或者使用多种总线结构中的任意总线结构的局域总线。
电子设备600也可以与一个或多个外部设备700(例如键盘、指向设备、蓝牙设备等)通信,还可与一个或者多个使得用户能与该电子设备600交互的设备通信,和/或与使得该电子设备600能与一个或多个其它计算设备进行通信的任何设备(例如路由器、调制解调器等等)通信。这种通信可以通过输入/输出(I/O)接口650进行。并且,电子设备600还可以通过网络适配器660与一个或者多个网络(例如局域网(LAN),广域网(WAN)和/或公共网络,例如因特网)通信。如图所示,网络适配器660通过总线630与电子设备600的其它模块通信。应当明白,尽管图中未示出,可以结合电子设备600使用其它硬件和/或软件模块,包括但不限于:微代码、设备驱动器、冗余处理单元、外部磁盘驱动阵列、RAID系统、磁带驱动器以及数据备份存储系统等。
通过以上的实施方式的描述,本领域的技术人员易于理解,这里描述的示例实施方式可以通过软件实现,也可以通过软件结合必要的硬件的方式来实现。因此,根据本公开实施方式的技术方案可以以软件产品的形式体现出来,该软件产品可以存储在一个非易失性存储介质(可以是CD-ROM,U盘,移动硬盘等)中或网络上,包括若干指令以使得一台计算设备(可以是个人计算机、服务器、终端装置、或者网络设备等)执行根据本公开实施方式的方法。
此外,上述附图仅是根据本公开示例性实施例的方法所包括的处理的示意性说明,而不是限制目的。易于理解,上述附图所示的处理并不表明或限制这些处理的时间顺序。另外,也易于理解,这些处理可以是例如在多个模块中同步或异步执行的。
本领域技术人员在考虑说明书及实践这里公开的发明后,将容易想到本公开的其他实施例。本申请旨在涵盖本公开的任何变型、用途或者适应性变化,这些变型、用途或者适应性变化遵循本公开的一般性原理并包括本公开未公开的本技术领域中的公知常识或惯用技术手段。说明书和实施例仅被视为示例性的,本公开的真正范围和精神由权利要求指出。
Claims (10)
1.一种程序编译方法,其特征在于,包括:
获取各代码模块之间的调用依赖关系,根据所述调用依赖关系确定待编译模块对应的第一依赖模块;
对所述第一依赖模块中包含的依赖接口代码进行打包,得到第二依赖模块;
根据所述第二依赖模块对所述待编译模块进行编译。
2.根据权利要求1所述的方法,其特征在于,在根据所述依赖关系确定待编译模块对应的第一依赖模块之后,所述方法还包括:
对所述第一依赖模块中的剩余代码进行移除处理;所述剩余代码为除所述依赖接口代码之外的代码。
3.根据权利要求1或2所述的方法,其特征在于,所述方法还包括:
当所述待编译模块不存在第一依赖模块时,对所述待编译模块进行打包,得到第一打包文件。
4.根据权利要求3所述的方法,其特征在于,所述对所述第一依赖模块中包含的依赖接口代码进行打包,得到第二依赖模块,包括:
基于Java编译器和/或kotlin编译器对所述第一依赖模块中包含的依赖接口代码进行编译,得到编译文件;
对所述编译文件进行打包,得到所述第二依赖模块。
5.根据权利要求3所述的方法,其特征在于,在根据所述第二依赖模块对所述待编译模块进行编译之后,所述方法还包括:
当检测到当前运行任务为打包任务时,对所述第一依赖模块中的剩余代码进行打包,得到第二打包文件;
采用自动化构建工具对所述第二依赖模块、所述第一打包文件与所述第二打包文件进行打包,得到应用程序包。
6.根据权利要求5所述的方法,其特征在于,所述第二依赖模块、第一打包文件、第二打包文件的文件格式为Jar格式。
7.根据权利要求1所述的方法,其特征在于,所述获取各代码模块之间的调用依赖关系,包括:
预先对所述代码模块之间的调用依赖关系进行分析处理,形成依赖关系树;其中,依赖关系树中的每个节点对应一个模块;依赖关系树的节点包括父节点和子节点,子节点为父节点的依赖项;
基于编译插件对所述依赖关系树进行解析处理,得到所述各代码模块之间的调用依赖关系;
其中,所述调用依赖关系包括直接依赖关系以及间接依赖关系。
8.一种程序编译装置,其特征在于,包括:
获取模块,用于获取各代码模块之间的调用依赖关系,根据所述调用依赖关系确定待编译模块对应的第一依赖模块;
打包模块,用于对所述第一依赖模块中包含的依赖接口代码进行打包,得到第二依赖模块;
处理模块,用于根据所述第二依赖模块对所述待编译模块进行编译。
9.一种计算机存储介质,其上存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现权利要求1~7中任意一项所述的程序编译方法。
10.一种电子设备,其特征在于,包括:
处理器;以及
存储器,用于存储所述处理器的可执行指令;
其中,所述处理器配置为经由执行所述可执行指令来执行权利要求1~7中任意一项所述的程序编译方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010313591.3A CN111459499A (zh) | 2020-04-20 | 2020-04-20 | 程序编译方法及装置、计算机存储介质、电子设备 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010313591.3A CN111459499A (zh) | 2020-04-20 | 2020-04-20 | 程序编译方法及装置、计算机存储介质、电子设备 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN111459499A true CN111459499A (zh) | 2020-07-28 |
Family
ID=71684691
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202010313591.3A Pending CN111459499A (zh) | 2020-04-20 | 2020-04-20 | 程序编译方法及装置、计算机存储介质、电子设备 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN111459499A (zh) |
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112486481A (zh) * | 2020-12-03 | 2021-03-12 | 北京展心展力信息科技有限公司 | 多模块分层架构实现方法、装置、电子设备及介质 |
CN112965720A (zh) * | 2021-02-19 | 2021-06-15 | 上海微盟企业发展有限公司 | 一种组件编译方法、装置、设备及计算机可读存储介质 |
CN113553061A (zh) * | 2021-09-22 | 2021-10-26 | 西安芯瞳半导体技术有限公司 | 一种提升源程序执行性能的方法、装置及计算机存储介质 |
CN114297089A (zh) * | 2022-03-02 | 2022-04-08 | 杭州海康威视数字技术股份有限公司 | 基于容器的Python远程动态调试方法及系统 |
CN114371852A (zh) * | 2022-01-13 | 2022-04-19 | 北京字节跳动网络技术有限公司 | 一种编译方法及装置 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8122440B1 (en) * | 2007-09-26 | 2012-02-21 | Netapp, Inc. | Method and apparatus for enumerating external program code dependencies |
CN103870310A (zh) * | 2014-02-18 | 2014-06-18 | 小米科技有限责任公司 | 程序编译方法及相关装置 |
CN109388403A (zh) * | 2018-09-26 | 2019-02-26 | 广州视源电子科技股份有限公司 | 依赖注入方法、装置、设备和存储介质 |
-
2020
- 2020-04-20 CN CN202010313591.3A patent/CN111459499A/zh active Pending
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8122440B1 (en) * | 2007-09-26 | 2012-02-21 | Netapp, Inc. | Method and apparatus for enumerating external program code dependencies |
CN103870310A (zh) * | 2014-02-18 | 2014-06-18 | 小米科技有限责任公司 | 程序编译方法及相关装置 |
CN109388403A (zh) * | 2018-09-26 | 2019-02-26 | 广州视源电子科技股份有限公司 | 依赖注入方法、装置、设备和存储介质 |
Cited By (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112486481A (zh) * | 2020-12-03 | 2021-03-12 | 北京展心展力信息科技有限公司 | 多模块分层架构实现方法、装置、电子设备及介质 |
CN112486481B (zh) * | 2020-12-03 | 2024-03-19 | 北京展心展力信息科技有限公司 | 多模块分层架构实现方法、装置、电子设备及介质 |
CN112965720A (zh) * | 2021-02-19 | 2021-06-15 | 上海微盟企业发展有限公司 | 一种组件编译方法、装置、设备及计算机可读存储介质 |
CN113553061A (zh) * | 2021-09-22 | 2021-10-26 | 西安芯瞳半导体技术有限公司 | 一种提升源程序执行性能的方法、装置及计算机存储介质 |
CN113553061B (zh) * | 2021-09-22 | 2021-12-17 | 西安芯瞳半导体技术有限公司 | 一种提升源程序执行性能的方法、装置及计算机存储介质 |
CN114371852A (zh) * | 2022-01-13 | 2022-04-19 | 北京字节跳动网络技术有限公司 | 一种编译方法及装置 |
CN114371852B (zh) * | 2022-01-13 | 2023-10-24 | 抖音视界有限公司 | 一种编译方法及装置 |
CN114297089A (zh) * | 2022-03-02 | 2022-04-08 | 杭州海康威视数字技术股份有限公司 | 基于容器的Python远程动态调试方法及系统 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US11422778B2 (en) | Development environment for real-time dataflow programming language | |
CN111459499A (zh) | 程序编译方法及装置、计算机存储介质、电子设备 | |
CN107291438B (zh) | 自动化脚本的生成方法、装置及电子设备 | |
US8347272B2 (en) | Call graph dependency extraction by static source code analysis | |
CN110059456B (zh) | 代码保护方法、代码保护装置、存储介质与电子设备 | |
WO2020252081A1 (en) | Systems and methods for robotic process automation | |
CN111198863A (zh) | 一种规则引擎及其实现方法 | |
CN114138281A (zh) | 软件工程的编译方法、装置、设备及介质 | |
Bartolomei et al. | Study of an API migration for two XML APIs | |
US20210141709A1 (en) | Automatic software behavior identification using execution record | |
Ali et al. | Automated parallel GUI testing as a service for mobile applications | |
Ghosh et al. | A systematic review on program debugging techniques | |
CN111913741A (zh) | 对象拦截方法、装置、介质及电子设备 | |
CN111258802A (zh) | 捕获应用程序崩溃信息的方法及相关设备 | |
Anbunathan et al. | Automatic test generation from UML sequence diagrams for android mobiles | |
CN113641594B (zh) | 跨端自动化测试方法以及相关装置 | |
CN112286802B (zh) | 一种测试程序性能方法、装置和电子设备 | |
CN114116509A (zh) | 程序分析方法、装置、电子设备和存储介质 | |
CN117573566B (zh) | 多系统测试用例生成方法、装置及存储介质 | |
CN117591436A (zh) | 一种Go源码的可观测性数据获取方法及装置 | |
Aslam | Creating a microservice generator for GO-based microservices: An industrial case study | |
CN116700734A (zh) | 分布式编译系统的代码编译方法及装置 | |
Chen et al. | The research and implementation of automatic unit test recording framework | |
Tayefeh Morsal | Evolution of Security in Automated Migration Processes | |
CN115809193A (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 |