CN117251169A - 动态类型语言的提前编译方法、装置、智能汽车及介质 - Google Patents

动态类型语言的提前编译方法、装置、智能汽车及介质 Download PDF

Info

Publication number
CN117251169A
CN117251169A CN202311229962.XA CN202311229962A CN117251169A CN 117251169 A CN117251169 A CN 117251169A CN 202311229962 A CN202311229962 A CN 202311229962A CN 117251169 A CN117251169 A CN 117251169A
Authority
CN
China
Prior art keywords
data
source code
file
compiling
advanced
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
Application number
CN202311229962.XA
Other languages
English (en)
Inventor
余超君
李庆岩
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Zebred Network Technology Co Ltd
Original Assignee
Zebred Network Technology Co Ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Zebred Network Technology Co Ltd filed Critical Zebred Network Technology Co Ltd
Priority to CN202311229962.XA priority Critical patent/CN117251169A/zh
Publication of CN117251169A publication Critical patent/CN117251169A/zh
Pending legal-status Critical Current

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/54Link editing before load time
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements 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/44Arrangements for executing specific programs
    • G06F9/455Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
    • G06F9/45504Abstract machines for programme code execution, e.g. Java virtual machine [JVM], interpreters, emulators
    • G06F9/45508Runtime interpretation or emulation, e g. emulator loops, bytecode interpretation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements 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/44Arrangements for executing specific programs
    • G06F9/455Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
    • G06F9/45533Hypervisors; Virtual machine monitors
    • G06F9/45558Hypervisor-specific management and integration aspects
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements 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/44Arrangements for executing specific programs
    • G06F9/455Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
    • G06F9/45533Hypervisors; Virtual machine monitors
    • G06F9/45558Hypervisor-specific management and integration aspects
    • G06F2009/45583Memory 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)
  • Stored Programmes (AREA)

Abstract

本发明公开了一种动态类型语言的提前编译方法、装置、智能汽车及介质,所述方法包括:将车机对应的源码集合进行编译,得到与所述源码集合对应的源码描述数据以及机器码,其中,所述源码描述数据包含所述源码集合中每个源码文件的描述数据,所述机器码包含所每个源码文件的机器码,所述每个源码文件为动态类型的源码;将所述源码描述数据和所述机器码按照预设数据结构进行拼接,得到提前编译数据;基于所述提前编译数据,生成汇编文件,并基于所述汇编文件,生成动态链接库文件。本方案能够有效避免编译开销,减少了源码加载和执行的时间。

Description

