CN114237612A - 程序代码的编译方法、装置、电子设备及存储介质 - Google Patents
程序代码的编译方法、装置、电子设备及存储介质 Download PDFInfo
- Publication number
- CN114237612A CN114237612A CN202111470696.0A CN202111470696A CN114237612A CN 114237612 A CN114237612 A CN 114237612A CN 202111470696 A CN202111470696 A CN 202111470696A CN 114237612 A CN114237612 A CN 114237612A
- Authority
- CN
- China
- Prior art keywords
- instruction
- constant
- program code
- compiling
- floating point
- 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 58
- 230000015654 memory Effects 0.000 claims description 18
- 238000006243 chemical reaction Methods 0.000 claims description 11
- 238000004590 computer program Methods 0.000 claims description 9
- 230000009467 reduction Effects 0.000 claims description 9
- 230000008569 process Effects 0.000 description 14
- 230000006870 function Effects 0.000 description 8
- 238000010586 diagram Methods 0.000 description 5
- 230000008901 benefit Effects 0.000 description 4
- 238000004458 analytical method Methods 0.000 description 3
- 101100108649 Schizosaccharomyces pombe (strain 972 / ATCC 24843) alp14 gene Proteins 0.000 description 2
- 238000013507 mapping Methods 0.000 description 2
- 230000003287 optical effect Effects 0.000 description 2
- 238000004364 calculation method Methods 0.000 description 1
- 238000005516 engineering process Methods 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 230000003068 static effect Effects 0.000 description 1
- 238000006467 substitution reaction 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
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
本申请提供的程序代码的编译方法、装置、电子设备及存储介质,应用于计算机技术领域,所述方法包括:在获取到包含目标常量的程序代码时,在指令描述文件中查询与所述程序代码相匹配的指令选择模板,所述目标常量是预先定义为架构支持类型的常量;通过所述指令选择模板相对应的常量处理指令对所述程序代码进行编译,得到汇编代码,所述汇编代码的可执行文件在被执行时通过所述常量处理指令加载所述目标常量。本方案节省了从常量池中加载目标常量的访存指令,减少了涉及常量的程序在执行时对于处理器性能的消耗。
Description
技术领域
本申请属于计算机技术领域,特别是涉及一种程序代码的编译方法、装置、电子设备及存储介质。
背景技术
在程序编写和编译过程中会出现各种各样用到常量数据的场景,而编译器针对这些场景在不同处理器架构上采用不同的方案会生成不同的指令,进而编译出来的程序的性能也不同。
而相关技术中的编译器对于涉及常量操作处理的程序代码进行编译后在执行时,通常是通过访存指令从相应的内存地址中将常量数据放入常量池中,然后需要使用常量时,再从常量池中读取,若还需要对常量数据进行处理,则还需要增加对于常量数据的处理指令,整个过程不仅指令繁多,而且涉及到访存指令,对于处理器性能的消耗较大。
发明内容
有鉴于此,本申请实施例提出一种程序代码的编译方法、装置、电子设备及存储介质,用于尽可能解决现有技术中对于涉及常量操作处理的程序代码进行编译后在执行时,指令繁多,而且涉及到访存指令,对于处理器性能的消耗较大的问题。
本申请提供一种程序代码的编译方法,所述方法包括:
在获取到包含目标常量的程序代码时,在指令描述文件中查询与所述程序代码相匹配的指令选择模板,所述目标常量是预先定义为架构支持类型的常量;
通过所述指令选择模板相对应的常量处理指令对所述程序代码进行编译,得到汇编代码,所述汇编代码的可执行文件在被执行时通过所述常量处理指令加载所述目标常量。
可选地,所述在指令描述文件中查询与所述程序代码相匹配的指令选择模板,包括:
遍历指令描述文件,查询所描述的数据操作方式与所述程序代码相同的指令选择模板。
可选地,在所述数据操作方式为取浮点数倒数操作方式时,所述目标常量包括:浮点数;
所述通过所述指令选择模板相对应的常量处理指令对所述程序代码进行编译,得到汇编代码,包括:
通过指令选择模板相对应的常量处理指令,将所述浮点数和所述程序代码中的变量数据进行编译,得到汇编代码。
可选地,所述常量处理指令包括:架构预设的取浮点数倒数处理指令;
所述通过指令选择模板相对应的常量处理指令,将所述浮点数和所述程序代码中的变量数据进行编译,得到汇编代码,包括:
将所述程序代码中的变量数据添加到所述取浮点数倒数处理指令中,得到汇编代码。
可选地,所述常量处理指令包括:浮点数除法指令,所述通过指令选择模板相对应的常量处理指令,将所述浮点数和所述程序代码中的变量数据进行编译,得到汇编代码,包括:
将浮点数除法指令编译为浮点数1.0除以所述程序代码中变量数据的形式,得到汇编代码。
可选地,在所述数据操作方式为取浮点数立即数操作方式时,所述目标常量包括:整数,所述常量处理指令包括整数到浮点数转换指令;
所述通过所述指令选择模板相对应的常量处理指令对所述程序代码进行编译,得到汇编代码,包括:
将所述整数添加到所述整数到浮点数转换指令中,得到汇编代码。
可选地,在所述在获取到包含目标常量的程序代码时,在指令描述文件中查询与所述程序代码相匹配的指令选择模板之前,所述方法还包括:
获取包含有所述指令选择模板的所述指令描述文件;
在所述指令选择模板中存在常量时,通过编译器预设的降低接口将所述常量定义为架构支持类型的目标常量;
重新构建所述编译器。
依据本申请第二方面,提供一种程序代码的编译装置,所述装置包括:
输入模块,用于在获取到包含目标常量的程序代码时,在指令描述文件中查询与所述程序代码相匹配的指令选择模板,所述目标常量是预先定义为架构支持类型的常量;
编译模块,用于通过所述指令选择模板相对应的常量处理指令对所述程序代码进行编译,得到汇编代码,所述汇编代码的可执行文件在被执行时通过所述常量处理指令加载所述目标常量。
可选地,所述输入模块,还用于:
遍历指令描述文件,查询所描述的数据操作方式与所述程序代码相同的指令选择模板。
可选地,在所述数据操作方式为取浮点数倒数操作方式时,所述目标常量包括:浮点数;
所述输入模块,还用于:
通过指令选择模板相对应的常量处理指令,将所述浮点数和所述程序代码中的变量数据进行编译,得到汇编代码。
可选地,所述常量处理指令包括:架构预设的取浮点数倒数处理指令;
所述输入模块,还用于:
将所述程序代码中的变量数据添加到所述取浮点数倒数处理指令中,得到汇编代码。
可选地,所述常量处理指令包括:浮点数除法指令,所述输入模块,还用于:
将浮点数除法指令编译为浮点数1.0除以所述程序代码中变量数据的形式,得到汇编代码。
可选地,在所述数据操作方式为取浮点数立即数操作方式时,所述目标常量包括:整数,所述常量处理指令包括整数到浮点数转换指令;
所述输入模块,还用于:
将所述整数添加到所述整数到浮点数转换指令中,得到汇编代码。
可选地,所述装置还包括:配置模块,用于:
获取包含有所述指令选择模板的所述指令描述文件;
在所述指令选择模板中存在常量时,通过编译器预设的降低接口将所述常量定义为架构支持类型的目标常量;
重新构建所述编译器。
本申请提供一种电子设备,包括处理器,存储器及存储在所述存储器上并可在所述处理器上运行的程序或指令,所述程序或指令被所述处理器执行时实现上述第一方面所述程序代码的编译方法。
本申请提供一种计算机可读存储介质,所述计算机可读存储介质上存储计算机程序,所述计算机程序被处理器执行时实现上述第一方面所述的程序代码的编译方法。
针对现有技术,本申请具备如下优点:
本申请提供的一种程序代码的编译方法、装置、电子设备及存储介质,本方案通过预先将目标常量设置为架构支持类型,然后在编译器的指令描述文件中设置指令选择模板来为涉及该目标常量的程序代码设置相对应常量处理指令,从而编译器在编译过程中利用该常量处理指令对该程序代码进行汇编,使得汇编代码的可执行文件被执行时可以通过常量处理指令加载目标常量,节省了从常量池中加载目标常量的访存指令,减少了涉及常量的程序在执行时对于处理器性能的消耗。
上述说明仅是本申请技术方案的概述,为了能够更清楚了解本申请的技术手段,而可依照说明书的内容予以实施,并且为了让本申请的上述和其它目的、特征和优点能够更明显易懂,以下特举本申请的具体实施方式。
附图说明
通过阅读下文优选实施方式的详细描述,各种其他的优点和益处对于本领域普通技术人员将变得清楚明了。附图仅用于示出优选实施方式的目的,而并不认为是对本申请的限制。而且在整个附图中,用相同的参考符号表示相同的部件。在附图中:
图1是本申请实施例提供的一种程序代码的编译方法的步骤流程图;
图2是本申请实施例提供的一种编译器的配置方法的步骤流程图;
图3是本申请实施例提供的一种程序代码的编译装置的结构框图。
具体实施方式
下面将参照附图更详细地描述本申请的示例性实施例。虽然附图中显示了本申请的示例性实施例,然而应当理解,可以以各种形式实现本申请而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了能够更透彻地理解本申请,并且能够将本申请的范围完整的传达给本领域的技术人员。
图1是本申请实施例提供一种程序代码的编译方法的步骤流程图,所述方法包括:
步骤101,在获取到包含目标常量的程序代码时,在指令描述文件中查询与所述程序代码相匹配的指令选择模板,所述目标常量是预先定义为架构支持类型的常量。
相关技术中对涉及常量的程序代码进行编译所得到的汇编代码在执行时需要从常量池中加载常量,然后在程序执行时将常量再从常量池对应的内存位置加载到寄存器,若需要再对常量进行操作处理,则还需要对常量执行指令操作。例如在基于MIPS架构、clang编译器编译关于取浮点数倒数的汇编代码时,通过相关技术中的汇编方式得到的部分汇编代码如下:
1:lui $1,%hi(%neg(%gp_rel(test1)))
2:daddu $1,$1,$25
3:daddiu $1,$1,%lo(%neg(%gp_rel(test1)))
4:ld $1,%got_page(.Lcpi0_0)($1)
5:ld $f0,%got_ofst(.Lcpi0_0)($1)
6:div.s $f0,$f0,$f12
首先第1条到第4条指令用于计算常量池的内存地址,然后第5条是从相应的内存中把载浮点数常量1.0加载到浮点寄存器$f0中,仅加载浮点数常量就需要5条指令,而进一步对常量进行操作处理还需要在其后增加了一条除法指令,即第6条指令用于取浮点数参数a的倒数,一共是6条指令,需要消耗较多的处理器性能。
因此本申请实施例为减少所得到汇编代码的执行文件在被执行时对于处理器性能消耗较多的问题对编译器的汇编过程进行改进。具体的,本申请实施例的执行主体是编译器。通常编译器包括前端和后端,其中前端是对输入的例如C语言、C++等高级语言的源代码进行解析,然后依次通过词法分析、语法分析、语义分析以生成中间代码,后端会进一步对中间代码进行优化,转化为汇编语言的汇编代码。而本申请实施例针对编译器对中间代码进行优化的过程中实施,因此程序代码可以是指编译器的中间代码。在编译器对中间代码进行优化时,可以基于指令描述文件中的指令映射关系将中间代码中的指令映射到所需的指令中,该指令映射关系具体可以是开发人员为编译器设置的。因此本申请实施例为了将涉及通过目标常量对数据进行操作处理的程序代码的汇编代码,或者是需要加载目标常量的程序代码的汇编代码的指令进行改进,可以通过在指令描述文件中设置用于描述特定数据处理操作方式的指令选择模板。该指令选择模板中包含程序代码模板和常量处理指令之间的对应关系,其中常量处理指令是编译器中原有的对常量进行操作处理的指令。
需要说明的是,预先定义为架构支持类型的目标常量在编译器的枚举过程中会被忽略,从而该目标常量将不会从常量池进行加载,也将不存在访问内容的过程,无需执行访问指令。具体地可以预先通过编译器提供的公共接口对常量进行定义,使得该目标常量成为编译器的架构原生支持的目标常量,当然该目标常量具体可以是架构默认设置的,也可以是用户自行设置的,本申请实施例对其不加以限制。
在实际应用中,编译器在对程序代码中的指令进行编译时,会在指令描述文件查询所需映射到的目标指令,而本申请实施例通过对涉及目标常量的指令在指令描述文件中设置包含有指令样式和常量处理之间对应关系的指令选择模板,从而在为包含目标常量的指令遍历指令描述文件时,将会查询到与该指令相匹配的指令模板,确定该指令模板所在的指令选择模板。
步骤102,通过所述指令选择模板相对应的常量处理指令对所述程序代码进行编译,得到汇编代码,所述汇编代码的可执行文件在被执行时通过所述常量处理指令加载所述目标常量。
在本申请实施例中,编译器通过利用指令选择模板中的常量处理指令对程序代码中的原有指令进行映射,以得到程序代码的汇编代码。通过该汇编代码进行链接所得到的可执行文件在执行时,处理器在枚举过程中将忽略该目标常量,直接通过执行常数处理指令来加载得到目标常量和/或对目标常量进行操作处理得到的数据。从而无需从常量池中加载目标常量到寄存器进而也无需通过访存指令再到内存中去取该目标常量。
示例性的,仍然以取浮点数倒数的程序代码为例,通过本申请实施例汇编得到的汇编代码如下:
1;addiu $1,$zero,1
2:mtc1 $1,$f0
3:cvt.s.w $f0,$f0
4:jr $ra
5:recip.s $f0,$f12
其中,第1条指令是将整数1放到1号定点寄存器,第2条指令是将1号寄存器里的数据放到f0浮点寄存器,第3条是对f0浮点寄存器的数据转换为浮点数,第4条是跳转指令,第5条是取浮点数倒数的常量处理指令。可见,通过本申请实施例的编译器不再通过常量池加载,而是通过浮点数/整数转换指令(cvt.s.w)加载,并且利用MIPS(是一种采取精简指令集的处理器架构)的recip.s指令实现取浮点数的倒数。静态指令数相比之前减少,具体是加载浮点数常量所需的指令从5条减少为3条,而对浮点数常量进行处理操作得到数据的指令总共从6条减少为5条,且不涉及访存指令,显著减少了所需消耗的处理器性能。
进一步的,针对需要对较少数量的目标常量的调用次数较多的程序代码,例如对于5个、10个等不同的目标常量的调用次数超过1000次、10000次等调用次数阈值时,通过本申请实施例所述的程序代码的编译方法对程序代码进行编译,在可以显著减少程序代码在运行过程中所需执行的指令条数的同时,由于目标常量的数量较少,因此对于扩充不同目标常量相对应的指令选择模板后的指令描述文件的遍历过程,对于处理器性能的影响也较轻,从而在这种程序代码通过本申请实施例所述的程序代码的编译方式来进行编译后,可以更加显著地减少程序代码运行所需消耗的处理器性能。此外,除了针对上述情况外,对于以函数为单位进行调用执行的程序,针对程序中的热点函数进行常量信息的获取,将热点函数中的常量作为目标函数,亦可以更加显著地减少程序代码运行所需消耗的处理器性能。
本申请实施例通过预先将目标常量设置为架构支持类型,然后在编译器的指令描述文件中设置指令选择模板来为涉及该目标常量的程序代码设置相对应常量处理指令,从而编译器在编译过程中利用该常量处理指令对该程序代码进行汇编,使得汇编代码的可执行文件被执行时可以通过常量处理指令加载目标常量,节省了从常量池中加载目标常量的访存指令,减少了涉及常量的程序在执行时对于处理器性能的消耗。
可选地,所述步骤101,可以包括:遍历指令描述文件,查询所描述的数据操作方式与所述程序代码相同的指令选择模板。
在本申请实施例中,数据操作方式可以是指令所包含的处理函数,例如1.0f/a是用于描述浮点数1.0与变量a之间的除法操作方式,还可以是1.0f-2.0f是用于描述浮点数1.0与浮点数2.0之间的减法操作方式,还可以是1.0f,仅对于浮点数1.0的加载操作,当然此处只是示例性描述,此处不做限定。本申请实施例通过在指令描述文件中设置描述数据操作方式的指令选择模板,可以准确地对程序代码中涉及常量的指令进行识别。
可选地,在所述数据操作方式为取浮点数倒数操作方式时,所述目标常量包括:浮点数,所述步骤101,可以包括:通过指令选择模板相对应的常量处理指令,将所述浮点数和所述程序代码中的变量数据进行编译,得到汇编代码。
在本申请实施例中,取浮点数倒数操作方式是指变量数据针对特定浮点数的取倒数的操作方式,例如a/2.0f是变量a针对浮点数2.0取倒数,a/1.0f是变量针对浮点数1.0取倒数。在数据操作方式为取浮点数倒数操作方式时,程序代码的汇编代码将会涉及浮点数,为避免从常量池中加载浮点数,需要预先将浮点数定义为架构支持类型,从而使得编译器在枚举时忽略该浮点数,避免编译器将该浮点数放到常量池中。
本申请实施例通过将数据操作方式设置为取浮点数倒数操作方式,减少了程序代码在执行取浮点数倒数操作时所需消耗的处理器性能。
可选地,所述常量处理指令包括:架构预设的取浮点数倒数处理指令,所述步骤101,可以包括:将所述程序代码中的变量数据添加到所述取浮点数倒数处理指令中,得到汇编代码。
在本申请实施例中,架构预设的取浮点数倒数处理指令是编译器所使用处理器架构提供的指令集中已有的用于取浮点数倒数的指令,例如MIPS架构中recip.s指令可以将其用于直接取浮点数的倒数。对于这种架构,可以直接通过取浮点数倒数处理指令来对程序代码进行遍历,还是以MIPS架构中recip.s指令为例,对于存储在寄存器中的变量,可以写汇编代码为“recip.s$f0,$f12”,即取计算存储在浮点数寄存器$f12中的浮点数的倒数,并将计算结果存储在浮点数寄存器$f0中。
本申请实施例通过架构预设的取浮点数倒数处理指令来修改指令描述文件,无需额外扩展数据集,减少了实现本申请所述程序代码的编译方法所需的工作量。
可选地,所述常量处理指令包括:浮点数除法指令,所述步骤101,可以包括:将浮点数除法指令编译为浮点数1.0除以所述程序代码中变量数据的形式,得到汇编代码。
在本申请实施例中,浮点数除法指令是编译器所使用处理器架构提供的针对浮点数的除法指令,通常各种处理器架构中均存在这种简单的算法指令。对于没有用于取浮点数倒数的处理器架构,可以通过利用处理器架构中提供的浮点数除法指令来设置常量处理指令,即通过浮点数1.0除以程序代码中的变量数据即可实现取浮点数倒数的处理操作。
本申请实施例针对指令集不包含可用取浮点数倒数处理指令的处理器架构,通过指令集中的浮点数除法指令来对程序代码中的变量数据进行编译,不仅减少了实现本申请所述程序代码的编译方法所需的工作量,而且提高了本申请实施例所述程序代码的编译方法的适用范围,可以适用于各种不同的处理器架构。
可选地,在所述数据操作方式为取浮点数立即数操作方式时,所述目标常量包括:整数,所述步骤101,可以包括:将所述整数添加到所述整数到浮点数转换指令中,得到汇编代码。
在本申请实施例中,取浮点数立即数操作方式是指对于浮点数的载入和搬运操作方式。在载入浮点数立即数时,可预先将该浮点数和浮点数对应整数定义为架构支持类型。从而可通过处理器架构的指令集中的整数到浮点数转换指令对程序代码进行汇编,例如MIPS架构中的cvt.s.w和mtc1指令,得到的汇编代码可以是“cvt.s.w$f0,$f0”,即把$f0浮点数寄存器中的值按照整数转换为对应的浮点数,例如把整数1转换为浮点数1.0。
本申请实施例通过指令集中的整数到浮点数指令来编译程序代码中的取浮点数立即数的处理操作,减少了实现本申请所述程序代码的编译方法所需的工作量。
可选地,图2示出本申请实施例提供一种编译器的配置方法的步骤流程图,所述方法包括:
步骤201,获取包含有所述指令选择模板的所述指令描述文件。
在本申请实施例中,开发人员可通过修改编译器的源码或者编译器的内部实现对指令描述文件进行增删改查等编辑操作来输入指令描述文件。
步骤202,在所述指令选择模板中存在常量时,通过编译器预设的降低接口将所述常量定义为架构支持类型的目标常量。
在本申请实施例中,在检测到指令描述文件发生更新或检测到新的指令描述文件时,遍历指令描述文件中的指令选择模板是否存在常量,若存在则通过编译器的降低接口将该常量定义为架构支持类型,使得目标常量合法化。例如:LLVM(一种构架编译器的框架系统)编译器提供的降低接口isFPImmLegal(),该接口isFPImmLegal()用于描述哪些浮点数是目标架构原生支持,哪些浮点数需要通过常量池加载,当然此处只是示例性说明,具体降低接口的选择可以根据实际需求设置,此处不做限定。
进一步的,可以对指令选择模板中不同常量的出现频次或者是程序代码中的所需调用的调用频次进行统计,将出现频次和/或调用频次大于频次阈值的常量通过编译器预设的降低接口将所述常量定义为架构支持类型的目标常量,从而对合法化常量的数量进行控制,避免由于合法化常量数量过多,导致遍历查询常量所需消耗的处理器性能较多的情况出现。或者,还可以对程序代码中的热点函数中的常量信息进行统计,将热点函数中的常量信息中使用频次最高的常量作为目标常量,通过编译器预设的降低接口将该常量定义为架构支持类型的目标常量。
步骤203,重新构建所述编译器。
在本申请实施例中,修改编译器的源码或者编译器的内部实现修改后,重新构建编译器即可使得编译器运行本申请实施例所述的程序代码的编译方法。
本申请实施例通过编译器的降低接口来将目标常量设置为架构支持类型,以实现目标常量的合法化,使得目标常量无需从常量池中进行加载,减少了涉及常量的操作处理指令的执行过程所消耗的处理器性能。
图3是本申请实施例提供了一种程序代码的编译装置30的结构框图,所述装置包括:
输入模块301,用于在获取到包含目标常量的程序代码时,在指令描述文件中查询与所述程序代码相匹配的指令选择模板,所述目标常量是预先定义为架构支持类型的常量;
编译模块302,用于通过所述指令选择模板相对应的常量处理指令对所述程序代码进行编译,得到汇编代码,所述汇编代码的可执行文件在被执行时通过所述常量处理指令加载所述目标常量。
可选地,所述输入模块301,还用于:
遍历指令描述文件,查询所描述的数据操作方式与所述程序代码相同的指令选择模板。
可选地,在所述数据操作方式为取浮点数倒数操作方式时,所述目标常量包括:浮点数;
所述输入模块301,还用于:
通过指令选择模板相对应的常量处理指令,将所述浮点数和所述程序代码中的变量数据进行编译,得到汇编代码。
可选地,所述常量处理指令包括:架构预设的取浮点数倒数处理指令;
所述输入模块301,还用于:
将所述程序代码中的变量数据添加到所述取浮点数倒数处理指令中,得到汇编代码。
可选地,所述常量处理指令包括:浮点数除法指令,所述输入模块301,还用于:
将浮点数除法指令编译为浮点数1.0除以所述程序代码中变量数据的形式,得到汇编代码。
可选地,在所述数据操作方式为取浮点数立即数操作方式时,所述目标常量包括:整数,所述常量处理指令包括整数到浮点数转换指令;
所述输入模块301,还用于:
将所述整数添加到所述整数到浮点数转换指令中,得到汇编代码。
可选地,所述装置还包括:配置模块,用于:
获取包含有所述指令选择模板的所述指令描述文件;
在所述指令选择模板中存在常量时,通过编译器预设的降低接口将所述常量定义为架构支持类型的目标常量;
重新构建所述编译器。
本申请实施例通过预先将目标常量设置为架构支持类型,然后在编译器的指令描述文件中设置指令选择模板来为涉及该目标常量的程序代码设置相对应常量处理指令,从而编译器在编译过程中利用该常量处理指令对该程序代码进行汇编,使得汇编代码的可执行文件被执行时可以通过常量处理指令加载目标常量,节省了从常量池中加载目标常量的访存指令,减少了涉及常量的程序在执行时对于处理器性能的消耗。
本申请实施例提供了一种电子设备,存储器及存储在所述存储器上并可在所述处理器上运行的程序或指令,所述程序或指令被所述处理器执行时实现上述任一所述的程序代码的编译方法。
本申请实施例提供的一种电子设备,通过预先将目标常量设置为架构支持类型,然后在编译器的指令描述文件中设置指令选择模板来为涉及该目标常量的程序代码设置相对应常量处理指令,从而编译器在编译过程中利用该常量处理指令对该程序代码进行汇编,使得汇编代码的可执行文件被执行时可以通过常量处理指令加载目标常量,节省了从常量池中加载目标常量的访存指令,减少了涉及常量的程序在执行时对于处理器性能的消耗。
本申请实施例提供了一种计算机存储介质,其上存储有计算机程序,计算机程序被处理器执行时能实现上述的程序代码的编译方法。
本申请的实施例提供一种计算机存储介质,通过预先将目标常量设置为架构支持类型,然后在编译器的指令描述文件中设置指令选择模板来为涉及该目标常量的程序代码设置相对应常量处理指令,从而编译器在编译过程中利用该常量处理指令对该程序代码进行汇编,使得汇编代码的可执行文件被执行时可以通过常量处理指令加载目标常量,节省了从常量池中加载目标常量的访存指令,减少了涉及常量的程序在执行时对于处理器性能的消耗。
本技术领域技术人员可以理解,本申请包括涉及用于执行本申请中所述操作中的一项或多项的设备。这些设备可以为所需的目的而专门设计和制造,或者也可以包括通用计算机中的已知设备。这些设备具有存储在其内的计算机程序,这些计算机程序选择性地激活或重构。这样的计算机程序可以被存储在设备(例如,计算机)的存储介质中或者存储在适于存储电子指令并分别耦联到总线的任何类型的介质中,该计算机存储介质包括但不限于任何类型的盘(包括软盘、硬盘、光盘、CD-ROM和磁光盘)、ROM(Read-Only Memory,只读存储器)、RAM(RandomAccess Memory,随即存储器)、EPROM(Erasable Programmable Read-Only Memory,可擦写可编程只读存储器)、EEPROM(Electrically Erasable ProgrammableRead-Only Memory,电可擦可编程只读存储器)、闪存、磁性卡片或光线卡片。也就是,存储介质包括由设备(例如,计算机)以能够读的形式存储或传输信息的任何介质。
本技术领域技术人员可以理解,可以用计算机程序指令来实现这些结构图和/或框图和/或流程图中的每个框以及这些结构图和/或框图和/或流程图中的框的组合。本技术领域技术人员可以理解,可以将这些计算机程序指令提供给通用计算机、专业计算机或其它可编程程序代码的编译方法的处理器来实现,从而通过计算机或其他可编程程序代码的编译方法的处理器来执行本申请公开的结构图和/或框图和/或流图的框或多个框中指定的方案。
以上所述,仅为本申请的具体实施方式,但本申请的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本申请揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本申请的保护范围之内。因此,本申请的保护范围应以所述权利要求的保护范围为准。
Claims (10)
1.一种程序代码的编译方法,其特征在于,所述方法包括:
在获取到包含目标常量的程序代码时,在指令描述文件中查询与所述程序代码相匹配的指令选择模板,所述目标常量是预先定义为架构支持类型的常量;
通过所述指令选择模板相对应的常量处理指令对所述程序代码进行编译,得到汇编代码,所述汇编代码的可执行文件在被执行时通过所述常量处理指令加载所述目标常量。
2.根据权利要求1所述的方法,其特征在于,所述在指令描述文件中查询与所述程序代码相匹配的指令选择模板,包括:
遍历指令描述文件,查询所描述的数据操作方式与所述程序代码相同的指令选择模板。
3.根据权利要求2所述的方法,其特征在于,在所述数据操作方式为取浮点数倒数操作方式时,所述目标常量包括:浮点数;
所述通过所述指令选择模板相对应的常量处理指令对所述程序代码进行编译,得到汇编代码,包括:
通过指令选择模板相对应的常量处理指令,将所述浮点数和所述程序代码中的变量数据进行编译,得到汇编代码。
4.根据权利要求3所述的方法,其特征在于,所述常量处理指令包括:架构预设的取浮点数倒数处理指令;
所述通过指令选择模板相对应的常量处理指令,将所述浮点数和所述程序代码中的变量数据进行编译,得到汇编代码,包括:
将所述程序代码中的变量数据添加到所述取浮点数倒数处理指令中,得到汇编代码。
5.根据权利要求3所述的方法,其特征在于,所述常量处理指令包括:浮点数除法指令,所述通过指令选择模板相对应的常量处理指令,将所述浮点数和所述程序代码中的变量数据进行编译,得到汇编代码,包括:
将浮点数除法指令编译为浮点数1.0除以所述程序代码中变量数据的形式,得到汇编代码。
6.根据权利要求2所述的方法,其特征在于,在所述数据操作方式为取浮点数立即数操作方式时,所述目标常量包括:整数,所述常量处理指令包括整数到浮点数转换指令;
所述通过所述指令选择模板相对应的常量处理指令对所述程序代码进行编译,得到汇编代码,包括:
将所述整数添加到所述整数到浮点数转换指令中,得到汇编代码。
7.根据权利要求1所述的方法,其特征在于,在所述在获取到包含目标常量的程序代码时,在指令描述文件中查询与所述程序代码相匹配的指令选择模板之前,所述方法还包括:
获取包含有所述指令选择模板的所述指令描述文件;
在所述指令选择模板中存在常量时,通过编译器预设的降低接口将所述常量定义为架构支持类型的目标常量;
重新构建所述编译器。
8.一种程序代码的编译装置,其特征在于,所述装置包括:
输入模块,用于在获取到包含目标常量的程序代码时,在指令描述文件中查询与所述程序代码相匹配的指令选择模板,所述目标常量是预先定义为架构支持类型的常量;
编译模块,用于通过所述指令选择模板相对应的常量处理指令对所述程序代码进行编译,得到汇编代码,所述汇编代码的可执行文件在被执行时通过所述常量处理指令加载所述目标常量。
9.一种电子设备,其特征在于,包括处理器、存储器及存储在所述存储器上并可在所述处理器上运行的程序或指令,所述程序或指令被所述处理器执行时实现如权利要求1至7中任一项所述的程序代码的编译方法。
10.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质上存储计算机程序,所述计算机程序被处理器执行时实现权利要求1至7中任一所述的程序代码的编译方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111470696.0A CN114237612B (zh) | 2021-12-03 | 2021-12-03 | 程序代码的编译方法、装置、电子设备及存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111470696.0A CN114237612B (zh) | 2021-12-03 | 2021-12-03 | 程序代码的编译方法、装置、电子设备及存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN114237612A true CN114237612A (zh) | 2022-03-25 |
CN114237612B CN114237612B (zh) | 2024-09-17 |
Family
ID=80753180
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202111470696.0A Active CN114237612B (zh) | 2021-12-03 | 2021-12-03 | 程序代码的编译方法、装置、电子设备及存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN114237612B (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2024169618A1 (zh) * | 2023-02-14 | 2024-08-22 | 华为技术有限公司 | 一种代码编译方法及电子设备 |
Citations (14)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20070276646A1 (en) * | 2004-06-01 | 2007-11-29 | Nikil Dutt | Retargetable Instruction Set Simulators |
US20100095098A1 (en) * | 2008-10-14 | 2010-04-15 | International Business Machines Corporation | Generating and Executing Programs for a Floating Point Single Instruction Multiple Data Instruction Set Architecture |
US20100153936A1 (en) * | 2008-12-15 | 2010-06-17 | Apple Inc. | Deferred constant pool generation |
US20130139134A1 (en) * | 2011-08-10 | 2013-05-30 | International Business Machines Corporation | Serialization of pre-initialized objects |
CN107168761A (zh) * | 2017-05-19 | 2017-09-15 | 南京南瑞继保电气有限公司 | 一种选择语句优化编译方法 |
CN107992329A (zh) * | 2017-07-20 | 2018-05-04 | 上海寒武纪信息科技有限公司 | 一种计算方法及相关产品 |
CN109710211A (zh) * | 2018-11-15 | 2019-05-03 | 珠海市杰理科技股份有限公司 | 浮点数据类型转换方法、装置、存储介质及计算机设备 |
GB201904637D0 (en) * | 2019-04-02 | 2019-05-15 | Graphcore Ltd | Compiling a program from a graph |
CN111078290A (zh) * | 2019-12-17 | 2020-04-28 | 西安电子科技大学 | 一种用于可扩展指令集的编译器及编译方法 |
CN111966424A (zh) * | 2014-06-12 | 2020-11-20 | 甲骨文国际公司 | 使用复常量的方法和系统 |
WO2020233387A1 (zh) * | 2019-05-17 | 2020-11-26 | 上海寒武纪信息科技有限公司 | 指令处理方法、装置及相关产品 |
CN112445316A (zh) * | 2019-08-27 | 2021-03-05 | 无锡江南计算技术研究所 | 基于向量计算的编译时低功耗优化方法 |
CN112527264A (zh) * | 2019-09-19 | 2021-03-19 | 无锡江南计算技术研究所 | 基于异构平台的常量数据访问优化方法 |
CN112579091A (zh) * | 2019-09-29 | 2021-03-30 | 杭州中天微系统有限公司 | 指令编译方法、装置、编译器及计算设备 |
-
2021
- 2021-12-03 CN CN202111470696.0A patent/CN114237612B/zh active Active
Patent Citations (14)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20070276646A1 (en) * | 2004-06-01 | 2007-11-29 | Nikil Dutt | Retargetable Instruction Set Simulators |
US20100095098A1 (en) * | 2008-10-14 | 2010-04-15 | International Business Machines Corporation | Generating and Executing Programs for a Floating Point Single Instruction Multiple Data Instruction Set Architecture |
US20100153936A1 (en) * | 2008-12-15 | 2010-06-17 | Apple Inc. | Deferred constant pool generation |
US20130139134A1 (en) * | 2011-08-10 | 2013-05-30 | International Business Machines Corporation | Serialization of pre-initialized objects |
CN111966424A (zh) * | 2014-06-12 | 2020-11-20 | 甲骨文国际公司 | 使用复常量的方法和系统 |
CN107168761A (zh) * | 2017-05-19 | 2017-09-15 | 南京南瑞继保电气有限公司 | 一种选择语句优化编译方法 |
CN107992329A (zh) * | 2017-07-20 | 2018-05-04 | 上海寒武纪信息科技有限公司 | 一种计算方法及相关产品 |
CN109710211A (zh) * | 2018-11-15 | 2019-05-03 | 珠海市杰理科技股份有限公司 | 浮点数据类型转换方法、装置、存储介质及计算机设备 |
GB201904637D0 (en) * | 2019-04-02 | 2019-05-15 | Graphcore Ltd | Compiling a program from a graph |
WO2020233387A1 (zh) * | 2019-05-17 | 2020-11-26 | 上海寒武纪信息科技有限公司 | 指令处理方法、装置及相关产品 |
CN112445316A (zh) * | 2019-08-27 | 2021-03-05 | 无锡江南计算技术研究所 | 基于向量计算的编译时低功耗优化方法 |
CN112527264A (zh) * | 2019-09-19 | 2021-03-19 | 无锡江南计算技术研究所 | 基于异构平台的常量数据访问优化方法 |
CN112579091A (zh) * | 2019-09-29 | 2021-03-30 | 杭州中天微系统有限公司 | 指令编译方法、装置、编译器及计算设备 |
CN111078290A (zh) * | 2019-12-17 | 2020-04-28 | 西安电子科技大学 | 一种用于可扩展指令集的编译器及编译方法 |
Non-Patent Citations (3)
Title |
---|
吴瑞阳等: "龙芯GS464E处理器核架构设计", 中国科学:信息科学, no. 2015, 30 April 2015 (2015-04-30), pages 480 - 500 * |
唐俊龙等: "面向RISC-V处理器的GCC移植与优化", Retrieved from the Internet <URL:《www.shcas.net/jsjyup/pdf/2021/9/面向RISC-V处理器的GCC移植与优化.pdf》> * |
廉玉龙;史峥;李春强;王会斌;尚云海;: "基于C-SKY CPU的地址立即数编译优化方法", 计算机工程, no. 01, 15 January 2016 (2016-01-15) * |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2024169618A1 (zh) * | 2023-02-14 | 2024-08-22 | 华为技术有限公司 | 一种代码编译方法及电子设备 |
Also Published As
Publication number | Publication date |
---|---|
CN114237612B (zh) | 2024-09-17 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
KR101381274B1 (ko) | 효율적인 동적 이진 변환을 위한 레지스터 매핑 방법, 시스템 및 컴퓨터 판독가능 저장 매체 | |
Schwarz et al. | Plto: A link-time optimizer for the Intel IA-32 architecture | |
US6023583A (en) | Optimized variable allocation method, optimized variable allocation system and computer-readable memory containing an optimized variable allocation program | |
US6247174B1 (en) | Optimization of source code with embedded machine instructions | |
Van Put et al. | Diablo: a reliable, retargetable and extensible link-time rewriting framework | |
US5805895A (en) | Method and apparatus for code translation optimization | |
US7725883B1 (en) | Program interpreter | |
US8561040B2 (en) | One-pass compilation of virtual instructions | |
US8522222B2 (en) | Tracing just-in-time compilation with pointers to local variables | |
US20200073643A1 (en) | Direct function call substitution using preprocessor | |
JPH09330233A (ja) | 最適目的コード生成方法 | |
JP2009503677A (ja) | プログラムをデータオブジェクトとしてサポートするコンパイラ | |
US6934940B2 (en) | Source code transformation-temporary object reduction | |
JPH02217926A (ja) | コード生成方法 | |
CN113296786B (zh) | 数据处理方法、装置、电子设备及存储介质 | |
US6519768B1 (en) | Instruction translation method | |
US20240231864A9 (en) | Hybrid just in time load module compiler with performance optimizations | |
CN114237612A (zh) | 程序代码的编译方法、装置、电子设备及存储介质 | |
US20080104372A1 (en) | Method, apparatus and computer program for executing a program | |
Engelke et al. | Using LLVM for optimized lightweight binary re-writing at runtime | |
CN115167862A (zh) | 补丁方法及相关设备 | |
CN112579091A (zh) | 指令编译方法、装置、编译器及计算设备 | |
JP2002182926A (ja) | コンパイル方法及びコンピュータ読み取り可能な記録媒体 | |
US20040045018A1 (en) | Using address space bridge in postoptimizer to route indirect calls at runtime | |
Antoy et al. | A target implementation for high-performance functional programs |
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 | ||
GR01 | Patent grant |