CN114416103A - 代码编译方法及装置、计算机可读介质、电子设备 - Google Patents
代码编译方法及装置、计算机可读介质、电子设备 Download PDFInfo
- Publication number
- CN114416103A CN114416103A CN202210249955.5A CN202210249955A CN114416103A CN 114416103 A CN114416103 A CN 114416103A CN 202210249955 A CN202210249955 A CN 202210249955A CN 114416103 A CN114416103 A CN 114416103A
- Authority
- CN
- China
- Prior art keywords
- code
- compiling
- codes
- type
- identification information
- 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
- 238000000034 method Methods 0.000 title claims abstract description 73
- 238000005457 optimization Methods 0.000 claims abstract description 39
- 230000008569 process Effects 0.000 claims abstract description 18
- 238000012216 screening Methods 0.000 claims abstract description 13
- 230000006870 function Effects 0.000 claims description 30
- 238000012545 processing Methods 0.000 claims description 10
- 238000004590 computer program Methods 0.000 claims description 9
- 230000003068 static effect Effects 0.000 claims description 6
- 238000005516 engineering process Methods 0.000 abstract description 2
- 238000010586 diagram Methods 0.000 description 10
- 238000006243 chemical reaction Methods 0.000 description 5
- 238000004891 communication Methods 0.000 description 4
- 230000003287 optical effect Effects 0.000 description 4
- 238000002360 preparation method Methods 0.000 description 4
- 239000011800 void material Substances 0.000 description 4
- 238000011161 development Methods 0.000 description 3
- 238000002372 labelling Methods 0.000 description 3
- 238000003032 molecular docking Methods 0.000 description 3
- 230000009471 action Effects 0.000 description 2
- 230000005540 biological transmission Effects 0.000 description 2
- 230000000694 effects Effects 0.000 description 2
- 230000000644 propagated effect Effects 0.000 description 2
- 239000004065 semiconductor Substances 0.000 description 2
- 238000013519 translation Methods 0.000 description 2
- 238000012795 verification Methods 0.000 description 2
- 230000006978 adaptation Effects 0.000 description 1
- 230000004888 barrier function Effects 0.000 description 1
- 230000008859 change Effects 0.000 description 1
- 230000007812 deficiency Effects 0.000 description 1
- 239000012634 fragment Substances 0.000 description 1
- 230000010354 integration Effects 0.000 description 1
- 230000003993 interaction Effects 0.000 description 1
- 239000004973 liquid crystal related substance Substances 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 239000013307 optical fiber Substances 0.000 description 1
- 230000000149 penetrating effect Effects 0.000 description 1
- 230000003252 repetitive effect Effects 0.000 description 1
- 230000002441 reversible effect Effects 0.000 description 1
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
Landscapes
- Engineering & Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
本公开具体涉及计算机技术领域,具体涉及计算机技术领域,具体涉及一种代码编译方法及装置、计算机可读介质以及电子设备。所述方法包括:筛选第一代码中的第一类型代码,并对筛选的第一类型代码添加第一标识信息;对所述第一代码进行编译,以获取目标格式的第一中间代码;以及筛选第二代码中的第二类型代码,并对筛选的第二类型代码添加第二标识信息;对筛选的所述第二类型代码进行编译,以获取所述目标格式的第二中间代码;将所述目标格式的第一中间代码、第二中间代码进行联合优化,并根据优化结果进行编译,以获取目标编译代码结果。本方法能够优化JNI的性能,降低代码编译过程的性能损失。
Description
技术领域
本公开涉及计算机技术领域,具体涉及一种代码编译方法、一种代码编译装置、一种计算机可读介质以及一种电子设备。
背景技术
JNI(Java Native Interface,Java本地接口),是Java语言与原生代码交互的编程接口。通过该接口,Java可以与原生代码相互调用,也可以相互操作数据。由于Java代码和native代码有非常多的不同约定(如栈布局,传参方法等),标准的JNI流程需要做非常多的准备和转换工作,以保证两种代码能正确地交互。但是繁重的转换增加了两种代码相互调用的成本,降低了程序运行速度。在一些极端场景下,转换消耗的时间可能比功能代码的耗时高几十倍。
需要说明的是,在上述背景技术部分公开的信息仅用于加强对本公开的背景的理解,因此可以包括不构成对本领域普通技术人员已知的现有技术的信息。
发明内容
本公开提供一种代码编译方法、一种代码编译装置、一种计算机可读介质以及一种电子设备,能够优化JNI的性能,降低代码编译过程的性能损失。
本公开的其他特性和优点将通过下面的详细描述变得显然,或部分地通过本公开的实践而习得。
根据本公开的第一方面,提供一种代码编译方法,包括:
筛选第一代码中的第一类型代码,并对筛选的第一类型代码添加第一标识信息;
对所述第一代码进行编译,以获取目标格式的第一中间代码;以及
筛选第二代码中的第二类型代码,并对筛选的第二类型代码添加第二标识信息;
对筛选的所述第二类型代码进行编译,以获取所述目标格式的第二中间代码;
将所述目标格式的第一中间代码、第二中间代码进行联合优化,并根据优化结果进行编译,以获取目标编译代码结果。
根据本公开的第二方面,提供一种代码编译装置,包括:
第一代码标记模块,用于筛选第一代码中的第一类型代码,并对筛选的第一类型代码添加第一标识信息;
第一编译模块,用于对所述第一代码进行编译,以获取目标格式的第一中间代码;以及
第二代码标记模块,用于筛选第二代码中的第二类型代码,并对筛选的第二类型代码添加第二标识信息;
第二编译模块,用于对筛选的所述第二类型代码进行编译,以获取所述目标格式的第二中间代码;
联合处理模块,用于将所述目标格式的第一中间代码、第二中间代码进行联合优化,并根据优化结果进行编译,以获取目标编译代码结果。
根据本公开的第三方面,提供一种计算机可读介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现上述的代码编译方法。
根据本公开的第四方面,提供一种电子设备,包括:
处理器;以及
存储器,用于存储所述处理器的可执行指令;
其中,所述处理器配置为经由执行所述可执行指令时实现上述的代码编译方法。
本公开的一种实施例所提供的代码编译方法,通过将第一代码、第二代码均转换为目标格式的中间代码,将JNI接口两侧的代码利用目标格式的中间代码进行代码对齐,从而可以解决ART优化能力不足的问题。并且,通过对第一中间代码、第二中间代码添加对应的标识信息,利用改写标识信息生成正确的对接指令序列;同时,在不改变开发方式,不修改源代码的前提下,可以有效的缩小代码的优化范围,降低代码编译的工作量,优化JNI性能。
应当理解的是,以上的一般描述和后文的细节描述仅是示例性和解释性的,并不能限制本公开。
附图说明
此处的附图被并入说明书中并构成本说明书的一部分,示出了符合本公开的实施例,并与说明书一起用于解释本公开的原理。显而易见地,下面描述中的附图仅仅是本公开的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1示意性示出本公开示例性实施例中一种代码编译方法的示意图;
图2示意性示出本公开示例性实施例中代码编译方法的流程示意图;
图3示意性示出本公开示例性实施例中一种代码编译装置的组成示意图;
图4示意性示出本公开示例性实施例中一种电子设备的组成示意图。
具体实施方式
现在将参考附图更全面地描述示例实施方式。然而,示例实施方式能够以多种形式实施,且不应被理解为限于在此阐述的范例;相反,提供这些实施方式使得本公开将更加全面和完整,并将示例实施方式的构思全面地传达给本领域的技术人员。所描述的特征、结构或特性可以以任何合适的方式结合在一个或更多实施方式中。
此外,附图仅为本公开的示意性图解,并非一定是按比例绘制。图中相同的附图标记表示相同或类似的部分,因而将省略对它们的重复描述。附图中所示的一些方框图是功能实体,不一定必须与物理或逻辑上独立的实体相对应。可以采用软件形式来实现这些功能实体,或在一个或多个硬件模块或集成电路中实现这些功能实体,或在不同网络和/或处理器装置和/或微控制器装置中实现这些功能实体。
在相关技术中,Android系统下,需要高性能运行的大量功能一般由native代码提供,而框架和应用的逻辑代码工作在ART(Android Runtime,安卓运行时)虚拟机中,两种代码需要频繁通过JNI交互。因此,JNI性能会直接影响到系统流畅度等关键指标。Android提供了Fast Native和Critical Native两种注解,能大幅度加速JNI,但其仅提供给系统自有代码使用,没有开放给普通应用程序使用。并且,该优化方案仍保留了JNI屏障,无法达到穿透JNI协同优化native代码和Java代码的最优状态。由于Java代码和native(原生)代码有非常多的不同约定(如栈布局,传参方法等),标准的JNI流程需要做非常多的准备和转换工作,以保证两种代码能正确地交互。但是繁重的转换增加了两种代码相互调用的成本,降低了程序运行速度。在一些极端场景下,转换消耗的时间可能比功能代码的耗时高几十倍。
针对上述的现有技术的缺点和不足,本示例实施方式中提供了一种代码编译方法,可以应用于Java代码和native代码之间的跨语言编译场景中。参考图1中所示,上述的代码编译方法可以包括:
步骤S11,筛选第一代码中的第一类型代码,并对筛选的第一类型代码添加第一标识信息;
步骤S12,对所述第一代码进行编译,以获取目标格式的第一中间代码;以及
步骤S13,筛选第二代码中的第二类型代码,并对筛选的第二类型代码添加第二标识信息;
步骤S14,对筛选的所述第二类型代码进行编译,以获取所述目标格式的第二中间代码;
步骤S15,将所述目标格式的第一中间代码、第二中间代码进行联合优化,并根据优化结果进行编译,以获取目标编译代码结果。
本示例实施方式所提供的代码编译方法,通过将第一代码、第二代码均转换为目标格式的中间代码,将JNI接口两侧的代码利用目标格式的中间代码进行代码对齐,从而可以解决ART优化能力不足的问题。并且,通过对第一中间代码、第二中间代码添加对应的标识信息,利用改写标识信息生成正确的对接指令序列;同时,在不改变开发方式,不修改源代码的前提下,可以有效的缩小代码的优化范围,降低代码编译的工作量,优化JNI性能。
下面,将结合附图及实施例对本示例实施方式中的人代码编译方法的各个步骤进行更详细的说明。
在步骤S11中,筛选第一代码中的第一类型代码,并对筛选的第一类型代码添加第一标识信息。
本示例实施方式中,上述的第一代码可以是指c/c++代码。具体而言,上述的步S11可以包括:对所述第一代码进行语法分析,以筛选需要进行快速JNI调用的第一类型代码,并对筛选的第一类型代码内容添加所述第一标识信息。
具体的,上述的第一类型代码可以是指入口函数。对于已编辑的c/c++代码,即原生代码,可以通过代码的语法分析来识别出需要进行快速JNI调用的入口函数。例如,可以通过以下特征来识别入口函数,例如:JNICALL标识,JNIEnv*env作为第一个入参,函数名以“_”分割并遵从Java类名+方法名的命名规则,等特征。
举例来说,一段包含JNI调用的函数的相关特征的代码可以包括:
JNIEXPORT void JNICALL
Java_com_example_hellojnicallback_MainActivity_StopTicks(JNIEnv*env,jobject instance){
通过对代码进行语法分析,可以识别出其中包含JNICALL标识、JNIEnv*env等特征。从而可以为该段代码添加第一标识信息。该第一标识信息可以是代码的注释信息。
或者,在一些示例性实施方式中,上述的第一标识信息也可以包含由人工添加的注释信息。
在步骤S12中,对所述第一代码进行编译,以获取目标格式的第一中间代码。
本示例实施方式中,上述的目标格式可以是LLVM-IR(LLVM intermediaterepresentation,LLVM中间表示)格式;LLVM-IR为LLVM(Low Level Virtual Machine,低级虚拟机)内部用来表达程序逻辑的中间表达形式。其具有内存格式、磁盘二进制格式、磁盘文本格式三种记录格式,三种格式完全等价。
本示例实施方式中,对所述第一代码进行编译时,所述方法还包括:对添加有所述第一标识信息的第一类型代码进行代码静态分析。
具体而言,可以使用clang编译器编译c/c++代码,将c/c++代码编译为LLVM-IR格式。其中,被标识为可能被快速JNI调用的代码需特殊处理。具体的,编译时需要使用代码静态分析技术,确保其调用的所有函数都可以被找到,以便被分析和编译。如果由于函数指针、类方法的多态性、内嵌汇编等原因无法确定被调用者,则可以通过人工标注的方式对代码添加特殊注释。例如,一段代码片段包括:
void showcase_asm(){
//@@fast_jni_call you_dont_know_where_i_am
asm("call you_dont_know_where_i_am");
}
在对于当前的代码进行静态分析后,无法准确获知内嵌汇编中调用了新的函数;此时可以对该段代码创建一人工标注任务,并将该人工标注任务推送至程序员,以人工方式进行标注,进而避免后续在代码生成流程中会因为找不到函数定义而出错。
在步骤S13中,筛选第二代码中的第二类型代码,并对筛选的第二类型代码添加第二标识信息。
本示例实施方式中,上述的第二代码可以是Java代码。具体的,也可以利用语法分析对Java代码进行分析和识别需要优化JNI调用的方法,例如,频繁调用ns级执行时间native流程的方法。对于识别出的代码内容,可以为其添加对应第二标识信息。其中,第二标识信息也可以包含人工标注的第二标识信息。第二标志信息可以是对Java代码的注释信息。
在步骤S14中,对筛选的所述第二类型代码进行编译,以获取所述目标格式的第二中间代码。
本示例实施方式中,第二中间代码可以上述的LLVM-IR格式代码。可以将Java代码转换为dex文件;再利用dex2oat编译器对dex代码进行编译,得到LLVM-IR格式的第二中间代码。
利用dex2oat编译器编译dex代码时,可以利用代码中的注解识别出需要特别优化的方法。对这类代码,以及其调用者,转换为LLVM-IR。
此外,对于第二代码中的其余代码,可以利用预设编译方法对所述第二代码中的其余代码进行编译。例如,可以使用常规的ART编译优化流程编译。从而可以控制优化代码的影响范围,防止其冲击程序的稳定性。
或者,在一些示例性实施方式中,也可以对所述第二代码中的其余代码同步编译为目标类型的中间代码。即,将第二代码一并编译为LLVM-IR格式。从而可以获取更好的优化效果。
在一些示例性实施方式中,对于c/c++代码的编译过程,和对Java代码的编译过程可以同步执行。即,上述的步骤S11、S12,与步骤S13、S14可以同步执行,从而提高数据处理效率。
在步骤S15中,将所述目标格式的第一中间代码、第二中间代码进行联合优化,并根据优化结果进行编译,以获取目标编译代码结果。
在一些示例实施方式中,在获取第一中间代码、第二中间代码后,可以首先对所述目标格式的第一中间代码、第二中间代码进行正确性校验。
具体的,可以将生成的LLVM-IR统一送入正确性校验工具,确认Java代码标注的快速调用都有对应的(经由c/c++代码生成的)LLVM-IR定义,且LLVM-IR自封闭。然后,再将校验完成的LLVM-IR进行联合优化。
本示例实施方式中,上述的步骤S15可以包括:在优化器中对所述第一中间代码、第二中间代码进行比对,以识别区别函数;基于所述区别函数优化所述第二中间代码对应的调用流程。
具体来说,可以使用LLVM-opt优化器进行联合优化。联合优化并不会改变原有的优化器框架。这里的联合,主要体现在两端代码在IR层面相互可见后,可以进行一些原来不能进行的分析和优化。举例来说,一段代码包括:
JNIEXPORT void JNICALL Java_com_example_hellojnicallback_MainActivity_StopTicks(JNIEnv*env,jobject instance){store_object(instance);}
c/c++端的JNI代码实际上并没有使用env变量,理论上ART在调用该函数时,可以走快速调用的流程(fast/criticalnative)。但是,传统编译流程中,ART看不到c/c++端的代码,它只能按照标准JNI调用方式进行准备工作,耗时上百个cpu cycles。而在本方案时,LLVM-opt优化器可以同时看到两边的IR。因此,可以实现一个编译优化,当发现c/c++端IR中没有引用env时,就将dex端生成的调用准备流程简化,简化后耗时将下降到10个cpucycles左右。
本示例实施方式中,上述的步骤S15还可以包括:在所述第一中间代码、第二中间代码之间共享所述第一标识信息、第二标识信息;以及将所述第一标识信息、第二标识信息对应的代码集中存储。
具体的,对于代码中添加的注释信息来说,Java端与c端都可以自定义用于优化的注释,在联合优化的背景下,这样的注释可以在两种语言间共享,利用标识信息进行JNI接口的调用,有效的消除不必要的跨语言调用损耗,获得更好的优化效果。例如,可以通过在Java代码中添加LIKELY标记,可以告知编译系统native_jni_call_x也位于热点片段中。编译流程可以将这样的标记传递到LLVM-IR层级,在联合优化时,可以将热点的代码片段集中放置,提高缓存工作效率。这里的LIKELY这类标注,同样可以通过Profiling等方式,使用工具自动生成。具体的代码可以包括:
Java
void test_call_jni(){
@LIKELY(condition_x()==true)
if(condition_x()){
native_jni_call_x();
}else{
native_jni_call_y();
}
}
之后,可以将LLVM-opt生成的优化结果放入LLVM-llc,最终编译为二进制代码放回android odex文件中,作为Java代码的编译结果。
本公开实施例所提供的代码编译方法,可以应用于手机、平板电脑等智能终端设备。参考图2所示,通过将Java代码利用dex2oat编译器201编译为LLVM-IR代码203,同步的将C/C++代码利用Clang编译器202编译为,实现将JNI接口两边的代码对齐到LLVM-IR而不是Java字节码,利用LLVM强大的优化能力确保最终能获得高性能,解决ART优化能力不足的问题。并且,使用annotation(注解)/特殊注释来标记native代码入口,使得native代码生成时能够利用该信息生成正确的ABI(application binary interface,应用程序二进制接口)对接指令序列;native的入口函数,其输入ABI要对齐ART,但对其他native函数的调用不必遵守ART的ABI。同时,引入静态分析工具,利用该信息自动检查naitve代码是否符合要求,以控制转换和集成范围,提高系统稳定性。利用JNI对长执行时间函数性能影响不大的特点,将优化范围约束到短小函数,即通过注解/注释标记的这类函数上,大大降低了技术实现难度和工作量。在利用正确性验证工具对生成的LLVM-IR统一送入正确性验证流程204;保证编译后代码正确性和有效性。通过LLVM-opt优化器205对中间代码进行联合优化,得到LLVM-llc代码206,再转换为二进制代码207。从而在不改变开发方式,不修改源代码的前提下,消除android系统中JNI瓶颈带来的性能损失,提高系统/应用的综合性能。另外,本方法也可以应用于服务器端,服务器级JVM也可使用并获得更好的性能。
需要注意的是,上述附图仅是根据本发明示例性实施例的方法所包括的处理的示意性说明,而不是限制目的。易于理解,上述附图所示的处理并不表明或限制这些处理的时间顺序。另外,也易于理解,这些处理可以是例如在多个模块中同步或异步执行的。
进一步的,参考图3所示,本示例的实施方式中还提供一种代码编译装置30,所述装置包括:第一代码标记模块301、第一编译模块302、第二代码标记模块303、第二编译模块304和联合处理模块305。其中,
所述第一代码标记模块301可以用于筛选第一代码中的第一类型代码,并对筛选的第一类型代码添加第一标识信息。
所述第一编译模块302可以用于对所述第一代码进行编译,以获取目标格式的第一中间代码。
所述第二代码标记模块303可以用于筛选第二代码中的第二类型代码,并对筛选的第二类型代码添加第二标识信息。
所述第二编译模块304可以用于对筛选的所述第二类型代码进行编译,以获取所述目标格式的第二中间代码。
所述联合处理模块305可以用于将所述目标格式的第一中间代码、第二中间代码进行联合优化,并根据优化结果进行编译,以获取目标编译代码结果。
在一些示例性实施方式中,所述第一代码标记模块301可以包括:对所述第一代码进行语法分析,以筛选需要进行快速JNI调用的第一类型代码,并对筛选的第一类型代码内容添加所述第一标识信息。
在一些示例性实施方式中,所述装置还包括:代码分析模块。
所述代码分析模块可以用于对添加有所述第一标识信息的第一类型代码进行代码静态分析。
在一些示例性实施方式中,所述第二编译模块304还可以用于利用预设编译方法对所述第二代码中的其余代码进行编译。
在一些示例性实施方式中,所述第二编译模块304还可以对所述第二代码中的其余代码同步编译为目标类型的中间代码;
其中,所述目标类型的第二中间代码包括全部所述第二代码的编译结果。
在一些示例性实施方式中,所述装置还包括:中间代码校验模块。
所述中间代码校验模块可以用于对所述目标格式的第一中间代码、第二中间代码进行正确性校验。
在一些示例性实施方式中,所述联合处理模块305可以包括:在优化器中对所述第一中间代码、第二中间代码进行比对,以识别区别函数;基于所述区别函数优化所述第二中间代码对应的调用流程。
在一些示例性实施方式中,所述联合处理模块305还可以包括:在所述第一中间代码、第二中间代码之间共享所述第一标识信息、第二标识信息;以及将所述第一标识信息、第二标识信息对应的代码集中存储。
上述的代码编译装置20中各模块的具体细节已经在对应的代码编译方法中进行了详细的描述,因此此处不再赘述。
应当注意,尽管在上文详细描述中提及了用于动作执行的设备的若干模块或者单元,但是这种划分并非强制性的。实际上,根据本公开的实施方式,上文描述的两个或更多模块或者单元的特征和功能可以在一个模块或者单元中具体化。反之,上文描述的一个模块或者单元的特征和功能可以进一步划分为由多个模块或者单元来具体化。
图4示出了适于用来实现本发明实施例的电子设备的示意图。
需要说明的是,图4示出的电子设备1000仅是一个示例,不应对本公开实施例的功能和使用范围带来任何限制。
如图4所示,电子设备1000包括中央处理单元(Central Processing Unit,CPU)1001,其可以根据存储在只读存储器(Read-Only Memory,ROM)1002中的程序或者从储存部分1008加载到随机访问存储器(Random Access Memory,RAM)1003中的程序而执行各种适当的动作和处理。在RAM 1003中,还存储有系统操作所需的各种程序和数据。CPU 1001、ROM1002以及RAM 1003通过总线1004彼此相连。输入/输出(Input/Output,I/O)接口1005也连接至总线1004。
以下部件连接至I/O接口1005:包括键盘、鼠标等的输入部分1006;包括诸如阴极射线管(Cathode Ray Tube,CRT)、液晶显示器(Liquid Crystal Display,LCD)等以及扬声器等的输出部分1007;包括硬盘等的储存部分1008;以及包括诸如LAN(Local AreaNetwork,局域网)卡、调制解调器等的网络接口卡的通信部分1009。通信部分1009经由诸如因特网的网络执行通信处理。驱动器1010也根据需要连接至I/O接口1005。可拆卸介质1011,诸如磁盘、光盘、磁光盘、半导体存储器等等,根据需要安装在驱动器1010上,以便于从其上读出的计算机程序根据需要被安装入储存部分1008。
特别地,根据本发明的实施例,下文参考流程图描述的过程可以被实现为计算机软件程序。例如,本发明的实施例包括一种计算机程序产品,其包括承载在计算机可读介质上的计算机程序,该计算机程序包含用于执行流程图所示的方法的程序代码。在这样的实施例中,该计算机程序可以通过通信部分1009从网络上被下载和安装,和/或从可拆卸介质1011被安装。在该计算机程序被中央处理单元(CPU)1001执行时,执行本申请的系统中限定的各种功能。
具体来说,上述的电子设备可以是手机、平板电脑或者笔记本电脑等智能移动终端设备。或者,上述的电子设备也可以是台式电脑等智能终端设备。
需要说明的是,本发明实施例所示的计算机可读介质可以是计算机可读信号介质或者计算机可读存储介质或者是上述两者的任意组合。计算机可读存储介质例如可以是——但不限于——电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。计算机可读存储介质的更具体的例子可以包括但不限于:具有一个或多个导线的电连接、便携式计算机磁盘、硬盘、随机访问存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(Erasable Programmable Read Only Memory,EPROM)、闪存、光纤、便携式紧凑磁盘只读存储器(Compact Disc Read-Only Memory,CD-ROM)、光存储器件、磁存储器件、或者上述的任意合适的组合。在本发明中,计算机可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。而在本发明中,计算机可读的信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了计算机可读的程序代码。这种传播的数据信号可以采用多种形式,包括但不限于电磁信号、光信号或上述的任意合适的组合。计算机可读的信号介质还可以是计算机可读存储介质以外的任何计算机可读介质,该计算机可读介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。计算机可读介质上包含的程序代码可以用任何适当的介质传输,包括但不限于:无线、有线等等,或者上述的任意合适的组合。
附图中的流程图和框图,图示了按照本发明各种实施例的系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段、或代码的一部分,上述模块、程序段、或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个接连地表示的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图或流程图中的每个方框、以及框图或流程图中的方框的组合,可以用执行规定的功能或操作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。
描述于本发明实施例中所涉及到的单元可以通过软件的方式实现,也可以通过硬件的方式来实现,所描述的单元也可以设置在处理器中。其中,这些单元的名称在某种情况下并不构成对该单元本身的限定。
需要说明的是,作为另一方面,本申请还提供了一种计算机可读介质,该计算机可读介质可以是电子设备中所包含的;也可以是单独存在,而未装配入该电子设备中。上述计算机可读介质承载有一个或者多个程序,当上述一个或者多个程序被一个电子设备执行时,使得该电子设备实现如下述实施例中所述的方法。例如,所述的电子设备可以实现如图1所示的各个步骤。
此外,上述附图仅是根据本发明示例性实施例的方法所包括的处理的示意性说明,而不是限制目的。易于理解,上述附图所示的处理并不表明或限制这些处理的时间顺序。另外,也易于理解,这些处理可以是例如在多个模块中同步或异步执行的。
本领域技术人员在考虑说明书及实践这里公开的发明后,将容易想到本公开的其他实施例。本申请旨在涵盖本公开的任何变型、用途或者适应性变化,这些变型、用途或者适应性变化遵循本公开的一般性原理并包括本公开未公开的本技术领域中的公知常识或惯用技术手段。说明书和实施例仅被视为示例性的,本公开的真正范围和精神由权利要求指出。
应当理解的是,本公开并不局限于上面已经描述并在附图中示出的精确结构,并且可以在不脱离其范围进行各种修改和改变。本公开的范围仅由所附的权利要求来限。
Claims (11)
1.一种代码编译方法,其特征在于,所述方法包括:
筛选第一代码中的第一类型代码,并对筛选的第一类型代码添加第一标识信息;
对所述第一代码进行编译,以获取目标格式的第一中间代码;以及
筛选第二代码中的第二类型代码,并对筛选的第二类型代码添加第二标识信息;
对筛选的所述第二类型代码进行编译,以获取所述目标格式的第二中间代码;
将所述目标格式的第一中间代码、第二中间代码进行联合优化,并根据优化结果进行编译,以获取目标编译代码结果。
2.根据权利要求1所述的代码编译方法,其特征在于,所述筛选第一代码中的第一类型代码,并对筛选的第一类型代码添加第一标识信息,包括:
对所述第一代码进行语法分析,以筛选需要进行快速JNI调用的第一类型代码,并对筛选的第一类型代码内容添加所述第一标识信息。
3.根据权利要求1所述的代码编译方法,其特征在于,所述对所述第一代码进行编译时,所述方法还包括:
对添加有所述第一标识信息的第一类型代码进行代码静态分析。
4.根据权利要求1所述的代码编译方法,其特征在于,所述对筛选的所述第二类型代码进行编译时,所述方法还包括:
利用预设编译方法对所述第二代码中的其余代码进行编译。
5.根据权利要求1所述的代码编译方法,其特征在于,所述对筛选的所述第二类型代码进行编译时,所述方法还包括:
对所述第二代码中的其余代码同步编译为目标类型的中间代码;
其中,所述目标类型的第二中间代码包括全部所述第二代码的编译结果。
6.根据权利要求1、4或5所述的代码编译方法,其特征在于,所述将所述目标格式的第一中间代码、第二中间代码进行联合优化之前,所述方法还包括:
对所述目标格式的第一中间代码、第二中间代码进行正确性校验。
7.根据权利要求1所述的代码编译方法,其特征在于,所述将所述目标格式的第一中间代码、第二中间代码进行联合优化,包括:
在优化器中对所述第一中间代码、第二中间代码进行比对,以识别区别函数;
基于所述区别函数优化所述第二中间代码对应的调用流程。
8.根据权利要求1或7所述的代码编译方法,其特征在于,所述将所述目标格式的第一中间代码、第二中间代码进行联合优化,包括:
在所述第一中间代码、第二中间代码之间共享所述第一标识信息、第二标识信息;以及
将所述第一标识信息、第二标识信息对应的代码集中存储。
9.一种代码编译装置,其特征在于,所述装置包括:
第一代码标记模块,用于筛选第一代码中的第一类型代码,并对筛选的第一类型代码添加第一标识信息;
第一编译模块,用于对所述第一代码进行编译,以获取目标格式的第一中间代码;以及
第二代码标记模块,用于筛选第二代码中的第二类型代码,并对筛选的第二类型代码添加第二标识信息;
第二编译模块,用于对筛选的所述第二类型代码进行编译,以获取所述目标格式的第二中间代码;
联合处理模块,用于将所述目标格式的第一中间代码、第二中间代码进行联合优化,并根据优化结果进行编译,以获取目标编译代码结果。
10.一种计算机可读介质,其上存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现如权利要求1至8中任一项所述的代码编译方法。
11.一种电子设备,其特征在于,包括:
处理器;以及
存储器,用于存储所述处理器的可执行指令;
其中,所述处理器配置为经由执行所述可执行指令来执行权利要求1至8中任一项所述的代码编译方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210249955.5A CN114416103A (zh) | 2022-03-14 | 2022-03-14 | 代码编译方法及装置、计算机可读介质、电子设备 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210249955.5A CN114416103A (zh) | 2022-03-14 | 2022-03-14 | 代码编译方法及装置、计算机可读介质、电子设备 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN114416103A true CN114416103A (zh) | 2022-04-29 |
Family
ID=81263018
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202210249955.5A Pending CN114416103A (zh) | 2022-03-14 | 2022-03-14 | 代码编译方法及装置、计算机可读介质、电子设备 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN114416103A (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2024045379A1 (zh) * | 2022-08-31 | 2024-03-07 | 蚂蚁区块链科技(上海)有限公司 | 编译方法和编译器、Wasm虚拟机 |
Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7840951B1 (en) * | 2003-08-22 | 2010-11-23 | Oracle America, Inc. | Reducing the overhead involved in executing native code in a virtual machine through binary reoptimization |
CN110245468A (zh) * | 2019-05-24 | 2019-09-17 | 阿里巴巴集团控股有限公司 | 一种编译方法、装置、设备及系统 |
CN111736838A (zh) * | 2019-03-25 | 2020-10-02 | 华为技术有限公司 | 一种跨语言编译方法及设备 |
CN112558984A (zh) * | 2020-12-29 | 2021-03-26 | Oppo广东移动通信有限公司 | 代码编译的方法、装置、电子设备以及服务器 |
CN112650503A (zh) * | 2020-12-18 | 2021-04-13 | 广东高云半导体科技股份有限公司 | 一种软件编译方法及片上系统 |
CN113608748A (zh) * | 2021-07-19 | 2021-11-05 | 上海浦东发展银行股份有限公司 | C语言转换Java语言的数据处理方法、装置及设备 |
-
2022
- 2022-03-14 CN CN202210249955.5A patent/CN114416103A/zh active Pending
Patent Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7840951B1 (en) * | 2003-08-22 | 2010-11-23 | Oracle America, Inc. | Reducing the overhead involved in executing native code in a virtual machine through binary reoptimization |
CN111736838A (zh) * | 2019-03-25 | 2020-10-02 | 华为技术有限公司 | 一种跨语言编译方法及设备 |
CN110245468A (zh) * | 2019-05-24 | 2019-09-17 | 阿里巴巴集团控股有限公司 | 一种编译方法、装置、设备及系统 |
CN112650503A (zh) * | 2020-12-18 | 2021-04-13 | 广东高云半导体科技股份有限公司 | 一种软件编译方法及片上系统 |
CN112558984A (zh) * | 2020-12-29 | 2021-03-26 | Oppo广东移动通信有限公司 | 代码编译的方法、装置、电子设备以及服务器 |
CN113608748A (zh) * | 2021-07-19 | 2021-11-05 | 上海浦东发展银行股份有限公司 | C语言转换Java语言的数据处理方法、装置及设备 |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2024045379A1 (zh) * | 2022-08-31 | 2024-03-07 | 蚂蚁区块链科技(上海)有限公司 | 编译方法和编译器、Wasm虚拟机 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US11789715B2 (en) | Systems and methods for transformation of reporting schema | |
CN112104709B (zh) | 智能合约的处理方法、装置、介质及电子设备 | |
CN111736840B (zh) | 小程序应用的编译方法、运行方法、存储介质及电子设备 | |
US10481884B2 (en) | Systems and methods for dynamically replacing code objects for code pushdown | |
US7810077B2 (en) | Reifying generic types while maintaining migration compatibility | |
US10585655B2 (en) | Systems and methods for automated retrofitting of customized code objects | |
CN106528399A (zh) | 一种测试用例确定方法及装置 | |
US11593342B2 (en) | Systems and methods for database orientation transformation | |
CN110109671B (zh) | 一种webpack标签尺寸样式转换方法及装置 | |
CN110865889A (zh) | 组件间传递事件的方法和装置 | |
CN110221840B (zh) | 应用程序的功能实现方法及装置、设备及存储介质 | |
US9886251B2 (en) | Optimized compiling of a template function | |
CN114416103A (zh) | 代码编译方法及装置、计算机可读介质、电子设备 | |
CN110737631A (zh) | 一种基于Flink引擎的数据解析方法及装置 | |
CN113238739A (zh) | 一种插件开发和数据获取方法、装置、电子设备及介质 | |
US20010051974A1 (en) | Method and apparatus for automatic generation of data interfaces | |
CN115964050A (zh) | 一种用户自定义函数的实现方法和系统 | |
CN115640279A (zh) | 一种数据血缘关系的构建方法和装置 | |
CN109189591A (zh) | 用于调用应用组件的方法和装置 | |
CN113778451B (zh) | 文件加载方法、装置、计算机系统和计算机可读存储介质 | |
CN112394920B (zh) | 一种应用软件开发方法、平台和电子设备 | |
CN113885841A (zh) | 脚本生成的方法、装置、电子设备和可读介质 | |
US9720660B2 (en) | Binary interface instrumentation | |
CN113448874A (zh) | 一种单元测试脚本的生成方法及装置 | |
CN113138767A (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 |