动态类型语言的提前编译方法、装置、智能汽车及介质
技术领域
本发明涉及车辆技术领域,特别涉及一种动态类型语言的提前编译方法、装置、智能汽车及介质。
背景技术
计算机语言,是一种计算机和用户都能识别的语言,用户通过计算机语言精确的定义计算机数据和程序,来完成想要通过计算机完成实现的功能,计算机语言最终会编译成数据和机器码在计算机上运行。动态类型语言,指的是计算机语言的数据类型不是在编译阶段决定的,而是把类型绑定和检测延后到了运行阶段。
现有技术中,虚拟机技术,是执行动态类型语言源码的技术。虚拟机将源码编译成程序执行时必要的数据和字节码,然后逐条解释执行字节码,或者将字节码转译成机器码组合起来,然后在CPU上执行。由于该种方式中在运行时需要解释执行或编译的流程,进而造成编译带来的时间开销。
发明内容
本发明实施例提供一种动态类型语言的提前编译方法、装置、智能汽车及介质,以提高执行性能,减少加载的时间开销。
第一方面,本发明实施例提供一种动态类型语言的提前编译方法,应用于车机,包括:
将所述车机对应的源码集合进行编译,得到与所述源码集合对应的源码描述数据以及机器码,其中,所述源码描述数据包含所述源码集合中每个源码文件的描述数据,所述机器码包含所每个源码文件的机器码,所述每个源码文件为动态类型的源码;
将所述源码描述数据和所述机器码按照预设数据结构进行拼接,得到提前编译数据;
基于所述提前编译数据,生成汇编文件,并基于所述汇编文件,生成动态链接库文件。
可选地,所述生成汇编文件之前,所述方法还包括:获取与所述源码集合对应的调试数据;
所述基于所述提前编译数据,生成汇编文件,包括:
将所述提前编译数据按照预设规范输出到所述汇编文件;
将所述调试数据按照预设格式输出到所述汇编文件的目标位置,以通过程序调试器进行源码调试。
可选地,所述将所述源码描述数据和所述机器码按照预设数据结构进行拼接,得到提前编译数据,包括:
针对所述预设数据结构中的每个数据段,从所述机器码和所述源码描述数据中筛选出与该数据段对应的数据,并将筛选出来的数据对应写入该数据段中,以得到所述提前编译数据。
可选地,所述预设数据结构中包含函数数据段,所述针对所述预设数据结构中的每个数据段,从所述机器码和所述源码描述数据中筛选出与该数据段对应的数据,并将筛选出来的数据对应写入该数据段中,包括:
基于所述源码描述数据中包含的每个源码文件,确定出所述每个源码文件包含的函数数据;
基于所述每个源码文件的输入顺序、以及所述每个源码文件中包含的函数数据的顺序,将所述每个源码文件中包含的函数数据写入所述函数数据段。
可选地,所述汇编文件包括header段、text段、data段以及rodata段,所述预设数据结构中包含机器码段;
所述header段,用于存储所述源码集合中包含的源码文件的文件名以及序号;
所述text段,用于存储所述提前编译数据中的预设数据结构;
所述data段,用于第一变量,其中,在加载所述动态链接库时,通过所述第一变量用于被设置为指向所述预设数据结构的起始地址;
所述rodata段,用于存储第二变量,其中,在加载所述动态链接库时,通过所述第二变量获取所述预设数据结构的数据大小。
可选地,所述生成动态链接库文件之后,所述方法还包括:
加载所述动态链接库,以解析出所述提前编译数据中的函数数据;
对解析出来的函数数据进行遍历,确定每个函数数据的源码是否已经加载,其中,针对所述每个函数数据,若该函数数据的源码已加载,将该函数数据对应的机器码进行绑定;若该函数数据的源码未加载,则在源码加载时再绑定该函数对应的机器码。
可选地,所述加载所述动态链接库,以解析出所述提前编译数据中的函数数据,包括:
加载所述动态链接库,确定所述提前编译数据的预设数据结构的起始地址和所述提前编译数据的预设数据结构的数据大小;
基于所述提前编译数据的预设数据结构的起始地址和所述提前编译数据的预设数据结构的数据大小,解析出所述提前编译数据中的所述预设数据结构中的数据,以得到所述函数数据。
第二方面,本发明实施例提供一种动态类型语言的提前编译装置,应用于车机,包括:
编译模块,用于将所述车机对应的源码集合进行编译,得到与所述源码集合对应的源码描述数据以及机器码,其中,所述源码描述数据包含所述源码集合中每个源码文件的描述数据,所述机器码包含所每个源码文件的机器码,所述每个源码文件为动态类型的源码;
处理模块,用于将所述源码描述数据和所述机器码按照预设数据结构进行拼接,得到提前编译数据;
生成模块,用于基于所述提前编译数据,生成汇编文件,并基于所述汇编文件,生成动态链接库文件。
第三方面,本发明实施提供一种智能汽车,包括有存储器,以及一个或者多个的程序,其中一个或者多个的程序存储于存储器中,且经配置以由一个或者多个的处理器执行所述一个或者多个的程序所包含的用于执行第一方面提供的任一方法对应的操作指令。
第四方面,本发明实施例提供一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现第一方面提供的任一方法的步骤。
本申请实施例中的上述一个或至少一个技术方案,至少具有如下技术效果:
本说明书实施例提供的动态类型语言的提前编译方法,通过对车机对应的动态类型的源码集合进行编译,得到源码集合的源码描述数据以及机器码,所述源码描述数据包含所述源码集合中每个源码文件的描述数据,所述机器码包含所每个源码文件的机器码;将机器码以及源码描述数据按照预设数据结构进行拼接,得到提前编译数据;基于提前编译数据,生成汇编文件,并将汇编文件编译出动态链接库。本方案,将源码集合中的每个源码文件提前编译成机器码,在执行源码前,便可以预先加载和链接生成的动态链接库,直接执行源码对应库文件中的机器码,避免了编译开销,减少了源码加载和执行的时间,并且具有较少的内存占用。
附图说明
图1为本说明书实施例提供的一种动态类型语言的提前编译方法的流程图;
图2为本说明书实施例提供的一种提前编译数据的数据结构示意图;
图3为本说明书实施例提供的一种动态链接库加载过程的流程图;
图4为本说明书实施例提供的一种动态类型语言的提前编译装置的示意图;
图5为本说明书实施例提供的一种智能汽车的示意图。
具体实施方式
本申请实施例的技术方案总体思路如下:将所述车机对应的源码集合进行编译,得到与所述源码集合对应的源码描述数据以及机器码,其中,所述源码描述数据包含所述源码集合中每个源码文件的描述数据,所述机器码包含所每个源码文件的机器码,所述每个源码文件为动态类型的源码;将所述源码描述数据和所述机器码按照预设数据结构进行拼接,得到提前编译数据;基于所述提前编译数据,生成汇编文件,并基于所述汇编文件,生成动态链接库文件。
本方案,将源码集合中的每个源码文件提前编译成机器码,在执行源码前,便可以预先加载和链接生成的动态链接库,直接执行源码对应库文件中的机器码,避免了编译开销,减少了源码加载和执行的时间,并且具有较少的内存占用。
为了更好的理解上述技术方案,下面通过附图以及具体实施例对本说明书实施例的技术方案做详细的说明,应当理解本说明书实施例以及实施例中的具体特征是对本说明书实施例技术方案的详细的说明,而不是对本说明书技术方案的限定,在不冲突的情况下,本说明书实施例以及实施例中的技术特征可以相互组合。
首先说明,本文中出现的术语“和/或”,仅仅是一种描述关联对象的关联关系,表示可以存在三种关系,例如,A和/或B,可以表示:单独存在A,同时存在A和B,单独存在B这三种情况。另外,本文中字符“/”,一般表示前后关联对象是一种“或”的关系。
如图1所示,为本说明书实施例提供的一种动态类型语言的提前编译方法的流程图,具体包括以下步骤:
步骤S101:将所述车机对应的源码集合进行编译,得到与所述源码集合对应的源码描述数据以及机器码,其中,所述源码描述数据包含所述源码集合中每个源码文件的描述数据,所述机器码包含所每个源码文件的机器码,所述每个源码文件为动态类型的源码;
步骤S102:将所述源码描述数据和所述机器码按照预设数据结构进行拼接,得到提前编译数据;
步骤S103:基于所述提前编译数据,生成汇编文件,并基于所述汇编文件,生成动态链接库文件。
本说明书实施例中的方法,可以应用于车机中。需要说明的是,动态类型语言的源码,例如JavaScript,通常是从云端上下载下来再执行的,由于场景的实时性,上一次执行的代码和本次执行的源码可能不一样,因此,一般不会对动态类型的源码进行提前编译。而在车机领域,源码通常是存储在车机的磁盘中,每次执行的源码是相同的,并不具有太多场景的实时性,因此,针对车机的源码进行提前编译,能够有效提高执行速度和性能。
步骤S101中,源码集合可以是车机上存储的需要进行提前编译的动态类型的源码文件的集合,源码集合中可以包含有一个或多个源码文件。应理解的是,源码文件的具体类型可以根据实际需要进行选择,例如,源码文件为JavaScript。本说明书实施例中,针对源码集合中的每个源码文件,均可以通过虚拟机的编译器,经过词法分析、语法分析等传统编译步骤后,得到每个源码文件的描述数据以及机器码。所有源码文件的描述数据组成源码集合对应的源码描述数据,所有源码文件的机器码组成源码集合对应的机器码。其中,源码集合对应的源码描述数据可以包括但不限于源码集合中包含的各个函数的函数名、函数所在源码文件的文件名、函数包含的参数信息、各行源码对应的机器码的行列号信息等。
步骤S102中,提前编译数据(AOT data)的预设数据结构可以根据实际需要进行设定,预设数据结构中包括多个数据段,在构建提前编译数据中,可以根据数据段对应的内容,筛选每个数据段所对应的数据,通过写入每个数据段的数据,得到提前编译数据。
在具体实施过程中,步骤S102可以通过以下步骤来实现:针对所述预设数据结构中的每个数据段,从所述机器码和所述源码描述数据中筛选出与该数据段对应的数据,并将筛选出来的数据对应写入该数据段中,以得到所述提前编译数据。
在一些实施例中,如图2所示,在源码集合中的源码文件为JavaScript时,预设数据结构可以包括以下数据段:AOT Data Hash、Isolate Hash、Script Count、StringsSize、Source Position Tables Size、Script Datas、Function Datas、Strings、SourcePosition Table、Codes。
其中,AOT Data Hash数据段对应提前编译数据(AOT data)中所有数据的hash值,用于检测数据的完整性。
Isolate Hash数据段对应于生成提前编译数据时,关联的虚拟机数据的hash值,用于检测生成和加载时的数据一致性。
Script Count数据段对应当前编译的js文件的总个数。
Strings Size数据段对应string table占用的总大小。
Source Position Tables Size数据段对应source position table占用内存的大小。
Script Datas数据段对应script data的集合,每个script data代表一个js文件,其中,Script Datas数据段中的数据按照编译时文件的编译顺序,在string table的索引中依次放入每个文件的全路径名称。
Function Datas数据段对应function data的集合,每个function data代表一个js函数。其中,可以按照每个文件编译时各个函数的编译顺序,依次放入函数名在stringtable的索引,Function Datas数据段中的内容还可以包括函数对应的文件编号,函数对应的二进制代码在code区域的偏移,函数对应的二进制代码的内存占用大小,函数对应的source position table的偏移等。
Strings数据段对应所有Script Datas和Function Datas使用的字符串,用来存储文件名、函数名等。
Source Position Table数据段存储有源码对应的机器码的行列信息,记录每一行源码对应的机器码从哪一条指令开始,哪一条指令结束。
Codes数据段对应编译的所有文件里所有函数的二进制代码,并且各个函数的首地址被Function Datas间接引用,方便通过函数数据查找对应函数的二进制代码。
本说明书实施例中,所述预设数据结构中包含函数数据段,在生成提前编译数据时,基于所述源码描述数据中包含的每个源码文件,确定出所述每个源码文件包含的函数数据;基于所述每个源码文件的输入顺序、以及所述每个源码文件中包含的函数数据的顺序,将所述每个源码文件中包含的函数数据写入所述函数数据段。
具体来讲,函数数据段,即上述FunctionDatas数据段,其中的数据可以是按照源码文件的输入顺序排列的。例如,仍以JavaScript为例,源码集合对应的两个源码文件,按顺序排列依次为ScriptData_1、ScriptData_2,假设ScriptData_1有3个function,依次为function_1、function_2、function_3,ScriptData_2有2个function,依次为function_4、function_5。则在FunctionDatas区,ScriptData_1对应的function_1、function_2、function_3的数据依次排在第1-3位,ScriptData_2对应的function_4、function_5的数据依次排在第4、5位。
步骤S103中,在得到提前编译数据后,基于提前编译数据生成汇编文件,并基于汇编文件生成动态链接库文件。在具体实施过程中,提前编译数据可以以遵循目标体系架构汇编格式的数据形式输出到汇编文件,即提前编译数据结构的各个域都会输出到汇编文件的特定段中。在一些实施方式中,提前编译可以遵循gcc as规范,输出到汇编文件中。
本说明书实施例中,考虑到现有技术中在对源码进行调试时,需要通过虚拟机自己定义的协议进行调试,调试过程复杂繁琐,因此,为了便于对源码进行调试,本说明书实施例中,在生成汇编文件时,还包括以下步骤:获取与所述源码集合对应的调试数据;将所述提前编译数据按照预设规范输出到所述汇编文件;将所述调试数据按照预设格式输出到所述汇编文件的目标位置,以通过程序调试器进行源码调试。
具体来讲,调试数据可以包括但不限于函数的函数名、所在文件的文件名、函数包含的参数名、参数类型、机器码对应的行列号信息等。在生成汇编文件时,提前编译数据可以按照预设规范输出到汇编文件中,其中,预设规范可以根据实际需要进行设定,如gcc as规范。同时,调试数据也可以按照预设格式输出到汇编文件的目标位置,其中,预设格式可以根据实际需要进行设定,例如,预设格式为DWARF格式。目标位置可以根据调试数据的类型来进行确定,在一些实施方式中,文件名可以放入.file域,函数名可以放入每个函数的二级制代码的开始位置,行列信息可以插入二进制代码的.loc域等,还可以补充调试相关标记,比如.debug_line标记。
本说明书实施例中,汇编文件的格式可以根据实际需要进行设定,为了便于理解,这里对其中的一种汇编文件的格式进行说明:汇编文件包括header段、text段、data段以及rodata段。所述header段,用于存储所述源码文件的文件名以及序号;所述text段,用于存储所述提前编译数据中的预设数据结构;所述data段,用于存储第一变量,其中,在加载所述动态链接库时,通过所述第一变量用于被设置为指向所述预设数据结构的起始地址;所述rodata段,用于存储第二变量,其中,在加载所述动态链接库时,通过所述第二变量获取所述预设数据结构的数据大小。
具体来讲,以源码集合中的源码文件为JavaScript、按照gcc as格式输出的汇编文件为例。汇编文件的header段存储有源码集合中包含的js文件以及序号,为了便于理解,下面通过代码来进行说明,其中,header段如以下代码所示:
//Autogenerated file.Do not edit.
//Source positions in the AOT blob refer to filenames by id.
//Assembly directives here map the id to a filename.
.file 1"navier-stokes.js"
.file 2"box2d.js"
.file 3"gbemu-part2.js"
.file 4"code-load.js"
.file 5"run.js"
.file 6"base.js"
.file 7"raytrace.js"
汇编文件中的text段,存储有提前编译数据的预设数据结构,具体可以包括两部分,第一部分为预设数据结构中除了Codes数据段以外的所有数据,按照gcc as规范以数据的方式输出在text段,并记录提前编译数据、即AOT data数据结构的起始地址。在一些实施例中,以虚拟机为V8虚拟机为例,可以使用v8_Default_AOT_blob_data,并指向AOT data数据结构的起始地址,作为标记text段的起始地址。
汇编文件中的text段的第二部分,可以包括预设数据结构中的Codes段的数据,其中,每个code可以以code_[x]_[y]作为函数名,x可以为header段中的js序号,y为该函数在提前编译数据中的Function Datas里记载的本文件的文件编号。需要说明的是,若存在调试需求,可以将code按照source position table设置.loc标记。以.loc a b为例,a是header里的js文件序号,b是此行源码的行号。
汇编文件中的data段,存储第一变量,仍以V8虚拟机为例,第一变量可以为v8_Default_AOT_blob,指向text段的v8_Default_AOT_blob_data标记位置,即提前编译数据的预设数据结构的起始地址,便于在加载时,通过第一变量获取该地址。为了便于理解,给出以下data段的示例性代码:
//Pointer to the beginning of the AOT blob.
.section.data
.balign 8
.global v8_Default_AOT_blob_
v8_Default_AOT_blob_:
.quad v8_Default_AOT_blob_data_
汇编文件中的rodata段,存储第二变量,仍以V8虚拟机为例,第二变量可以为v8_Default_AOT_blob_size,即提前编译数据的预设数据结构对应的数据大小,便于在加载时,通过第二变量获取预设数据结构的数据大小。为了便于理解,给出以下rodata段的示例性代码:
//The size of the AOT blob in bytes.
.section.rodata
.balign 8
.global v8_Default_AOT_blob_size_
v8_Default_AOT_blob_size_:
.long 145057088
.section.note.GNU-stack,"",%progbits
进一步的,在生成汇编文件之后,可以通过编译器将汇编文件编译成动态链接库文件,在一些实施例中,可以通过gcc编译器将汇编文件编译出可动态链接的so库。其中,动态链接库文件可以为符合ELF文件格式且具有DWARF格式的调试信息的文件。
其中,ELF(Executable and Linkable Format),即可执行可链接文件格式,是一种用于二进制文件、可执行文件、目标代码、共享库和core转存格式文件。是UNIX系统实验室(USL)作为应用程序二进制接口(Application Binary Interface,ABI)而开发和发布的,也是Linux的主要可执行文件格式。
另外,由于具有DWARF格式的调试信息,能够通过GDB直接进行调试。其中,GDB(GNUsymbolic debugger)是Linux下常用的程序调试器,用于程序调试,发现和解决程序中的功能性问题。
本说明书实施例中,在执行阶段,还可以包括以下加载过程:加载所述动态链接库,以解析出所述提前编译数据中的函数数据;对解析出来的函数数据进行遍历,确定每个函数数据的源码是否已经加载,其中,针对所述每个函数数据,若该函数数据的源码已加载,将该函数数据对应的机器码进行绑定;若该函数数据的源码未加载,则在源码加载时再绑定该函数对应的机器码。
其中,解析提前编译数据中的函数数据可以通过以下步骤来实现:加载所述动态链接库,确定所述提前编译数据的预设数据结构的起始地址和所述提前编译数据的预设数据结构的数据大小;基于所述提前编译数据的预设数据结构的起始地址和所述提前编译数据的预设数据结构的数据大小,解析出所述提前编译数据中的所述预设数据结构中的数据,以得到所述函数数据。
在一些实施方式中,仍以V8虚拟机为例,可以通过dlopen加载通过上述方式生成的动态链接库,库文件里的全局符号能够进行自动链接。进一步的,可以使用dlsym获取AOTdata预设数据结构的起始地址和大小,具体的,通过dlsym能够获取动态链接库内的全局变量v8_Default_AOT_blob(AOT data预设数据结构的起始地址)和v8_Default_AOT_blob_size(AOT data预设数据结构的数据大小)。通过AOT data预设数据结构的起始地址和AOTdata预设数据结构的数据大小,解析出AOT data数据结构里的各个数据,包括scriptdata,function data等,即函数数据。遍历每个script data里包含的各个function data,若该函数的源码已加载,则将机器码绑定到对应函数的数据结构上,若该函数的源码未加载,则保存相关信息,等待注册绑定,并继续执行遍历过程,直到遍历结束。
为了对本说明书实施例中的加载过程进行更好的说明,请参考图3,为动态链接库加载过程的流程图,包括以下步骤:
步骤S301:通过dlopen加载动态链接库;
步骤S302:通过dlsym获取AOT data预设数据结构的起始地址和数据大小;
步骤S303:通过AOT data预设数据结构的起始地址和数据大小,解析出各个script data和function data;
步骤S304:遍历AOT data里各个script data里的function data;
步骤S305:判断函数是否加载,若是,执行步骤S306,若否,执行步骤S307;
步骤S306:将对应机器码与源码进行绑定;
步骤S307:等待注册绑定。
综上,本说明书实施例中的方法,由于直接存储提前编译的机器码,没有字节码读取、分派跳转的开销,能够有效提高执行性能,仅需要耗费少量加载的时间开销,具有较好的启动性能。另外,本方案生成的动态链接库文件,加载后可以进程间共享代码段,并且代码段是只读的,在系统整体内存紧张时,其占用的内存可以被释放给其他进程,需要使用时再重新从磁盘加载进内存。进一步的,本方案通过输出成符合ELF文件格式且具有DWARF格式调试信息的动态库文件,可以通过GDB进行调试。
通过将源码提前编译成机器码,在执行源码前,便可以预先加载和链接生成的动态链接库,避免了编译开销,减少了源码加载和执行的时间,并且具有较少的内存占用。
基于同一发明构思,本说明书实施例还提供一种动态类型语言的提前编译装置,应用于车机,如图4所示,该装置包括:
编译模块401,用于将所述车机对应的源码集合进行编译,得到与所述源码集合对应的源码描述数据以及机器码,其中,所述源码描述数据包含所述源码集合中每个源码文件的描述数据,所述机器码包含所每个源码文件的机器码,所述每个源码文件为动态类型的源码;
处理模块402,用于将所述源码描述数据和所述机器码按照预设数据结构进行拼接,得到提前编译数据;
生成模块403,用于基于所述提前编译数据,生成汇编文件,并基于所述汇编文件,生成动态链接库文件。
可选地,所述装置法还包括:
调试数据获取模块,用于获取与所述源码集合对应的调试数据;
生成模块403,用于:将所述提前编译数据按照预设规范输出到所述汇编文件;将所述调试数据按照预设格式输出到所述汇编文件的目标位置,以通过程序调试器进行源码调试。
可选地,处理模块402,用于:
针对所述预设数据结构中的每个数据段,从所述机器码和所述源码描述数据中筛选出与该数据段对应的数据,并将筛选出来的数据对应写入该数据段中,以得到所述提前编译数据。
可选地,所述预设数据结构中包含函数数据段,处理模块402,用于:
基于所述源码描述数据中包含的每个源码文件,确定出所述每个源码文件包含的函数数据;
基于所述每个源码文件的输入顺序、以及所述每个源码文件中包含的函数数据的顺序,将所述每个源码文件中包含的函数数据写入所述函数数据段。
可选地,所述汇编文件包括header段、text段、data段以及rodata段,所述预设数据结构中包含机器代码段;
所述header段,用于存储所述源码集合中包含的源码文件的文件名以及序号;
所述text段,用于存储所述提前编译数据中的预设数据结构;
所述data段,用于第一变量,其中,在加载所述动态链接库时,通过所述第一变量用于被设置为指向所述预设数据结构的起始地址;
所述rodata段,用于存储第二变量,其中,在加载所述动态链接库时,通过所述第二变量获取所述预设数据结构的数据大小。
可选地,所述装置还包括:
加载模块,用于加载所述动态链接库,以解析出所述提前编译数据中的函数数据;
遍历模块,用于对解析出来的函数数据进行遍历,确定每个函数数据的源码是否已经加载,其中,针对所述每个函数数据,若该函数数据的源码已加载,将该函数数据对应的机器码进行绑定;若该函数数据的源码未加载,则在源码加载时再绑定该函数对应的机器码,且继续对解析出来的函数数据进行遍历,直到遍历结束。
可选地,所述加载模块,用于:
加载所述动态链接库,确定所述提前编译数据的预设数据结构的起始地址和所述提前编译数据的预设数据结构的数据大小;
基于所述提前编译数据的预设数据结构的起始地址和所述提前编译数据的预设数据结构的数据大小,解析出所述提前编译数据中的所述预设数据结构中的数据,以得到所述函数数据。
关于上述装置,其中各个部分的具体功能已经在本说明书实施例提供的动态类型语言的提前编译方法中进行了详细描述,此处将不做详细阐述说明。
基于同一发明构思,本发明实施例提供了一种智能汽车,参考图5所示,包括存储器504、处理器502及存储在存储器504上并可在处理器502上运行的计算机程序,处理器502执行程序时实现动态类型语言的提前编译方法实施例中任一种实施方式。
其中,在图5中,总线架构(用总线500来代表),总线500可以包括任意数量的互联的总线和桥,总线500将包括由处理器502代表的一个或多个处理器和存储器504代表的存储器的各种电路链接在一起。总线500还可以将诸如外围设备、稳压器和功率管理电路等之类的各种其他电路链接在一起,这些都是本领域所公知的,因此,本文不再对其进行进一步描述。总线接口505在总线500和接收器501和发送器503之间提供接口。接收器501和发送器503可以是同一个元件,即收发机,提供用于在传输介质上与各种其他装置通信的单元。处理器502负责管理总线500和通常的处理,而存储器504可以被用于存储处理器502在执行操作时所使用的数据。
本文中所描述的功能可在硬件、由处理器执行的软件、固件或其任何组合中实施。如果在由处理器执行的软件中实施,那么可将功能作为一或多个指令或代码存储于计算机可读媒体上或经由计算机可读媒体予以传输。其它实例及实施方案在本发明及所附权利要求书的范围及精神内。举例来说,归因于软件的性质,上文所描述的功能可使用由处理器、硬件、固件、硬连线或这些中的任何者的组合执行的软件实施。此外,各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。
在本申请所提供的几个实施例中,应该理解到,所揭露的技术内容,可通过其它的方式实现。其中,以上所描述的装置实施例仅仅是示意性的,例如所述单元的划分,可以为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,单元或模块的间接耦合或通信连接,可以是电性或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为控制装置的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可为个人计算机、服务器或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、移动硬盘、磁碟或者光盘等各种可以存储程序代码的介质。
应注意的是上述实施例对本发明进行说明而不是对本发明进行限制,并且本领域技术人员在不脱离所附权利要求的范围的情况下可设计出替换实施例。在权利要求中,不应将位于括号之间的任何参考符号构造成对权利要求的限制。单词“包含”不排除存在未列在权利要求中的元件或步骤。位于元件之前的单词“一”或“一个”不排除存在多个这样的元件。本发明可以借助于包括有若干不同元件的硬件以及借助于适当编程的计算机来实现。在列举了若干装置的单元权利要求中,这些装置中的若干个可以是通过同一个硬件项来具体体现。单词第一、第二、以及第三等的使用不表示任何顺序。可将这些单词解释为名称。
本领域技术人员在考虑说明书及实践这里公开的发明后,将容易想到本发明的其它实施方案。本申请旨在涵盖本发明的任何变型、用途或者适应性变化,这些变型、用途或者适应性变化遵循本发明的一般性原理并包括本公开未公开的本技术领域中的公知常识或惯用技术手段。说明书和实施例仅被视为示例性的,本发明的真正范围和精神由下面的权利要求指出。
以上所述仅为本发明的较佳实施例,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

