本公开涉及计算机,特别涉及一种程序源代码编译方法、系统、电子设备和代码运行方法。
背景技术:
1、程序的编译与运行分别是软件开发过程中两个不同的阶段;其中,编译是指将源代码(通常是高级编程语言编写的代码,如c、c++、java等),转换成机器语言代码(一般也称为目标代码)的过程;运行是指执行编译后生成的可执行文件,使程序在计算机上实际运行起来。一般地,在编译结束后且在运行之前,还需要进行链接(linking)过程;具体地,使用链接工具将多个目标文件(包括库文件)链接成一个可执行文件,链接工具会解析目标文件之间的符号引用,将函数和变量的引用与实际地址关联起来。
2、由于虚拟机不支持直接对代码区进行寻址访问,故每次在对某个全局变量进行访问时,都需要将该全局变量先拷贝至临时内存中;在对该全局变量操作结束时再将其从临时内存中删除。然而当程序中涉及全局变量的数量较多时,在程序运行过程中需要频繁的向临时内存中拷贝全局变量,这会影响虚拟机运行性能。
技术实现思路
1、第一方面,本公开实施例提供了一种程序源代码编译方法,所述编译方法基于编译系统,所述编译系统包括软件分离的编译前端和编译后端,所述编译方法包括:
2、所述编译前端将目标源代码转换为对应的第一中间代码;
3、所述编译前端生成目标源代码的运行环境初始化配置信息,并将所述运行环境初始化配置信息转换为对应的第二中间代码,所述运行环境初始化配置信息记载有内存分配信息,所述内存分配信息包括:第一配置信息和第二配置信息,所述第一配置信息用于指示内存空间进行初始化时在所述内存空间内划分有栈区、全局变量区和堆区,所述第二配置信息用于指示将从目标源代码中所确认出的全局变量的编码数据拷贝至所述全局变量区;
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、根据目标代码中第二配置信息所对应的可执行代码,将所述全局变量的编码数据拷贝至所述全局变量区。
1.一种程序源代码编译方法,其特征在于,所述编译方法基于编译系统,所述编译系统包括软件分离的编译前端和编译后端,所述编译方法包括:
2.根据权利要求1所述的编译方法,其特征在于,
3.根据权利要求2所述的编译方法,其特征在于,所述内存分配信息还包括:第三配置信息;
4.根据权利要求1所述的编译方法,其特征在于,所述内存分配信息还包括:第四配置信息,所述第四配置信息用于指示分配给所述栈区的预设固定空间大小。
5.根据权利要求1所述的编译方法,其特征在于,在所述编译前端将中间代码集发送至所述编译后端的步骤之后,且在所述编译后端对所述中间代码集进行编译生成对应的目标代码的步骤之前,还包括:
6.根据权利要求1所述的编译方法,其特征在于,所述目标代码包括:代码只读区和全局变量只读区,所述代码只读区内存储有可供运行的字节码,所述全局变量只读区中记载有各全局变量的编码数据;
7.根据权利要求1所述的编译方法,其特征在于,所述编译前端将目标源代码转换为对应的第一中间代码的步骤包括:
8.一种程序源代码编译系统,其特征在于,所述编译系统配置为能够实现如权利要求1至7中任一所述编译方法,所述编译系统包括:软件分离的编译前端和编译后端;
9.一种电子设备,其特征在于,包括:
10.一种代码运行方法,其特征在于,用于对如权利要求1-7中任一所述编译方法所生成的目标代码进行运行,所述运行方法包括: