CN117251168A - 动态类型语言的提前编译方法、装置、智能汽车及介质 - Google Patents
动态类型语言的提前编译方法、装置、智能汽车及介质 Download PDFInfo
- Publication number
- CN117251168A CN117251168A CN202311227225.6A CN202311227225A CN117251168A CN 117251168 A CN117251168 A CN 117251168A CN 202311227225 A CN202311227225 A CN 202311227225A CN 117251168 A CN117251168 A CN 117251168A
- Authority
- CN
- China
- Prior art keywords
- code
- global variable
- address
- machine
- target
- 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 90
- 238000013519 translation Methods 0.000 claims description 31
- 238000004590 computer program Methods 0.000 claims description 3
- 230000006870 function Effects 0.000 description 9
- 238000012545 processing Methods 0.000 description 5
- 238000010586 diagram Methods 0.000 description 4
- 230000008878 coupling Effects 0.000 description 3
- 238000010168 coupling process Methods 0.000 description 3
- 238000005859 coupling reaction Methods 0.000 description 3
- 238000005516 engineering process Methods 0.000 description 3
- 238000004891 communication Methods 0.000 description 2
- 238000013507 mapping Methods 0.000 description 2
- 230000006978 adaptation Effects 0.000 description 1
- 230000005540 biological transmission Effects 0.000 description 1
- 238000013461 design Methods 0.000 description 1
- 238000001514 detection method Methods 0.000 description 1
- 230000000694 effects Effects 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 230000003287 optical effect Effects 0.000 description 1
- 230000002093 peripheral effect Effects 0.000 description 1
- 238000012546 transfer Methods 0.000 description 1
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
-
- 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/54—Link editing before load time
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/455—Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
- G06F9/45504—Abstract machines for programme code execution, e.g. Java virtual machine [JVM], interpreters, emulators
- G06F9/45508—Runtime interpretation or emulation, e g. emulator loops, bytecode interpretation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/455—Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
- G06F9/45533—Hypervisors; Virtual machine monitors
- G06F9/45558—Hypervisor-specific management and integration aspects
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/455—Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
- G06F9/45533—Hypervisors; Virtual machine monitors
- G06F9/45558—Hypervisor-specific management and integration aspects
- G06F2009/45583—Memory management, e.g. access or allocation
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
本发明公开了一种动态类型语言的提前编译方法、装置、智能汽车及介质,所述方法包括:对车机的目标源码进行编译,得到字节码、常量池以及第一全局变量表,其中,所述目标源码为动态类型的源码,所述第一全局变量表包括所述字节码转译成机器码所需要的所有全局变量的地址;基于所述常量池的首地址、所述第一全局变量表的首地址以及所述目标源码运行时对应的相关变量存储位置,将所述字节码转译为机器码;将所述机器码链接到虚拟机的内存管理单元;基于链接到所述内存管理单元的机器码,生成预编译文件。本方案中,通过编译过程生成机器码,仅需要耗费少量加载的时间开销,具有较好的启动性能。
Description
技术领域
本发明涉及车辆技术领域,特别涉及一种动态类型语言的提前编译方法、装置、智能汽车及介质。
背景技术
计算机语言,是一种计算机和用户都能识别的语言,用户通过计算机语言精确的定义计算机数据和程序,来完成想要通过计算机完成实现的功能,计算机语言最终会编译成数据和机器码在计算机上运行。动态类型语言,指的是计算机语言的数据类型不是在编译阶段决定的,而是把类型绑定和检测延后到了运行阶段。
现有技术中,虚拟机技术,是执行动态类型语言源码的技术。虚拟机将源码编译成程序执行时必要的数据和字节码,然后逐条解释执行字节码,或者将字节码转译成机器码组合起来,然后在CPU上执行。由于该种方式中在运行时需要解释执行或编译的流程,进而造成编译带来的时间开销。
发明内容
本发明实施例提供一种动态类型语言的提前编译方法、装置、智能汽车及介质,以提高执行性能,减少加载的时间开销。
第一方面,本发明实施例提供一种动态类型语言的提前编译方法,应用于车机,包括:
对所述车机的目标源码进行编译,得到字节码、常量池以及第一全局变量表,其中,所述目标源码为动态类型的源码,所述第一全局变量表包括所述字节码转译成机器码所需要的所有全局变量的地址;
基于所述常量池的首地址、所述第一全局变量表的首地址以及所述目标源码运行时对应的相关变量存储位置,将所述字节码转译为机器码;
将所述机器码链接到虚拟机的内存管理单元;
基于链接到所述内存管理单元的机器码,生成预编译文件。
可选地,在所述得到字节码、常量池以及第一全局变量表之后,所述方法还包括:
将所述第一全局变量表的首地址和所述常量池的首地址存储到预设位置。
可选地,所述方法还包括:
将所述目标源码运行时对应的相关变量按照编译顺序存入栈中。
可选地,所述基于所述常量池的首地址、所述第一全局变量表的首地址以及所述目标源码运行时对应的相关变量存储位置,将所述字节码转译为机器码,包括:
对所述字节码进行遍历,针对每条字节码,若该条字节码在转译过程中需要读取目标全局变量,基于所述目标全局变量对应的第一偏移,生成第一指令,所述第一指令为从内存的第一位置读取数据的指令,所述第一位置为所述第一全局变量表的首地址加所述第一偏移的位置。
可选地,所述基于所述常量池的首地址、所述第一全局变量表的首地址以及所述目标源码运行时对应的相关变量存储位置,将所述字节码转译为机器码,包括:
对所述字节码进行遍历,针对每条字节码,若该条字节码在转译过程中需要读取目标常量数据,基于所述目标常量对应的第二偏移,生成第二指令,所述第二指令为从内存的第二位置读取数据的指令,所述第二位置为所述常量池的首地址加所述第二偏移的位置。
可选地,所述基于所述常量池的首地址、所述第一全局变量表的首地址以及所述目标源码运行时对应的相关变量存储位置,将所述字节码转译为机器码,包括:
对所述字节码进行遍历,针对每条字节码,若该条字节码在转译过程中需要读取所述目标源码运行时对应的目标相关变量,生成第三指令,所述第三指令为从栈上读取所述目标相关变量的指令。
可选地,在所述基于链接到所述内存管理单元的机器码,生成预编译文件之后,所述方法还包括:
在所述预编译文件的加载过程中,生成第二全局变量表,所述第二全局变量与所述第一全局变量表所包含的全局变量均相同,所述第二全局变量表中的包含的全局变量均已初始化;
将所述预编译文件链接到所述内存管理单元;
获取所述字节码、所述常量池以及所述目标源码的源码信息,将所述内存管理单元的机器码与对应的源码进行绑定;
运行所述机器码。
第二方面,本发明实施例提供一种动态类型语言的提前编译装置,应用于车机,包括:
编译模块,用于对所述车机的目标源码进行编译,得到字节码、常量池以及第一全局变量表,其中,所述目标源码为动态类型的源码,所述第一全局变量表包括所述字节码转译成机器码所需要的所有全局变量的地址;
转译模块,用于基于所述常量池的首地址、所述第一全局变量表的首地址以及所述目标源码运行时对应的相关变量存储位置,将所述字节码转译为机器码;
链接模块,用于将所述机器码链接到虚拟机的内存管理单元;
生成模块,用于基于链接到所述内存管理单元的机器码,生成预编译文件。
可选地,所述装置还包括:
第一存储模块,用于将所述第一全局变量表的首地址和所述常量池的首地址存储到预设位置。
可选地,所述装置还包括:
第二存储模块,用于将所述目标源码运行时对应的相关变量按照编译顺序存入栈中。
可选地,转译模块302,用于:
对所述字节码进行遍历,针对每条字节码,若该条字节码在转译过程中需要读取目标全局变量,基于所述目标全局变量对应的第一偏移,生成第一指令,所述第一指令为从内存的第一位置读取数据的指令,所述第一位置为所述第一全局变量表的首地址加所述第一偏移的位置。
可选地,转译模块302,用于:
对所述字节码进行遍历,针对每条字节码,若该条字节码在转译过程中需要读取目标常量数据,基于所述目标常量对应的第二偏移,生成第二指令,所述第二指令为从内存的第二位置读取数据的指令,所述第二位置为所述常量池的首地址加所述第二偏移的位置。
可选地,转译模块302,用于:
对所述字节码进行遍历,针对每条字节码,若该条字节码在转译过程中需要读取所述目标源码运行时对应的目标相关变量,生成第三指令,所述第三指令为从栈上读取所述目标相关变量的指令。
可选地,所述装置还包括:
处理模块,用于在所述预编译文件的加载过程中,生成第二全局变量表,所述第二全局变量与所述第一全局变量表所包含的全局变量均相同,所述第二全局变量表中的包含的全局变量均已初始化;
预编译文件链接模块,用于将所述预编译文件链接到所述内存管理单元;
绑定模块,用于获取所述字节码、所述常量池以及所述目标源码的源码信息,将所述内存管理单元的机器码与对应的源码进行绑定;
运行模块,用于运行所述机器码。
第三方面,本发明实施提供一种智能汽车,包括有存储器,以及一个或者多个的程序,其中一个或者多个的程序存储于存储器中,且经配置以由一个或者多个的处理器执行所述一个或者多个的程序所包含的用于执行第一方面提供的任一方法对应的操作指令。
第四方面,本发明实施例提供一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现第一方面提供的任一方法的步骤。
本申请实施例中的上述一个或至少一个技术方案,至少具有如下技术效果:
本说明书实施例提供的动态类型语言的提前编译方法,通过对车机的目标源码进行编译,得到字节码、常量池以及第一全局变量表,其中,目标源码为动态类型的源码,第一全局表量表包括所述字节码转译成机器码所需要的所有全局变量的地址;基于常量池的首地址、第一全局变量表的首地址以及目标源码运行时对应的相关变量存储位置,将所述字节码转译为机器码;将机器码链接到虚拟机的内存管理单元;基于链接到内存管理单元的机器码,生成预编译文件。本方案中,通过编译过程生成机器码,不存在字节码读取、分派跳转的开销,在运行前,仅需要耗费少量加载的时间开销,具有较好的启动性能。
附图说明
图1为本说明书实施例提供的一种动态类型语言的提前编译方法的流程图;
图2为本说明书实施例提供的一种目标源码的编译和运行过程的示意图;
图3为本说明书实施例提供的一种动态类型语言的提前编译装置的示意图;
图4为本说明书实施例提供的一种智能汽车的示意图。
具体实施方式
本申请实施例的技术方案总体思路如下:对车机的目标源码进行编译,得到字节码、常量池以及第一全局变量表,其中,所述目标源码为动态类型的源码,所述第一全局变量表存储有所述字节码转译成机器码所需要的所有全局变量的地址;基于所述常量池的首地址、所述第一全局变量表的首地址以及所述目标源码运行时对应的相关变量存储位置,将所述字节码转译为机器码;将所述机器码链接到虚拟机的内存管理单元;基于链接到所述内存管理单元的机器码,生成预编译文件。
本方案,通过编译过程生成包含地址无关化机器码的预编译文件。在运行时,加载预编译文件后运行机器码,不存在字节码读取、分派跳转的开销,仅需要耗费少量加载的时间开销,具有较好的启动性能。
为了更好的理解上述技术方案,下面通过附图以及具体实施例对本说明书实施例的技术方案做详细的说明,应当理解本说明书实施例以及实施例中的具体特征是对本说明书实施例技术方案的详细的说明,而不是对本说明书技术方案的限定,在不冲突的情况下,本说明书实施例以及实施例中的技术特征可以相互组合。
首先说明,本文中出现的术语“和/或”,仅仅是一种描述关联对象的关联关系,表示可以存在三种关系,例如,A和/或B,可以表示:单独存在A,同时存在A和B,单独存在B这三种情况。另外,本文中字符“/”,一般表示前后关联对象是一种“或”的关系。
如图1所示,为本说明书实施例提供的一种动态类型语言的提前编译方法的流程图,具体包括以下步骤:
步骤S101:对所述车机的目标源码进行编译,得到字节码、常量池以及第一全局变量表,其中,所述目标源码为动态类型的源码,所述第一全局变量表包括所述字节码转译成机器码所需要的所有全局变量的地址;
步骤S102:基于所述常量池的首地址、所述第一全局变量表的首地址以及所述目标源码运行时对应的相关变量存储位置,将所述字节码转译为机器码;
步骤S103:将所述机器码链接到虚拟机的内存管理单元;
步骤S104:基于链接到所述内存管理单元的机器码,生成预编译文件。
本说明书实施例中的方法,可以应用于车机中。需要说明的是,动态类型语言的源码,例如JavaScript,通常是从云端上下载下来再执行的,由于场景的实时性,上一次执行的代码和本次执行的源码可能不一样,因此,一般不会对动态类型的源码进行提前编译。而在车机领域,源码通常是存储在车机的磁盘中,每次执行的源码是相同的,并不具有太多场景的实时性,因此,针对车机的源码进行提前编译,能够有效提高执行速度和性能。
步骤S101中,目标源码可以为存储在车机上的任意动态类型的源码,目标源码的具体类型可以根据实际需要进行选择,例如,目标源码为JavaScript。目标源码可以通过虚拟机的编译器,经过词法分析、语法分析等步骤实现编译,生成可以完全代表源码逻辑的字节码以及字节码使用到的常量池。其中,字节码为一种经过编译器预处理过的二进制文件,其包含执行程序,并由一序列操作码/数据对组成。常量池包括文本字符串、基本数据类型的值、类和结构的完全限定名、字段名称和描述符、方法名称和描述符等。
本说明书实施例中,将字节码转译成机器码所需要的所有全局变量的地址,按照预设顺序,如以虚拟机初始化的默认顺序存入第一全局表量表中,第一全局变量表可以包括但不限于以下数据:全局对象的引用、全局函数地址、内部函数地址、其他运行时需要使用的全局数据等。
一些实施方式中,在得到常量池和第一全局变量表之后,将第一全局变量表的首地址和常量池的首地址存储到预设位置。具体的,在编译过程中,可以生成一段指令,该指令,用于将第一全局变量表的首地址以及常量池的首地址存储在寄存器或栈上的预设位置,其中,预设位置可以是虚拟机默认的固定位置,以便于后续生成机器码时能在运行时获取所需的首地址。
一些实施方式中,在编译过程中,将目标源码运行时对应的相关变量按照编译顺序存入栈中。具体的,目标源码运行时对应的相关变量,可以包括当前函数对象、当前上下文对象等。在编译过程中,可以生成一段指令,该指令,用于将相关变量存入栈中,方便后续生成机器码时能在运行时获取对应的相关变量。
步骤S102中,机器码可以为地址无关码,将字节码转译为机器码,可以通过多种方式实现。例如,可以逐条字节码进行转译,也可以将字节码全部转译成普通代码后,再处理成机器码。
为了便于说明,本说明书实施例中以逐条转译为例进行说明。在具体实施过程中,可以对字节码进行遍历,读取每条字节码,并按照读取到的字节码的具体含义转译成对应的一串机器码。在转译的过程中,可能会需要读取全局变量、常量池变量和/或运行时的相关变量,下面对这三种的转移过程进行具体说明。
第一种:对所述字节码进行遍历,针对每条字节码,若该条字节码在转译过程中需要读取目标全局变量,基于所述目标全局变量对应的第一偏移,生成第一指令,所述第一指令为从内存的第一位置读取数据的指令,所述第一位置为所述第一全局变量表的首地址加所述第一偏移的位置。
具体来讲,目标全局变量可以为第一全局变量表中包含的任意全局变量。若一条字节码在转译过程中需要读取目标全局变量,通常来说,如果在正常编译js文件的过程中,会生成一条读取地址常量的指令,而在本说明书实施例中的编译成预编译文件的过程中,由于运行环境有可能不同,如果仍采用读取地址常量的指令,有可能会出现错误。因此,本说明书实施例中,为了保证读取数据的准确性,不采用读取地址常量的指令,而是通过目标全局变量的偏移加第一全局变量表的首地址的方式来实现数据读取。
其中,在需要读取目标全局变量时,可以确定出目标全局变量的第一偏移,由于目标全局变量在第一全局变量表中的位置是固定的,因此,可以基于目标全局变量表在第一全局变量表中的位置来确定第一偏移。进一步的,根据第一全局变量表的首地址以及第一偏移,得到第一位置,从而生成从内存的第一位置读取数据的指令,即可正确读取目标全局变量。
第二种:对所述字节码进行遍历,针对每条字节码,若该条字节码在转译过程中需要读取目标常量数据,基于所述目标常量对应的第二偏移,生成第二指令,所述第二指令为从内存的第二位置读取数据的指令,所述第二位置为所述常量池的首地址加所述第二偏移的位置。
具体来讲,目标常量可以是常量池中包含的任意常量。和上述第一种存在的问题类似,在通常编译过程中,如果需要读取目标常量数据,会生成一条读取地址常量的指令,为了避免执行该指令可能会存在的错误,本说明书实施例中,不采用读取地址常量的指令,而是通过目标常量的偏移加常量池的首地址的方式来实现数据读取。
其中,在需要读取目标常量时,可以确定出目标常量的第二偏移,由于目标常量在常量池中的位置是固定的,因此,可以基于目标常量在常量池中的位置来确定第二偏移。进一步的,根据常量池的首地址以及第二偏移,得到第二位置,从而生成从内存的第二位置读取数据的指令,即可正确读取目标常量数据。
第三种:对所述字节码进行遍历,针对每条字节码,若该条字节码在转译过程中需要读取所述目标源码运行时对应的目标相关变量,生成第三指令,所述第三指令为从栈上读取所述目标相关变量的指令。
具体来讲,目标相关变量,可以是目标源码运行时需要的任意变量。和上述第一种存在的问题类似,在通常编译过程中,如果需要读取目标相关变量,会生成一条读取地址常量的指令,为了避免执行该指令可能会存在的错误,本说明书实施例中,不采用读取地址常量的指令,而是通过从栈上对应位置读取目标相关变量的方式来实现。其中,第三指令为从栈上读取目标相关变量的指令。在一些实施方式中,可以通过栈基址加上目标相关变量的偏移来确定目标目标相关变量在栈上的位置。
本说明书实施例中,在对字节码遍历的过程中,均可以通过上述方式实现字节码的转译,当一条字节码转移完成后,判断字节码是否遍历完成,如果未完成,则继续转译下一条字节码,直到字节码全部完成转译,即可得到全部的地址无关的机器码。
在一些实施方式中,如果在对字节码的转译过程中,仍采用的是生成读取地址常量的指令,为了避免出现上述问题,可以对指令进行改写。以目标全局变量为例,将第一全局变量池的首地址与目标全局变量的第一偏移相加,得到第一位置,然后,将读取地址常量的指令中的地址重新改写为第一位置,这样也可以确保读取到的数据是正确的。在这种方式中,可以不对机器码做地址无关化处理,而是记录机器码里读取全局变量和常量池的指令位置,并在运行前重新填写该指令即可。
步骤S103中,在得到机器码之后,将机器码链接到内存管理单元。当然,还可以将其他编译数据,例如常量池、符号表等链接至内存管理单元,这里不做限定。
步骤S104中,生成预编译文件时,可以将机器码、源码信息写入预编译文件,还可以将字节码、常量池、机器码和源码信息写入预编译文件。其中,源码信息可以包括源码位置、行列号等信息。需要说明的是,本说明书实施例中,不需要写入全局变量表和全局变量,原因是在后续的运行过程中,虚拟机在初始化时会生成全局变量表,因此,无需在预编译文件中再写入全局变量表,这样可以在一定程度上节约预编译文件的存储空间。
本说明书实施例中,在生成与编译文件之后,还包括以下运行步骤:在所述预编译文件的加载过程中,生成第二全局变量表,所述第二全局变量与所述第一全局变量表所包含的全局变量均相同,所述第二全局变量表中的包含的全局变量均已初始化;将所述预编译文件链接到所述内存管理单元;获取所述字节码、所述常量池以及所述目标源码的源码信息,将所述内存管理单元的机器码与对应的源码进行绑定;运行所述机器码。
具体来讲,在虚拟机初始化时生成第二全局变量表,为了确保目标源码的顺利执行,第二全局表量表包含的全局变量与第一全局变量表包含的全局标量均相同,全局变量的顺序也相同。在一些实施例中,在生成第二全局变量表后,可以将第二全局变量表和第一全局变量表进行匹配,若二者存在差异,则无法执行后续的加载过程,若二者匹配成功,则可继续后续过程。
进一步的,将预编译文件链接到内存管理单元中,其中,链接指的是将预编译文件的内容直接映射到内存管理单元中。获取字节码、常量池和源码信息,可以从目标源码的编译过程中获取,也可以是从预编译文件链接到的内容管理单元获取,这里不做限定。在得到字节码、常量池、源码信息之后,将内存管理单元的机器码与对应的源码进行绑定,然后再运行映射到内存的机器码。其中,通过源码能找到绑定的机器码,即可执行机器码。
为了更好的理解本说明书实施例提供的动态类型语言的提前编译方法,请参考图2,为目标源码的编译和运行过程的示意图,其中编译过程包括以下步骤:
步骤S201:对目标源码进行编译,生成字节码以及常量池;
步骤S202:虚拟机初始化时生成第一全局变量表;
其中,第一全局变量表包括字节码转译成机器码后需要的所有全局变量;
步骤S203:遍历字节码,转译成地址无关的机器码;
其中,可以基于第一全局表量表的首地址、常量池的首地址、目标源码运行时对应的目标相关变量的存储地址,实现机器码的地址无关化;
步骤S204:将机器码链接到内存管理单元;
步骤S205:生成预编译文件;
其中,将所有需要预编译的数据和代码,写入预编译文件中,这些数据和代码,可以只有机器码和源码信息,也可以是字节码、常量池、机器码和源码信息等,但不需要写入全局变量表和全局变量。
运行过程包括以下步骤:
步骤S206:生成第二全局变量表;
步骤S207:将预编译文件链接到内存管理单元;
步骤S208:基于字节码、常量池和源码信息,将机器码与对应的源码进行绑定;
步骤S209:运行机器码。
综上所述,本说明书实施例提供的方案,使用编译执行生成的机器码,不存在字节码读取、分派跳转的开销,能提高执行性能。在运行前,仅需要耗费少量加载的时间开销,具有较好的启动性能。另外,本方案以磁盘文件映射的方式加载机器码,在加载和运行时都不会被改写,虽然大小和编译执行时基本一致,但可以利用linux文件系统对于映射的未修改文件可以重复映射的特点,能够节省实际物理内存,而且如果该段机器码被多个进程使用,还可以通过进程间共享物理内存的方式节省内存。
需要说明的是,本说明书实施例提供的方案,可以适用于提前编译,即在运行前将字节码转译成的机器码,进行地址无关后保存,还可以应用于在运行时,字节码转译成机器码的同时,进行地址无关化以及保存,在以后再次运行时,即无需进行字节码转译,直接加载已经地址无关的机器码。
基于同一发明构思,本说明书实施例还提供一种动态类型语言的提前编译装置,应用于车机,如图3所示,该装置包括:
编译模块301,用于对所述车机的目标源码进行编译,得到字节码、常量池以及第一全局变量表,其中,所述目标源码为动态类型的源码,所述第一全局变量表存储有所述字节码转译成机器码所需要的所有全局变量的地址;
转译模块302,用于基于所述常量池的首地址、所述第一全局变量表的首地址以及所述目标源码运行时对应的相关变量存储位置,将所述字节码转译为机器码;
链接模块303,用于将所述机器码链接到虚拟机的内存管理单元;
生成模块304,用于基于链接到所述内存管理单元的机器码,生成预编译文件。
可选地,所述装置还包括:
第一存储模块,用于将所述第一全局变量表的首地址和所述常量池的首地址存储到预设位置。
可选地,所述装置还包括:
第二存储模块,用于将所述目标源码运行时对应的相关变量按照编译顺序存入栈中。
可选地,转译模块302,用于:
对所述字节码进行遍历,针对每条字节码,若该条字节码在转译过程中需要读取目标全局变量,基于所述目标全局变量对应的第一偏移,生成第一指令,所述第一指令为从内存的第一位置读取数据的指令,所述第一位置为所述第一全局变量表的首地址加所述第一偏移的位置。
可选地,转译模块302,用于:
对所述字节码进行遍历,针对每条字节码,若该条字节码在转译过程中需要读取目标常量数据,基于所述目标常量对应的第二偏移,生成第二指令,所述第二指令为从内存的第二位置读取数据的指令,所述第二位置为所述常量池的首地址加所述第二偏移的位置。
可选地,转译模块302,用于:
对所述字节码进行遍历,针对每条字节码,若该条字节码在转译过程中需要读取所述目标源码运行时对应的目标相关变量,生成第三指令,所述第三指令为从栈上读取所述目标相关变量的指令。
可选地,所述装置还包括:
处理模块,用于在所述预编译文件的加载过程中,生成第二全局变量表,所述第二全局变量与所述第一全局变量表所包含的全局变量均相同,所述第二全局变量表中的包含的全局变量均已初始化;
预编译文件链接模块,用于将所述预编译文件链接到所述内存管理单元;
绑定模块,用于获取所述字节码、所述常量池以及所述目标源码的源码信息,将所述内存管理单元的机器码与对应的源码进行绑定;
运行模块,用于运行所述机器码。
关于上述装置,其中各个部分的具体功能已经在本说明书实施例提供的动态类型语言的提前编译方法中进行了详细描述,此处将不做详细阐述说明。
基于同一发明构思,本发明实施例提供了一种智能汽车,参考图4所示,包括存储器404、处理器402及存储在存储器404上并可在处理器402上运行的计算机程序,处理器402执行程序时实现动态类型语言的提前编译方法实施例中任一种实施方式。
其中,在图4中,总线架构(用总线400来代表),总线400可以包括任意数量的互联的总线和桥,总线400将包括由处理器402代表的一个或多个处理器和存储器404代表的存储器的各种电路链接在一起。总线400还可以将诸如外围设备、稳压器和功率管理电路等之类的各种其他电路链接在一起,这些都是本领域所公知的,因此,本文不再对其进行进一步描述。总线接口405在总线400和接收器401和发送器403之间提供接口。接收器401和发送器403可以是同一个元件,即收发机,提供用于在传输介质上与各种其他装置通信的单元。处理器402负责管理总线400和通常的处理,而存储器404可以被用于存储处理器402在执行操作时所使用的数据。
本文中所描述的功能可在硬件、由处理器执行的软件、固件或其任何组合中实施。如果在由处理器执行的软件中实施,那么可将功能作为一或多个指令或代码存储于计算机可读媒体上或经由计算机可读媒体予以传输。其它实例及实施方案在本发明及所附权利要求书的范围及精神内。举例来说,归因于软件的性质,上文所描述的功能可使用由处理器、硬件、固件、硬连线或这些中的任何者的组合执行的软件实施。此外,各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。
在本申请所提供的几个实施例中,应该理解到,所揭露的技术内容,可通过其它的方式实现。其中,以上所描述的装置实施例仅仅是示意性的,例如所述单元的划分,可以为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信链接可以是通过一些接口,单元或模块的间接耦合或通信链接,可以是电性或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为控制装置的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可为个人计算机、服务器或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、移动硬盘、磁碟或者光盘等各种可以存储程序代码的介质。
应注意的是上述实施例对本发明进行说明而不是对本发明进行限制,并且本领域技术人员在不脱离所附权利要求的范围的情况下可设计出替换实施例。在权利要求中,不应将位于括号之间的任何参考符号构造成对权利要求的限制。单词“包含”不排除存在未列在权利要求中的元件或步骤。位于元件之前的单词“一”或“一个”不排除存在多个这样的元件。本发明可以借助于包括有若干不同元件的硬件以及借助于适当编程的计算机来实现。在列举了若干装置的单元权利要求中,这些装置中的若干个可以是通过同一个硬件项来具体体现。单词第一、第二、以及第三等的使用不表示任何顺序。可将这些单词解释为名称。
本领域技术人员在考虑说明书及实践这里公开的发明后,将容易想到本发明的其它实施方案。本申请旨在涵盖本发明的任何变型、用途或者适应性变化,这些变型、用途或者适应性变化遵循本发明的一般性原理并包括本公开未公开的本技术领域中的公知常识或惯用技术手段。说明书和实施例仅被视为示例性的,本发明的真正范围和精神由下面的权利要求指出。
以上所述仅为本发明的较佳实施例,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
Claims (10)
1.一种动态类型语言的提前编译方法,应用于车机,其特征在于,包括:
对所述车机的目标源码进行编译,得到字节码、常量池以及第一全局变量表,其中,所述目标源码为动态类型的源码,所述第一全局变量表包括所述字节码转译成机器码所需要的所有全局变量的地址;
基于所述常量池的首地址、所述第一全局变量表的首地址以及所述目标源码运行时对应的相关变量存储位置,将所述字节码转译为机器码;
将所述机器码链接到虚拟机的内存管理单元;
基于链接到所述内存管理单元的机器码,生成预编译文件。
2.如权利要求1所述的方法,其特征在于,在所述得到字节码、常量池以及第一全局变量表之后,所述方法还包括:
将所述第一全局变量表的首地址和所述常量池的首地址存储到预设位置。
3.如权利要求1所述的方法,其特征在于,所述方法还包括:
将所述目标源码运行时对应的相关变量按照编译顺序存入栈中。
4.如权利要求1所述的方法,其特征在于,所述基于所述常量池的首地址、所述第一全局变量表的首地址以及所述目标源码运行时对应的相关变量存储位置,将所述字节码转译为机器码,包括:
对所述字节码进行遍历,针对每条字节码,若该条字节码在转译过程中需要读取目标全局变量,基于所述目标全局变量对应的第一偏移,生成第一指令,所述第一指令为从内存的第一位置读取数据的指令,所述第一位置为所述第一全局变量表的首地址加所述第一偏移的位置。
5.如权利要求1所述的方法,其特征在于,所述基于所述常量池的首地址、所述第一全局变量表的首地址以及所述目标源码运行时对应的相关变量存储位置,将所述字节码转译为机器码,包括:
对所述字节码进行遍历,针对每条字节码,若该条字节码在转译过程中需要读取目标常量数据,基于所述目标常量对应的第二偏移,生成第二指令,所述第二指令为从内存的第二位置读取数据的指令,所述第二位置为所述常量池的首地址加所述第二偏移的位置。
6.如权利要求1所述的方法,其特征在于,所述基于所述常量池的首地址、所述第一全局变量表的首地址以及所述目标源码运行时对应的相关变量存储位置,将所述字节码转译为机器码,包括:
对所述字节码进行遍历,针对每条字节码,若该条字节码在转译过程中需要读取所述目标源码运行时对应的目标相关变量,生成第三指令,所述第三指令为从栈上读取所述目标相关变量的指令。
7.如权利要求1所述的方法,其特征在于,在所述基于链接到所述内存管理单元的机器码,生成预编译文件之后,所述方法还包括:
在所述预编译文件的加载过程中,生成第二全局变量表,所述第二全局变量与所述第一全局变量表所包含的全局变量均相同,所述第二全局变量表中的包含的全局变量均已初始化;
将所述预编译文件链接到所述内存管理单元;
获取所述字节码、所述常量池以及所述目标源码的源码信息,将所述内存管理单元的机器码与对应的源码进行绑定;
运行所述机器码。
8.一种动态类型语言的提前编译装置,应用于车机,其特征在于,包括:
编译模块,用于对所述车机的目标源码进行编译,得到字节码、常量池以及第一全局变量表,其中,所述目标源码为动态类型的源码,所述第一全局变量表包括所述字节码转译成机器码所需要的所有全局变量的地址;
转译模块,用于基于所述常量池的首地址、所述第一全局变量表的首地址以及所述目标源码运行时对应的相关变量存储位置,将所述字节码转译为机器码;
链接模块,用于将所述机器码链接到虚拟机的内存管理单元;
生成模块,用于基于链接到所述内存管理单元的机器码,生成预编译文件。
9.一种智能汽车,其特征在于,包括有存储器,以及一个或者多个的程序,其中一个或者多个的程序存储于存储器中,且经配置以由一个或者多个的处理器执行所述一个或者多个的程序所包含的用于进行如权利要求1-7任一所述方法对应的操作指令。
10.一种计算机可读存储介质,其特征在于,其上存储有计算机程序,该程序被处理器执行时实现权利要求1-7任一项所述方法的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202311227225.6A CN117251168A (zh) | 2023-09-21 | 2023-09-21 | 动态类型语言的提前编译方法、装置、智能汽车及介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202311227225.6A CN117251168A (zh) | 2023-09-21 | 2023-09-21 | 动态类型语言的提前编译方法、装置、智能汽车及介质 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN117251168A true CN117251168A (zh) | 2023-12-19 |
Family
ID=89136349
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202311227225.6A Pending CN117251168A (zh) | 2023-09-21 | 2023-09-21 | 动态类型语言的提前编译方法、装置、智能汽车及介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN117251168A (zh) |
-
2023
- 2023-09-21 CN CN202311227225.6A patent/CN117251168A/zh active Pending
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US8037461B2 (en) | Program code conversion | |
US7596783B2 (en) | Methods and apparatus to implement annotation based thunking | |
CN110704063B (zh) | 编译和执行智能合约的方法及装置 | |
EP2348406B1 (en) | Endian conversion tool | |
EP3314396B1 (en) | Technologies for shadow stack manipulation for binary translation systems | |
US8997066B2 (en) | Emulating pointers | |
US7124407B1 (en) | Method and apparatus for caching native code in a virtual machine interpreter | |
JP2008505423A (ja) | 最適化されたプログラムのためのアンワインド情報の生成 | |
WO2007016808A1 (en) | A compiling and translating method and apparatus | |
CN106796525A (zh) | 按需加载动态脚本语言代码以减少内存使用 | |
US8539458B2 (en) | Transforming addressing alignment during code generation | |
CN115700470A (zh) | 文件加载的处理方法和装置,计算机存储介质和电子设备 | |
CN117251168A (zh) | 动态类型语言的提前编译方法、装置、智能汽车及介质 | |
US20100070951A1 (en) | Generic assembler | |
CN114706586A (zh) | 代码编译、代码运行方法、装置、计算机设备及存储介质 | |
CN115167862A (zh) | 补丁方法及相关设备 | |
CN115981652B (zh) | 语言互操作方法、装置、存储介质及程序产品 | |
US20100115498A1 (en) | Adaptive production of assembler | |
CN117251169A (zh) | 动态类型语言的提前编译方法、装置、智能汽车及介质 | |
CN117950675A (zh) | 二进制翻译方法、装置、电子设备及可读存储介质 | |
CN115543332A (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 |