Claims (10)

1.一种动态类型语言的提前编译方法,应用于车机,其特征在于,包括:
将所述车机对应的源码集合进行编译,得到与所述源码集合对应的源码描述数据以及机器码,其中,所述源码描述数据包含所述源码集合中每个源码文件的描述数据,所述机器码包含所每个源码文件的机器码,所述每个源码文件为动态类型的源码;
将所述源码描述数据和所述机器码按照预设数据结构进行拼接,得到提前编译数据;
基于所述提前编译数据,生成汇编文件,并基于所述汇编文件,生成动态链接库文件。
2.如权利要求1所述的方法,其特征在于,所述生成汇编文件之前,所述方法还包括:获取与所述源码集合对应的调试数据;
所述基于所述提前编译数据,生成汇编文件,包括:
将所述提前编译数据按照预设规范输出到所述汇编文件;
将所述调试数据按照预设格式输出到所述汇编文件的目标位置,以通过程序调试器进行源码调试。
3.如权利要求1所述的方法,其特征在于,所述将所述源码描述数据和所述机器码按照预设数据结构进行拼接,得到提前编译数据,包括:
针对所述预设数据结构中的每个数据段,从所述机器码和所述源码描述数据中筛选出与该数据段对应的数据,并将筛选出来的数据对应写入该数据段中,以得到所述提前编译数据。
4.如权利要求3所述的方法,其特征在于,所述预设数据结构中包含函数数据段,所述针对所述预设数据结构中的每个数据段,从所述机器码和所述源码描述数据中筛选出与该数据段对应的数据,并将筛选出来的数据对应写入该数据段中,包括:
基于所述源码描述数据中包含的每个源码文件,确定出所述每个源码文件包含的函数数据;
基于所述每个源码文件的输入顺序、以及所述每个源码文件中包含的函数数据的顺序,将所述每个源码文件中包含的函数数据写入所述函数数据段。
5.如权利要求1所述的方法,其特征在于,所述汇编文件包括header段、text段、data段以及rodata段,所述预设数据结构中包含机器代码段;
所述header段,用于存储所述源码集合中包含的源码文件的文件名以及序号;
所述text段,用于存储所述提前编译数据的预设数据结构;
所述data段,用于存储第一变量,其中,在加载所述动态链接库时,通过所述第一变量用于被设置为指向所述预设数据结构的起始地址;
所述rodata段,用于存储第二变量,其中,在加载所述动态链接库时,通过所述第二变量获取所述预设数据结构的数据大小。
6.如权利要求1所述的方法,其特征在于,所述生成动态链接库文件之后,所述方法还包括:
加载所述动态链接库,以解析出所述提前编译数据中的函数数据;
对解析出来的函数数据进行遍历,确定每个函数数据的源码是否已经加载,其中,针对所述每个函数数据,若该函数数据的源码已加载,将该函数数据对应的机器码进行绑定;若该函数数据的源码未加载,则在源码加载时再绑定该函数对应的机器码。
7.如权利要求6所述的方法,其特征在于,所述加载所述动态链接库,以解析出所述提前编译数据中的函数数据,包括:
加载所述动态链接库,确定所述提前编译数据的预设数据结构的起始地址和所述提前编译数据的预设数据结构的数据大小;
基于所述提前编译数据的预设数据结构的起始地址和所述提前编译数据的预设数据结构的数据大小,解析出所述提前编译数据中的所述预设数据结构中的数据,以得到所述函数数据。
8.一种动态类型语言的提前编译装置,应用于车机,其特征在于,包括:
编译模块,用于将所述车机对应的源码集合进行编译,得到与所述源码集合对应的源码描述数据以及机器码,其中,所述源码描述数据包含所述源码集合中每个源码文件的描述数据,所述机器码包含所每个源码文件的机器码,所述每个源码文件为动态类型的源码;
处理模块,用于将所述源码描述数据和所述机器码按照预设数据结构进行拼接,得到提前编译数据;
生成模块,用于基于所述提前编译数据,生成汇编文件,并基于所述汇编文件,生成动态链接库文件。
9.一种智能汽车,其特征在于,包括有存储器,以及一个或者多个的程序,其中一个或者多个的程序存储于存储器中,且经配置以由一个或者多个的处理器执行所述一个或者多个的程序所包含的用于进行如权利要求1-7任一所述方法对应的操作指令。
10.一种计算机可读存储介质,其特征在于,其上存储有计算机程序,该程序被处理器执行时实现权利要求1-7任一项所述方法的步骤。
CN202311229962.XA 2023-09-21 2023-09-21 动态类型语言的提前编译方法、装置、智能汽车及介质 Pending CN117251169A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202311229962.XA CN117251169A (zh) 2023-09-21 2023-09-21 动态类型语言的提前编译方法、装置、智能汽车及介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202311229962.XA CN117251169A (zh) 2023-09-21 2023-09-21 动态类型语言的提前编译方法、装置、智能汽车及介质

