CN111857678A - 代码生成方法、装置、电子设备及计算机存储介质 - Google Patents
代码生成方法、装置、电子设备及计算机存储介质 Download PDFInfo
- Publication number
- CN111857678A CN111857678A CN201910339617.9A CN201910339617A CN111857678A CN 111857678 A CN111857678 A CN 111857678A CN 201910339617 A CN201910339617 A CN 201910339617A CN 111857678 A CN111857678 A CN 111857678A
- Authority
- CN
- China
- Prior art keywords
- code
- intermediate code
- call
- point
- mark
- 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.)
- Granted
Links
- 238000000034 method Methods 0.000 title claims abstract description 84
- 238000006243 chemical reaction Methods 0.000 claims abstract description 40
- 230000006870 function Effects 0.000 claims description 51
- 230000008569 process Effects 0.000 claims description 32
- 238000012545 processing Methods 0.000 claims description 30
- 238000004891 communication Methods 0.000 claims description 15
- 238000004590 computer program Methods 0.000 claims description 2
- 238000001514 detection method Methods 0.000 description 10
- 238000010586 diagram Methods 0.000 description 6
- 230000003044 adaptive effect Effects 0.000 description 5
- 238000013459 approach Methods 0.000 description 5
- 230000009286 beneficial effect Effects 0.000 description 2
- 239000003550 marker Substances 0.000 description 2
- 230000009471 action Effects 0.000 description 1
- 230000008859 change Effects 0.000 description 1
- 238000013500 data storage Methods 0.000 description 1
- 238000013461 design Methods 0.000 description 1
- 238000011161 development Methods 0.000 description 1
- 238000005516 engineering process Methods 0.000 description 1
- 238000004880 explosion Methods 0.000 description 1
- 230000002452 interceptive effect Effects 0.000 description 1
- 238000013507 mapping Methods 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 238000011022 operating instruction Methods 0.000 description 1
- 238000005457 optimization Methods 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
- G06F8/44—Encoding
- G06F8/447—Target code generation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
- G06F8/31—Programming languages or programming paradigms
- G06F8/315—Object-oriented languages
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
- G06F8/37—Compiler construction; Parser generation
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Computing Systems (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
本发明实施例提供了一种代码生成方法、装置、电子设备及计算机存储介质,其中,代码生成方法包括:获取待进行语言转换的第一中间代码;对所述第一中间代码进行检测,获取所述第一中间代码中待进行安全点调用和/或待进行异常处理的调用点;对所述调用点进行标记,以将所述第一中间代码转换生成包括所述标记的第二中间代码。通过本发明实施例,既提升了编译项目整体性能,又大大降低了对技术人员的代码转换能力的要求。
Description
技术领域
本发明实施例涉及计算机技术领域,尤其涉及一种代码生成方法、装置、电子设备及计算机存储介质。
背景技术
随着网络技术的发展,通过浏览器网页获取信息已成为人们生活和工作的常态。浏览器网页内容的可以通过诸如超文本标记语言HTML等来编辑实现,但HTML不易编辑动态或互动的网页,因此,JavaScript语言应运而生。
为了更好地服务于网页,一种使用JavaScript引擎对JavaScript代码进行处理的方式又被提出。JavaScript引擎是执行JavaScript代码的解释器,其可以实现为标准解释器或即时编译器。其中,Google公司提供的V8引擎是当前被广泛使用的一种JavaScript引擎。与常规JavaScript引擎不同的是,V8引擎引入了JIT编译(Just-In-Time compilation)方式,在运行时把JavaScript代码转换为高效的机器码,而不再依赖于解释器去执行。由此,提高了JavaScript代码的执行性能。
虽然V8引擎在一定程度上提升了JavaScript代码的执行性能,但在实际应用中技术人员在想要实现某种功能时却可能采用其它编程语言如,C语言、C++语言、Java语言等等,再将其转换为JavaScript代码通过V8引擎实现。这种情况下,因这些其它编程语言并不能直接与JavaScript语言进行完全地转换和对接,一方面,造成编译项目整体性能较差;另一方面,也对技术人员提出了更高的不同代码间的转换能力要求。
发明内容
有鉴于此,本发明实施例提供一种数据处理方案,以至少部分解决上述问题。
根据本发明实施例的第一方面,提供了一种代码生成方法,包括:获取待进行语言转换的第一中间代码,对所述第一中间代码进行检测,获取所述第一中间代码中待进行安全点调用和/或待进行异常处理的调用点;对所述调用点进行标记,以将所述第一中间代码转换生成包括所述标记的第二中间代码。
根据本发明实施例的第二方面,提供了一种代码生成装置,包括:第一获取模块,用于获取待进行语言转换的第一中间代码;第二获取模块,用于对所述第一中间代码进行检测,获取所述第一中间代码中待进行安全点调用和/或待进行异常处理的调用点;生成模块,用于所述调用点进行标记,以将所述第一中间代码转换生成包括所述标记的第二中间代码。
根据本发明实施例的第三方面,提供了一种电子设备,包括:处理器、存储器、通信接口和通信总线,所述处理器、所述存储器和所述通信接口通过所述通信总线完成相互间的通信;所述存储器用于存放至少一可执行指令,所述可执行指令使所述处理器执行如第一方面所述的代码生成方法对应的操作。
根据本发明实施例的第四方面,提供了一种计算机存储介质,其上存储有计算机程序,该程序被处理器执行时实现如第一方面所述的代码生成方法。
根据本发明实施例提供的代码生成方案,在代码编译阶段获取到待进行语言转换的第一中间代码后,对该第一中间代码进行待进行安全点调用和/或待进行异常处理的调用点的检测,对检测到的调用点进行标记,并生成包括所述标记的第二中间代码。以在后续对该检测出的调用点对应的代码部分进行适应性处理,最终生成满足需求的目标代码。因中间代码与具体语言无关,且对待进行安全点调用和/或待进行异常处理的调用点进行标记后生成的第二中间代码,可以有效指出需要后续进行处理的点,由此使得后续生成的目标代码能够更好地与目标对象(如V8引擎)兼容。通过本发明实施例的方案,既提升了编译项目整体性能,又大大降低了对技术人员的代码转换能力的要求。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明实施例中记载的一些实施例,对于本领域普通技术人员来讲,还可以根据这些附图获得其他的附图。
图1为根据本发明实施例一的一种代码生成方法的步骤流程图;
图2为根据本发明实施例二的一种代码生成方法的步骤流程图;
图3为根据本发明实施例三的一种代码生成装置的结构框图;
图4为根据本发明实施例四的一种代码生成装置的结构框图;
图5为根据本发明实施例五的一种电子设备的结构示意图。
具体实施方式
为了使本领域的人员更好地理解本发明实施例中的技术方案,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅是本发明实施例一部分实施例,而不是全部的实施例。基于本发明实施例中的实施例,本领域普通技术人员所获得的所有其他实施例,都应当属于本发明实施例保护的范围。
下面结合本发明实施例附图进一步说明本发明实施例具体实现。
实施例一
参照图1,示出了根据本发明实施例一的一种代码生成方法的步骤流程图。
本实施例的代码生成方法包括以下步骤:
步骤S102:获取待进行语言转换的第一中间代码。
本发明实施例中,第一中间代码可以为任意的源代码经转换后的中间代码,例如,schedule后的turbofan IR。本发明实施例不对第一中间代码及第一中间代码来源的源代码的语言类型进行限定。
第一中间代码的获取可以通过任意适当的方式实现,如,LLVM的IR Builder。LLVM是构架编译器(compiler)的框架系统,用于优化以任意程序语言编写的程序的编译时间(compile-time)、链接时间(link-time)、运行时间(run-time)和空闲时间(idle-time),并兼容已有脚本。并且,LLVM提供了与语言无关的中间代码,因此,可将不同语言代码生成中间代码,从而实现通过LLVM将不同的语言相互连结起来。但不限于LLVM,其它与LLVM具有类似架构和功能的代码生成器同样适用本发明实施例的方案。Builder是用于简化LLVM指令生成的辅助对象,IRBuilder类模板的实例可用于跟踪当前插入指令的位置,同时还带有用于生成新指令的方法。因此,可以通过IRBuilder类实例化后生成的IRBuilder对象实现本实施例的方案。
中间代码是一种结构简单、含义明确的记号系统,这种记号系统复杂性介于源程序语言和机器语言之间,容易将它翻译成目标代码。另外,还可以在中间代码一级进行与机器无关的优化。
步骤S104:对所述第一中间代码进行检测,获取所述第一中间代码中待进行安全点调用和/或待进行异常处理的调用点。
因源代码与目标代码之间总具有一些不同之处或称为不兼容之处,因此,与源代码对应的第一中间代码,和,与目标代码对应的第二中间代码之间也同样存在不兼容之处。通过对第一中间代码的检测,可以从中确定不兼容之处,包括待进行安全点调用的调用点和待进行异常处理的调用点中的至少一者。
其中,进行安全点调用的调用点和待进行异常处理的调用点均可指示需后续进行代码转换过程中需特别关注的代码部分。待进行安全点调用的调用点可以指示需要通过代码生成器之外的调用函数对其进行处理的那部分第一中间代码;待进行异常处理的调用点可以指示需要对其进行异常处理的那部分第一中间代码。
对所述第一中间代码进行的检测可以由本领域技术人员根据实际应用中的编译器或代码生成器的情况采用相适应的方式实现,以第一中间代码为turbofan IR为例,在V8中,可以通过调用内置函数RecordWriteStub实现对turbofan IR中存在调用不需要安全点的函数的检测。该信息被IRBuilder检测获取后,可进行后续的标记及相应处理。
步骤S106:对所述调用点进行标记,以将所述第一中间代码转换生成包括所述标记的第二中间代码。
其中,对调用点的标记可以根据实际使用的代码生成器或编译器中的调用点实现,如,可以通过statepoint或者patchpoint实现。在后续生成的第二中间代码中,也会包含这些标记的信息。
所述标记对应有留白部分,以便于对所述标记所标示的调用点对应的第一中间代码部分进行相应处理。当代码生成器在代码生成阶段检测到所述标记时,会对留白部分也生成第二中间代码。
例如,第一中间代码中的代码段A被进行了标记,则该标记的元数据也会携带在第二中间代码中,后续在调用编译器对第二中间代码处理后会预输出本地代码及其元数据,该元数据中仍然包括所述标记的元数据。本领域技术人员可以根据该元数据获取待进行安全点调用的调用点和/或待进行异常处理的调用点的信息,进而根据需要设置具体的处理代码以进行相应的处理,如进行安全点调用的代码或进行异常处理的代码。其中,本发明实施例对所述具体的处理实现及其内容均不作限制。
根据本实施例,在代码编译阶段获取到待进行语言转换的第一中间代码后,对该第一中间代码进行待进行安全点调用和/或待进行异常处理的调用点的检测,对检测到的调用点进行标记,并生成包括所述标记的第二中间代码。以在后续对该检测出的调用点对应的代码部分进行适应性处理,最终生成满足需求的目标代码。因中间代码与具体语言无关,且对待进行安全点调用和/或待进行异常处理的调用点进行标记后生成的第二中间代码,可以有效指出需要后续进行处理的点,由此使得后续生成的目标代码能够更好地与目标对象(如V8引擎)兼容。通过本实施例的方案,既提升了编译项目整体性能,又大大降低了对技术人员的代码转换能力的要求。
本实施例的代码生成方法可以由任意适当的具有数据处理能力的电子设备执行,包括但不限于:服务器、移动终端(如手机、PAD等)和PC机等。
实施例二
参照图2,示出了根据本发明实施例二的一种代码生成方法的步骤流程图。
本实施例以通过IRBuilder对象将第一中间代码转换为第二中间代码后,交由LLVM预输出本地代码及其元数据后,再进行代码组合生成最终本地代码,进而输出至V8引擎的过程为例,对本发明实施例提供的代码生成方案进行说明。但本领域技术人员应当明了的是,在实际应用中,与IRBuilder对象、LLVM和V8引擎具有类似架构和功能的其它代码转换器、代码生成器和编译引擎等均可适用本发明实施例的方案。
基于此,本实施例的代码生成方法包括以下步骤:
步骤S202:获取待进行语言转换的第一中间代码。
本实施例中,设定所述第一中间代码为turbofan IR(turbofan生成的中间代码)。
在一种具体实现中,可以通过IRBuilder对象来获取所述第一中间代码。
步骤S204:对所述第一中间代码进行检测,获取所述第一中间代码中待进行安全点调用的调用点和/或待进行异常处理的调用点。
本步骤中,仍然通过IRBuilder对象实现对第一中间代码的检测和所述调用点的获取。其中,对第一中间代码进行检测以获取所述调用点的具体实现可以由本领域技术人员根据实际需要,通过在IRBuilder对象中设置任意适当的检测代码实现。
所述待进行安全点调用的调用点和/或待进行异常处理的调用点都是后续编译器如LLVM中的垃圾收集器判断调用栈上哪些值需要关注的依据。
例如,V8引擎支持的JS函数的调用必须带有安全点信息,绝大部分的内置函数也需要安全点信息。这些安全点可以由IRBuilder对象通过调用一个叫做liveness analysis的pass来分析出哪些值在调用点之后仍然需要来决定。这些调用点即为待进行安全点调用的调用点。在另外一些诸如调用了c函数,而且这个c函数不会改变JS堆的调用被认为是不需要安全点的调用点,其对应于待进行异常处理的调用点。
除进行上述调用点的检测外,在一种可行方式中,还可以获取未被存储数据的至少一个寄存器的信息,并从中选择一个寄存器用于存储从所述第一中间代码到所述第二中间代码的转换过程中的参数。该过程为可选执行过程,可以在本步骤S204执行之前或之后执行或与本步骤S204并行执行。所述寄存器用于存储后续代码转换过程中所需的参数,可以在该寄存器中设置堆栈,以通过堆栈形式实现代码转换过程中的数据存入和读出。
步骤S206:对所述调用点进行标记,以将所述第一中间代码转换生成包括所述标记的第二中间代码。
在一种可行方式中,本步骤可以实现为:对所述调用点进行标记,并获取被标记的调用点的位置信息;根据所述标记和所述位置信息生成第二中间代码。通过这种方式,可以更为明确地标示出需要关注的调用点。
本步骤仍然可以由IRBuilder对象实现,此种情况下,对所述调用点进行标记可以实现为:使用statepoint或者patchpoint对所述调用点进行标记。在进行标记后,还可以生成对应的位置信息,如与statepoint或者patchpoint对应的stack maps(栈映射),以指明在哪个位置需要后续代码组合阶段对留白部分生成代码。这些标记和位置信息都会被包含进生成的第二中间代码中。
通过IRBuilder对象,可以调用LLVM中提供的statepoint或者patchpoint对调用点进行标记。LLVM中为statepoint提供了固有函数,statepoint固有函数代表一个可由运行时解析的调用。statepoint固有函数的操作数id是一个整数常量,它被描述为生成栈映射中的ID域。LLVM不解释这个参数,其含义由statepoint的使用者决定。利用statepoint或patchpoint与stack maps的映射关系,可以获取调用点的位置信息,以便进行后续的转换操作。在一种可行方式中,可以使用LLVM的GC的relocate操作数获取所述位置信息。
例如,假设对turbofan IR(turbofan生成的中间代码)的代码段A的检测后,通过statepoint(需要安全点调用情况下)或patchpoint(不需要安全点调用情况下)在相应代码部分生成支持安全点、异常处理的调用。并且,生成与statepoint或patchpoint对应的stack maps(栈映射),以指明在哪个位置需要LLVM在代码组合阶段对留白部分生成第二中间代码。
上述过程中,statepoint和patchpoint均为LLVM的IR(中间代码),需要在IR转换时生成。而代码组合阶段则对已经生成完毕的本地代码,根据编译器提供的元数据,进行一定的修改。比如编译器通过stack maps信息指出某个偏移是个调用留白。那么,就需要对留白部分补充压栈和调用指令。
在具体实现对所述调用点进行标记,生成包括所述标记的第二中间代码的一种可行方式中,本步骤可以实现为:对所述调用点进行标记,并调用代码生成函数对包括所述标记的第一中间代码进行生成所述第二中间代码的处理,其中,所述代码生成函数中包括至少一个执行函数;在所述处理过程中,判断当前执行函数中是否存在预设的用于指示尾调用的操作数;若存在,则获取当前执行函数的执行结果,并根据所述执行结果生成所述第二中间代码。
代码生成函数是用于识别不同的第一中间代码并将该第一中间代码转换为第二中间代码的函数,其可包括一个或多个(两个及两个以上)执行函数,以保证从第一中间代码到第二中间代码的顺利转换。显然,第一中间代码和第二中间代码为不同的中间代码(IR)。需要说明的是,本发明实施例中,不对代码生成函数的具体实现进行限制,本领域技术人员可以采用任意适当的方式实现所述代码生成函数或者使用本身即具有相应的上述代码转换功能的代码生成函数的代码生成器。
在函数的执行过程中,如果最后一个动作是一个函数的调用,即这个调用的返回值被当前函数直接返回,则称为尾调用。通过尾调用,不会在调用栈上增加新的堆栈帧,而是直接更新调用栈,调用栈所占空间始终是常量,节省了内存,避免了爆栈的可能性。
例如,V8引擎要求必须设置尾调用,为此,本实施例中设定了用于指示尾调用的操作数,该操作数具有调用属性和返回属性。其中,调用属性用于指示把该操作数对应的指令当作调用,而返回属性则用于指示把该操作数对应的指令当作返回,可选地,还可以返回当前函数调用的值。
在一个可行示例中,可以定义新的操作数TCPATCHPOINT,用于支持强制的尾调用。此操作数既有调用属性也有返回属性,LLVM将在包含此操作数的代码前插入函数退出指令。
此外,若在之前的操作中选择了一个未存储数据的寄存器,则可选地,可以在使用代码生成函数对第一中间代码进行转换的过程中,获取需要进行存储的参数,并根据所述参数的获取顺序将所述参数压栈至选择的寄存器的堆栈中。
例如,可以为LLVM设置新的调用约定,把代码转换过程中需要压栈的参数放在没有被使用的寄存器参数上,在代码组合阶段生成压栈代码压栈。LLVM没有实现强制尾调用。一旦发现尾调用需要压栈,立刻放弃尾调用的属性,放在游离的寄存器上面,可以在另外一个模块里面完成最终想要的代码。也就是在代码组合阶段生成压栈代码压栈。
步骤S208:将第二中间代码输出至编译器,通过编译器预输出本地代码和预输出的本地代码的元数据。
其中,所述元数据中包含所述标记的信息,所述本地代码为可以执行的机器码。
本步骤中,可以由IRBuilder对象将第二中间代码输出至编译器如LLVM MC JITcompiler,由LLVM MC JIT compiler对其进行处理后预输出本地代码和预输出的本地代码的元数据。其中,所述元数据中包括与所述标记对应的元数据。本发明实施例中,不对LLVMMC JIT compiler对第二中间代码的处理过程及预输出的本地代码及其元数据的具体获取手段进行限制。
步骤S210:根据预输出的本地代码和所述元数据,进行代码组合;根据代码组合结果,生成可执行本地代码、安全点表、和异常处理表。
在LLVM MC JIT compiler预输出本地代码及其元数据后,即可进入代码组合阶段。
在该阶段,可以控制程序:(1)根据预输出的本地代码和与该本地代码对应的元数据生成最终的本地代码(可执行的机器码);(2)可以为(1)中生成的本地代码中的待进行异常处理的调用点设置异常处理规则;根据所述异常处理的调用点及所述异常处理规则的信息,生成异常处理表;(3)收集(1)中生成的本地代码中的安全点的信息(如根据stack maps的指引收集安全点信息),进而生成安全点表。
其中,本发明实施例不对(1)的具体实现进行限制。
对于(2),可以从(1)中生成的最终的本地代码的元数据中获得的待进行异常处理的调用点的信息,进而对其进行设置异常处理规则。
异常处理被设计来从LLVM正常使用中很少发生的情形中恢复,为了达到这个目的,通过执行检查点任务,比如保存当前pc或寄存器状态,来实现异常检测和异常信息获取。但不限于此,还可以exceptional basic block语句的方式定义异常。
在确定了待进行异常处理的调用点后,即可为其设置异常处理规则。在LLVM中,LLVM使用一些固有函数(以llvm.eh为前缀),在生成代码的各处,提供异常处理信息。例如,llvm.eh.begincatch函数、llvm.eh.endcatch函数、llvm.eh.exceptionpointer函数、llvm.eh.sjlj.setjmp函数、llvm.eh.sjlj.longjmp函数,等等。其中,针对不同待进行异常处理的调用点设置的具体异常处理可以由本领域技术人员根据实际需求适当设置,本发明实施例对此不作限制。
通过生成的异常处理表,可以为待进行异常处理的调用点的有效管理并方便后续的处理操作。通过获取待进行异常处理的调用点并为其设置异常处理规则,保证了对代码转换过程中异常的有效处理,且可保证代码转换的顺利进行。
对于(3),可以从(1)中生成的最终的本地代码的元数据中获得的待进行安全点调用的调用点的信息,进而根据需要对其进行设置相应的调用处理。
通过上述过程,输入turbofan IR,经过IR builder把turbofan IR转换为LLVMIR。然后,通过LLVM MC JIT Compiler预输出本地代码及其元数据。然后,进入代码组合(Code Assembling)阶段,在该阶段,可以对该预输出的本地代码和元数据进行组合生成可以执行的本地代码。此外,在该阶段,还可以将stack maps段和异常表段与前述生成的可执行的本地代码组合,生成最后的代码。其中,stack maps可以描述函数特性的元数据,其描述了函数的名称、栈大小,以及patchpoint和/或statepoint的元数据表数组等。异常表是另外一种元数据表,用于描述哪个异常需要异常处理,调用从哪里开始、哪里结束,发生异常的时候降落到哪里等。可见,最后生成的代码中除包括可执行的本地代码外,还可以包括patchpoint的信息、statepoint的信息、存在异常的调用点(即待进行异常处理的调用点)的信息,以及对存在异常的调用点的异常处理信息,等等。
步骤S212:将可执行本地代码、安全点表、和异常处理表输出至目标对象。
在一种可行方式中,可以将可执行本地代码、安全点表、和异常处理表输出至V8引擎。
V8引擎可以根据安全点表实现相应的安全点调用,根据异常处理表实现对需要进行异常处理的代码的处理,进而,结合可执行本地代码形成V8引擎可执行的代码。
通过上述过程,可以实现从turbofan IR到LLVM IR再到V8引擎可执行的代码的转换,优化了整个编译流程,且提高了内置函数的代码质量。
根据本实施例,在代码编译阶段获取到待进行语言转换的第一中间代码后,对该第一中间代码进行待进行安全点调用和/或待进行异常处理的调用点的检测,对检测到的调用点进行标记,并生成包括所述标记的第二中间代码。以在后续对该检测出的调用点对应的代码进行适应性处理,最终生成满足需求的目标代码。因中间代码与具体语言无关,且对待进行安全点调用和/或待进行异常处理的调用点进行标记后生成的第二中间代码,可以有效指出需要后续进行处理的点,由此使得后续生成的目标代码能够更好地与目标对象(如V8引擎)兼容。通过本实施例的方案,既提升了编译项目整体性能,又大大降低了对技术人员的代码转换能力的要求。
本实施例的代码生成方法可以由任意适当的具有数据处理能力的电子设备执行,包括但不限于:服务器、移动终端(如手机、PAD等)和PC机等。
实施例三
参照图3,示出了根据本发明实施例三的一种代码生成装置的结构框图。
本实施例的代码生成装置包括:第一获取模块302,用于获取待进行语言转换的第一中间代码;第二获取模块304,用于对所述第一中间代码进行检测,获取所述第一中间代码中待进行安全点调用和/或待进行异常处理的调用点;生成模块306,用于对所述调用点进行标记,以将所述第一中间代码转换生成包括所述标记的第二中间代码。
本实施例的代码生成装置用于实现前述多个方法实施例中相应的代码生成方法,并具有相应的方法实施例的有益效果,在此不再赘述。此外,本实施例的代码生成装置中的各个模块的功能实现均可参照前述方法实施例中的相应部分的描述,在此亦不再赘述。
实施例四
参照图4,示出了根据本发明实施例四的一种代码生成装置的结构框图。
本实施例的代码生成装置包括:第一获取模块402,用于获取待进行语言转换的第一中间代码;第二获取模块404,用于对所述第一中间代码进行检测,获取所述第一中间代码中待进行安全点调用和/或待进行异常处理的调用点;生成模块406,用于对所述调用点进行标记,以将所述第一中间代码转换生成包括所述标记的第二中间代码。
可选地,所述生成模块406,用于对所述调用点进行标记,并获取被标记的调用点的位置信息;根据所述标记和所述位置信息,将所述第一中间代码转换生成第二中间代码。
可选地,所述生成模块406,用于对所述调用点进行标记,并调用代码生成函数对包括所述标记的第一中间代码进行生成所述第二中间代码的处理,其中,所述代码生成函数中包括至少一个执行函数;在所述处理过程中,判断当前执行函数中是否存在预设的用于指示尾调用的操作数;若存在,则获取当前执行函数的执行结果,并根据所述执行结果生成所述第二中间代码。
可选地,所述操作数具有调用属性和返回属性。
可选地,本实施例的代码生成装置还包括:第三获取模块408,用于在所述生成模块406将所述第一中间代码转换生成包括所述标记的第二中间代码之前,获取未被存储数据的至少一个寄存器的信息,并从中选择一个寄存器用于存储从所述第一中间代码到所述第二中间代码的转换过程中的参数。
可选地,本实施例的代码生成装置还包括:压栈模块410,用于在所述转换过程中,获取需要进行存储的参数,并根据所述参数的获取顺序将所述参数压栈至选择的所述寄存器的堆栈中。
可选地,本实施例的代码生成装置还包括:第一输出模块412,用于将第二中间代码输出至编译器,通过编译器预输出本地代码和预输出的本地代码的元数据,其中,所述元数据中包含所述标记的信息。
可选地,本实施例的代码生成装置还包括:组合模块414,用于根据预输出的所述本地代码和所述元数据,进行代码组合;根据代码组合结果,生成可执行本地代码、安全点表、和异常处理表。
可选地,所述编译器为LLVM,本实施例的代码生成装置还包括:第二输出模块416,用于将可执行本地代码、安全点表和异常处理表输出至V8引擎。
可选地,所述生成模块406,用于使用statepoint或者patchpoint对所述调用点进行标记,以生成包括所述标记的第二中间代码。
本实施例的代码生成装置用于实现前述多个方法实施例中相应的代码生成方法,并具有相应的方法实施例的有益效果,在此不再赘述。此外,本实施例的代码生成装置中的各个模块的功能实现均可参照前述方法实施例中的相应部分的描述,在此亦不再赘述。
实施例五
参照图5,示出了根据本发明实施例五的一种电子设备的结构示意图,本发明具体实施例并不对电子设备的具体实现做限定。
如图5所示,该电子设备可以包括:处理器(processor)502、通信接口(Communications Interface)504、存储器(memory)506、以及通信总线508。
其中:
处理器502、通信接口504、以及存储器506通过通信总线508完成相互间的通信。
通信接口504,用于与其它电子设备或服务器进行通信。
处理器502,用于执行程序510,具体可以执行上述代码生成方法实施例中的相关步骤。
具体地,程序510可以包括程序代码,该程序代码包括计算机操作指令。
处理器52可能是中央处理器CPU,或者是特定集成电路ASIC(ApplicationSpecific Integrated Circuit),或者是被配置成实施本发明实施例的一个或多个集成电路。智能设备包括的一个或多个处理器,可以是同一类型的处理器,如一个或多个CPU;也可以是不同类型的处理器,如一个或多个CPU以及一个或多个ASIC。
存储器506,用于存放程序510。存储器506可能包含高速RAM存储器,也可能还包括非易失性存储器(non-volatilememory),例如至少一个磁盘存储器。
程序510具体可以用于使得处理器502执行以下操作:获取待进行语言转换的第一中间代码;对所述第一中间代码进行检测,获取所述第一中间代码中待进行安全点调用的调用点和/或待进行异常处理的调用点;对所述调用点进行标记,以将所述第一中间代码转换生成包括所述标记的第二中间代码。
在一种可选的实施方式中,程序510还用于使得处理器502在对所述调用点进行标记,以将所述第一中间代码转换生成包括所述标记的第二中间代码时,对所述调用点进行标记,并获取被标记的调用点的位置信息;根据所述标记和所述位置信息,将所述第一中间代码转换生成的第二中间代码。
在一种可选的实施方式中,程序510还用于使得处理器502在对所述调用点进行标记,将所述第一中间代码转换生成包括所述标记的第二中间代码时,对所述调用点进行标记,并调用代码生成函数对包括所述标记的第一中间代码进行生成所述第二中间代码的处理,其中,所述代码生成函数中包括至少一个执行函数;在所述处理过程中,判断当前执行函数中是否存在预设的用于指示尾调用的操作数;若存在,则获取当前执行函数的执行结果,并根据所述执行结果生成所述第二中间代码。
在一种可选的实施方式中,所述操作数具有调用属性和返回属性。
在一种可选的实施方式中,程序510还用于使得处理器502在将所述第一中间代码转换生成包括所述标记的第二中间代码之前,获取未被存储数据的至少一个寄存器的信息,并从中选择一个寄存器用于存储从所述第一中间代码到所述第二中间代码的转换过程中的参数。
在一种可选的实施方式中,程序510还用于使得处理器502在所述转换过程中,获取需要进行存储的参数,并根据所述参数的获取顺序将所述参数压栈至选择的所述寄存器的堆栈中。
在一种可选的实施方式中,程序510还用于使得处理器502将所述第二中间代码输出至编译器,通过所述编译器预输出本地代码和预输出的本地代码的元数据,其中,所述元数据中包含所述标记的信息。
在一种可选的实施方式中,程序510还用于使得处理器502根据预输出的所述本地代码和所述元数据,进行代码组合;根据代码组合结果,生成可执行本地代码、安全点表、和异常处理表。
在一种可选的实施方式中,所述代码生成器为LLVM,程序510还用于将可执行本地代码、安全点表和异常处理表输出至V8引擎。
在一种可选的实施方式中,程序510还用于使得处理器502在对所述调用点进行标记时,使用statepoint或者patchpoint对所述调用点进行标记。
程序510中各步骤的具体实现可以参见上述代码生成方法实施例中的相应步骤和单元中对应的描述,在此不赘述。所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的设备和模块的具体工作过程,可以参考前述方法实施例中的对应过程描述,在此不再赘述。
通过本实施例的电子设备,在代码编译阶段获取到待进行语言转换的第一中间代码后,对该第一中间代码进行待进行安全点调用和/或待进行异常处理的调用点的检测,对检测到的调用点进行标记,并生成包括所述标记的第二中间代码。以在后续对该检测出的调用点对应的代码部分进行适应性处理,最终生成满足需求的目标代码。因中间代码与具体语言无关,且对待进行安全点调用和/或待进行异常处理的调用点进行标记后生成的第二中间代码,可以有效指出需要后续进行处理的点,由此使得后续生成的目标代码能够更好地与目标对象(如V8引擎)兼容。通过本实施例的电子设备,既提升了编译项目整体性能,又大大降低了对技术人员的代码转换能力的要求。
需要指出,根据实施的需要,可将本发明实施例中描述的各个部件/步骤拆分为更多部件/步骤,也可将两个或多个部件/步骤或者部件/步骤的部分操作组合成新的部件/步骤,以实现本发明实施例的目的。
上述根据本发明实施例的方法可在硬件、固件中实现,或者被实现为可存储在记录介质(诸如CD ROM、RAM、软盘、硬盘或磁光盘)中的软件或计算机代码,或者被实现通过网络下载的原始存储在远程记录介质或非暂时机器可读介质中并将被存储在本地记录介质中的计算机代码,从而在此描述的方法可被存储在使用通用计算机、专用处理器或者可编程或专用硬件(诸如ASIC或FPGA)的记录介质上的这样的软件处理。可以理解,计算机、处理器、微处理器控制器或可编程硬件包括可存储或接收软件或计算机代码的存储组件(例如,RAM、ROM、闪存等),当所述软件或计算机代码被计算机、处理器或硬件访问且执行时,实现在此描述的代码生成方法。此外,当通用计算机访问用于实现在此示出的代码生成方法的代码时,代码的执行将通用计算机转换为用于执行在此示出的代码生成方法的专用计算机。
本领域普通技术人员可以意识到,结合本文中所公开的实施例描述的各示例的单元及方法步骤,能够以电子硬件、或者计算机软件和电子硬件的结合来实现。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本发明实施例的范围。
以上实施方式仅用于说明本发明实施例,而并非对本发明实施例的限制,有关技术领域的普通技术人员,在不脱离本发明实施例的精神和范围的情况下,还可以做出各种变化和变型,因此所有等同的技术方案也属于本发明实施例的范畴,本发明实施例的专利保护范围应由权利要求限定。
Claims (22)
1.一种代码生成方法,包括:
获取待进行语言转换的第一中间代码;
对所述第一中间代码进行检测,获取所述第一中间代码中待进行安全点调用的调用点和/或待进行异常处理的调用点;
对所述调用点进行标记,以将所述第一中间代码转换生成包括所述标记的第二中间代码。
2.根据权利要求1所述的方法,其中,所述对所述调用点进行标记,以将所述第一中间代码转换生成包括所述标记的第二中间代码,包括:
对所述调用点进行标记,并获取被标记的调用点的位置信息;
根据所述标记和所述位置信息,将所述第一中间代码转换生成所述第二中间代码。
3.根据权利要求1或2所述的方法,其中,所述对所述调用点进行标记,以将所述第一中间代码转换生成包括所述标记的第二中间代码,包括:
对所述调用点进行标记,并调用代码生成函数对包括所述标记的第一中间代码进行生成所述第二中间代码的处理,其中,所述代码生成函数中包括至少一个执行函数;
在所述处理过程中,判断当前执行函数中是否存在预设的用于指示尾调用的操作数;
若存在,则获取当前执行函数的执行结果,并根据所述执行结果生成所述第二中间代码。
4.根据权利要求3所述的方法,其中,所述操作数具有调用属性和返回属性。
5.根据权利要求1所述的方法,其中,在所述以将所述第一中间代码转换生成包括所述标记的第二中间代码之前,所述方法还包括:
获取未被存储数据的至少一个寄存器的信息,并从中选择一个寄存器用于存储从所述第一中间代码到所述第二中间代码的转换过程中的参数。
6.根据权利要求5所述的方法,其中,所述方法还包括:
在所述转换过程中,获取需要进行存储的参数,并根据所述参数的获取顺序将所述参数压栈至选择的所述寄存器的堆栈中。
7.根据权利要求1-6任一项所述的方法,其中,所述方法还包括:
将所述第二中间代码输出至编译器,通过所述编译器预输出本地代码和预输出的本地代码的元数据,其中,所述元数据中包含所述标记的信息。
8.根据权利要求7所述的方法,其中,所述方法还包括:
根据预输出的所述本地代码和所述元数据,进行代码组合;
根据代码组合结果,生成可执行本地代码、安全点表、和异常处理表。
9.根据权利要求8所述的方法,其中,所述编译器为LLVM,所述方法还包括:
将所述可执行本地代码、安全点表和异常处理表输出至V8引擎。
10.根据权利要求9所述的方法,其中,所述对所述调用点进行标记,包括:
使用statepoint或者patchpoint对所述调用点进行标记。
11.一种代码生成装置,包括:
第一获取模块,用于获取待进行语言转换的第一中间代码;
第二获取模块,用于对所述第一中间代码进行检测,获取所述第一中间代码中待进行安全点调用和/或待进行异常处理的调用点;
生成模块,用于对所述调用点进行标记,以将所述第一中间代码转换生成包括所述标记的第二中间代码。
12.根据权利要求11所述的装置,其中,所述生成模块,用于对所述调用点进行标记,并获取被标记的调用点的位置信息;根据所述标记和所述位置信息,将所述第一中间代码转换生成所述第二中间代码。
13.根据权利要求11或12所述的装置,其中,所述生成模块,用于对所述调用点进行标记,并调用代码生成函数对包括所述标记的第一中间代码进行生成所述第二中间代码的处理,其中,所述代码生成函数中包括至少一个执行函数;在所述处理过程中,判断当前执行函数中是否存在预设的用于指示尾调用的操作数;若存在,则获取当前执行函数的执行结果,并根据所述执行结果生成所述第二中间代码。
14.根据权利要求13所述的装置,其中,所述操作数具有调用属性和返回属性。
15.根据权利要求11所述的装置,其中,所述装置还包括:
第三获取模块,用于在所述生成模块将所述第一中间代码转换生成包括所述标记的第二中间代码之前,获取未被存储数据的至少一个寄存器的信息,并从中选择一个寄存器用于存储从所述第一中间代码到所述第二中间代码的转换过程中的参数。
16.根据权利要求15所述的装置,其中,所述装置还包括:
压栈模块,用于在所述转换过程中,获取需要进行存储的参数,并根据所述参数的获取顺序将所述参数压栈至选择的所述寄存器的堆栈中。
17.根据权利要求11-16任一项所述的装置,其中,所述装置还包括:
第一输出模块,用于将所述第二中间代码输出至编译器,通过所述编译器预输出本地代码和预输出的本地代码的元数据,其中,所述元数据中包含所述标记的信息。
18.根据权利要求17所述的装置,其中,所述装置还包括:
组合模块,用于根据预输出的所述本地代码和所述元数据,进行代码组合;根据代码组合结果,生成可执行本地代码、安全点表、和异常处理表。
19.根据权利要求18所述的装置,其中,所述编译器为LLVM,所述装置还包括:
第二输出模块,用于将所述可执行本地代码、安全点表和异常处理表输出至V8引擎。
20.根据权利要求19所述的装置,其中,所述生成模块,用于使用statepoint或者patchpoint对所述调用点进行标记,以生成包括所述标记的第二中间代码。
21.一种电子设备,包括:处理器、存储器、通信接口和通信总线,所述处理器、所述存储器和所述通信接口通过所述通信总线完成相互间的通信;
所述存储器用于存放至少一可执行指示,所述可执行指示使所述处理器执行如权利要求1-10中任一项所述的代码生成方法对应的操作。
22.一种计算机存储介质,其上存储有计算机程序,该程序被处理器执行时实现如权利要求1-10中任一所述的代码生成方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910339617.9A CN111857678B (zh) | 2019-04-25 | 2019-04-25 | 代码生成方法、装置、电子设备及计算机存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910339617.9A CN111857678B (zh) | 2019-04-25 | 2019-04-25 | 代码生成方法、装置、电子设备及计算机存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN111857678A true CN111857678A (zh) | 2020-10-30 |
CN111857678B CN111857678B (zh) | 2024-05-31 |
Family
ID=72951487
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201910339617.9A Active CN111857678B (zh) | 2019-04-25 | 2019-04-25 | 代码生成方法、装置、电子设备及计算机存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN111857678B (zh) |
Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
KR980010760A (ko) * | 1996-07-23 | 1998-04-30 | 양승택 | 목표 프로세서용 어셈블리 코드 생성기를 작성하는 방법 |
CN1468398A (zh) * | 2000-08-08 | 2004-01-14 | 国际商业机器公司 | 包括c/c++元模型在内的通用应用程序元模型 |
US20050071834A1 (en) * | 2003-09-30 | 2005-03-31 | Gates Frank G. | Generating executable code based on code performance data |
JP2005196806A (ja) * | 2005-03-04 | 2005-07-21 | Dainippon Printing Co Ltd | 文字コード変換システム |
CN103064720A (zh) * | 2011-09-09 | 2013-04-24 | 微软公司 | 简档导向的jit代码生成 |
CN104866765A (zh) * | 2015-06-03 | 2015-08-26 | 康绯 | 基于行为特征相似性的恶意代码同源性分析方法 |
US20170109146A1 (en) * | 2015-10-15 | 2017-04-20 | International Business Machines Corporation | Modifying execution flow in save-to-return code scenarios |
-
2019
- 2019-04-25 CN CN201910339617.9A patent/CN111857678B/zh active Active
Patent Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
KR980010760A (ko) * | 1996-07-23 | 1998-04-30 | 양승택 | 목표 프로세서용 어셈블리 코드 생성기를 작성하는 방법 |
CN1468398A (zh) * | 2000-08-08 | 2004-01-14 | 国际商业机器公司 | 包括c/c++元模型在内的通用应用程序元模型 |
US20050071834A1 (en) * | 2003-09-30 | 2005-03-31 | Gates Frank G. | Generating executable code based on code performance data |
JP2005196806A (ja) * | 2005-03-04 | 2005-07-21 | Dainippon Printing Co Ltd | 文字コード変換システム |
CN103064720A (zh) * | 2011-09-09 | 2013-04-24 | 微软公司 | 简档导向的jit代码生成 |
CN104866765A (zh) * | 2015-06-03 | 2015-08-26 | 康绯 | 基于行为特征相似性的恶意代码同源性分析方法 |
US20170109146A1 (en) * | 2015-10-15 | 2017-04-20 | International Business Machines Corporation | Modifying execution flow in save-to-return code scenarios |
Non-Patent Citations (2)
Title |
---|
何东: "反编译中数据类型重构技术研究", 中国优秀硕士学位论文全文数据库, no. 6 * |
李超: "Windows下C/C++程序的静态分析技术", 中国优秀硕士学位论文全文数据局, no. 3 * |
Also Published As
Publication number | Publication date |
---|---|
CN111857678B (zh) | 2024-05-31 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN105183592B (zh) | 用于支持性能分析的方法和装置 | |
CN111427583A (zh) | 组件的编译方法、装置和电子设备及计算机可读存储介质 | |
CN110502520B (zh) | 一种数据入库的方法、系统、设备及计算机可读存储介质 | |
CN111913741B (zh) | 对象拦截方法、装置、介质及电子设备 | |
CN111831384A (zh) | 语言切换方法和装置、设备及存储介质 | |
CN113961196A (zh) | 一种自动生成代码方法、装置、设备及可读存储介质 | |
CN110457013B (zh) | 程序组件配置装置及方法 | |
CN115686606A (zh) | 一种项目依赖树的展示方法、装置、系统及介质 | |
CN111309332A (zh) | 文件内容按需加载方法、装置及电子设备、存储介质 | |
CN113687833B (zh) | 混合编译方法、混合编译系统、编译器及存储介质 | |
CN113703779B (zh) | 一种跨平台的多语言编译方法和超轻量物联网虚拟机 | |
CN111596970B (zh) | 动态库延迟加载方法、装置、设备和存储介质 | |
CN111158665B (zh) | 代码生成方法及装置、电子设备和存储介质 | |
CN111857678B (zh) | 代码生成方法、装置、电子设备及计算机存储介质 | |
CN107643892B (zh) | 接口处理方法、装置、存储介质和处理器 | |
CN109509467B (zh) | 代码生成方法及装置 | |
CN111367937B (zh) | 一种数据处理方法和装置 | |
CN112394972B (zh) | 一种云应用发布方法、装置、设备及存储介质 | |
CN109117176B (zh) | 一种基于主机的版本自动部署方法及系统 | |
CN112181486A (zh) | 一种数据处理的方法、装置和存储介质 | |
CN117270838B (zh) | 一种通用公式脚本的生成方法、装置、设备及介质 | |
CN110704055B (zh) | 接口前置的优化方法、装置、电子设备及存储介质 | |
CN114721665A (zh) | 一种网页代码生成方法、装置、电子设备及存储介质 | |
CN116126347B (zh) | 一种低代码应用程序的文件编译系统和方法 | |
CN117111933A (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 | ||
TA01 | Transfer of patent application right | ||
TA01 | Transfer of patent application right |
Effective date of registration: 20240103 Address after: Room 508, floor 5, building 4, No. 699, Wangshang Road, Changhe street, Binjiang District, Hangzhou City, Zhejiang Province Applicant after: Alibaba (China) Co.,Ltd. Address before: A four-storey 847 mailbox in Grand Cayman Capital Building, British Cayman Islands Applicant before: ALIBABA GROUP HOLDING Ltd. |
|
GR01 | Patent grant | ||
GR01 | Patent grant |