Publications (1)

Publication Number Publication Date
CN117251169A true CN117251169A (zh) 2023-12-19

Family

ID=89127507

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202311229962.XA Pending CN117251169A (zh) 2023-09-21 2023-09-21 动态类型语言的提前编译方法、装置、智能汽车及介质

Country Status (1)

Country Link
CN (1) CN117251169A (zh)

Similar Documents

Publication Publication Date Title
JP4833206B2 (ja) 最適化されたプログラムのためのアンワインド情報の生成
US7890941B1 (en) Binary profile instrumentation framework
US7596783B2 (en) Methods and apparatus to implement annotation based thunking
JP5893038B2 (ja) ユーザ定義型のコンパイル時境界検査
US7698692B1 (en) Preparing a binary file for future instrumentation
CN111796831B (zh) 一种多芯片兼容的编译方法和装置
CN110704063B (zh) 编译和执行智能合约的方法及装置
US20030093780A1 (en) Annotations to executable images for improved dynamic optimization of functions
CN108304175B (zh) 代码文件隔离打包方法及装置
JP2002527815A (ja) プログラムコード変換方法
US5926639A (en) Embedded flow information for binary manipulation
US6625807B1 (en) Apparatus and method for efficiently obtaining and utilizing register usage information during software binary translation
US6986126B2 (en) Method and apparatus for detecting violations of type rules in a computer program
CN117251169A (zh) 动态类型语言的提前编译方法、装置、智能汽车及介质
CN108614704B (zh) 代码编译方法及装置
CN112882701A (zh) 一种支持多架构的可执行文件静态插桩技术框架
CN113031956A (zh) 程序编译方法和装置以及程序运行方法和装置
US20140351799A1 (en) Binary interface instrumentation
CN112799942B (zh) 基于Keil C51的软件源码和目标码覆盖率分析方法和系统
CN116089316B (zh) 一种基于动态断点的内核驱动数据调试方法
CN118069143A (zh) 访存处理方法、装置、电子设备及存储介质
WO2023164897A1 (zh) 一种二进制程序的优化方法及装置
CN117251168A (zh) 动态类型语言的提前编译方法、装置、智能汽车及介质
CN118069142A (zh) 编译优化方法、装置、电子设备及存储介质
CN118260187A (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