CN118113289A - 代码编译方法、代码运行方法及相关设备 - Google Patents

代码编译方法、代码运行方法及相关设备 Download PDF

Info

Publication number
CN118113289A
CN118113289A CN202211517755.XA CN202211517755A CN118113289A CN 118113289 A CN118113289 A CN 118113289A CN 202211517755 A CN202211517755 A CN 202211517755A CN 118113289 A CN118113289 A CN 118113289A
Authority
CN
China
Prior art keywords
code
compiling
electronic device
stack
file
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
CN202211517755.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.)
Huawei Device Co Ltd
Original Assignee
Huawei Device 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 Huawei Device Co Ltd filed Critical Huawei Device Co Ltd
Priority to CN202211517755.XA priority Critical patent/CN118113289A/zh
Publication of CN118113289A publication Critical patent/CN118113289A/zh
Pending legal-status Critical Current

Links

Landscapes

  • Stored Programmes (AREA)

Abstract

本申请实施例提供了一种代码编译方法、代码运行方法及相关设备,涉及计算机技术领域。代码编译方法包括:响应于代码文件的编译指令,第一电子设备对代码文件进行编译,得到与代码文件对应的第一堆栈映射及机器码,第一堆栈映射记录代码文件中的调用点的变量信息;第一电子设备对第一堆栈映射进行解析处理,得到第二堆栈映射,第二堆栈映射记录调用点的相对偏移量及变量信息;第一电子设备向第二电子设备发送包括机器码以及第二堆栈映射的编译文件。本申请可提高编译文件的运行效率,降低设备的运行负担。

Description

代码编译方法、代码运行方法及相关设备
技术领域
本申请涉及计算机技术领域,尤其涉及一种代码编译方法、代码运行方法及相关设备。
背景技术
在对应用程序代码进行编译优化时,可以在主机侧基于低层级虚拟编译框架(lowlevel virtual machine,LLVM)对应用程序代码进行提前编译(ahead of time,AOT),得到对应的AOT文件。AOT文件可以包括LLVM堆栈映射(LLVM STACKMAP),LLVMSTACKMAP记录函数的信息、调用点(callsite)的信息等。端侧(例如,终端设备)可以通过虚拟机来运行主机侧发送的AOT文件,开发者可以基于端侧的虚拟机运行结果对应用程序代码进行优化。
在主机侧编译生成的LLVM STACKMAP记录的调用点信息具有地址相关性,端侧加载LLVM STACKMAP需要对LLVM STACKMAP进行地址重定位处理,增加了端侧的运行负担。
发明内容
有鉴于此,有必要提供一种代码编译方法,其可实现某一电子设备加载另一电子设备生成的堆栈映射时无需进行地址重定位处理。
本申请实施例第一方面公开了一种代码编译方法,应用于第一电子设备,代码编译方法包括:响应于代码文件的编译指令,第一电子设备对代码文件进行编译,得到与代码文件对应的第一堆栈映射及机器码,代码文件包括多个调用点,第一堆栈映射记录多个调用点中的每个调用点的变量信息;第一电子设备对第一堆栈映射进行解析处理,得到第二堆栈映射,第二堆栈映射记录每个调用点的相对偏移量及变量信息;第一电子设备向第二电子设备发送编译文件,编译文件包括机器码以及第二堆栈映射。
采用上述技术方案,第一电子设备对代码文件编译得到的第一堆栈映射记录的调用点信息具有地址相关性,通过对第一堆栈映射进行解析处理,可得到数据量更小的第二堆栈映射,且第二堆栈映射记录调用点的相对偏移量,具有地址无关性,例如,调用点可以是代码文件中的热函数的调用点,调用点的相对偏移量不会因为编译文件存储在不同的设备而发生变化,即第二电子设备可以通过调用点的相对偏移量从第二堆栈映射查询到对应的变量信息,无需进行地址重定位处理,且编译生成的是电子设备可直接执行的机器码,提高第二电子设备运行编译文件的效率,降低了第二电子设备的运行负担以及占用的内存空间,便于开发者可以基于第二电子设备的虚拟机的机器码运行结果对代码文件进行优化。
在一些实施例中,对代码文件进行编译,得到与代码文件对应的第一堆栈映射,包括:将代码文件划分为多个编译单元,及对多个编译单元中的每个编译单元进行编译;基于每个编译单元的编译结果生成第一堆栈映射。
采用上述技术方案,通过将代码文件划分为多个编译单元进行编译,可以提升代码文件的编译效率。
在一些实施例中,相对偏移量为调用点相对于调用点所在的编译单元的起始地址的偏移量。
采用上述技术方案,通过对第一堆栈映射进行解析处理,得到调用点相对于调用点所在的编译单元的起始地址的偏移量,该相对偏移量不会因为编译文件存储在不同的设备而发生变化,使得第二电子设备可以通过调用点的相对偏移量从第二堆栈映射查询到对应的变量信息,无需进行地址重定位处理,可提高第二电子设备运行编译文件的效率,降低了第二电子设备的运行负担。
在一些实施例中,第一堆栈映射记录的变量信息包括变量类型、变量大小及用于存储变量的寄存器信息,所述第二堆栈映射记录的变量信息包括用于存储变量的寄存器信息。
采用上述技术方案,第二堆栈映射记录的变量信息相比第一堆栈映射记录的变量信息而言,省略了变量类型与变量大小信息,可进一步降低第二堆栈映射的数据量,降低了第二电子设备加载运行堆栈映射占用的内存空间。
在一些实施例中,第二堆栈映射的数据量小于所述第一堆栈映射的数据量。
采用上述技术方案,第二堆栈映射的数据量小于第一堆栈映射的数据量,可降低第二电子设备加载运行堆栈映射占用的内存空间。
本申请实施例第二方面公开了一种代码运行方法,应用于第二电子设备,第二电子设备安装有虚拟机,代码运行方法包括:第二电子设备接收第一电子设备发送的编译文件,编译文件包括与代码文件对应的机器码及堆栈映射,代码文件包括多个调用点,堆栈映射记录多个调用点中的每个调用点的相对偏移量及变量信息;第二电子设备启动虚拟机,及控制虚拟机根据堆栈映射运行机器码件。
采用上述技术方案,第二电子设备接收第一电子设备发送的堆栈映射记录调用点的相对偏移量,例如,调用点可以是代码文件中的热函数的调用点,调用点的相对偏移量不会因为编译文件存储在不同的设备而发生变化,即第二电子设备可以通过调用点的相对偏移量从第二堆栈映射查询到对应的变量信息,无需进行地址重定位处理,且接收到的代码是电子设备可直接执行的机器码,提高第二电子设备运行编译文件的效率,降低了第二电子设备的运行负担。
在一些实施例中,代码文件被划分为多个编译单元,相对偏移量为调用点相对于调用点所在的编译单元的起始地址的偏移量。
采用上述技术方案,相对偏移量为调用点相对于调用点所在的编译单元的起始地址的偏移量,该相对偏移量不会因为编译文件存储在不同的设备而发生变化,使得第二电子设备可以通过调用点的相对偏移量从第二堆栈映射查询到对应的变量信息,无需进行地址重定位处理,可提高第二电子设备运行编译文件的效率,降低了第二电子设备的运行负担。
在一些实施例中,控制虚拟机根据堆栈映射运行机器码,包括:基于堆栈映射建立与多个调用点对应的多个键值对,多个键值对中的每个键值对记录一个调用点的相对偏移量与变量信息的映射;基于多个键值对运行机器码。
采用上述技术方案,第二电子设备可以基于堆栈映射建立与调用点对应的键值对,键值对中的键可以是调用点的相对偏移量,值可以是调用点的变量信息,使得虚拟机可以基于键值对运行机器码,可提高代码文件的运行效率,便于开发者可以基于虚拟机的机器码运行结果对代码文件进行优化。
第三方面,本申请实施例提供一种计算机可读存储介质,包括计算机指令,当计算机指令在电子设备上运行时,使得电子设备执行如第一方面所述的代码编译方法,或执行如第二方面所述的代码运行方法。
第四方面,本申请实施例提供一种电子设备,电子设备包括处理器和存储器,存储器用于存储指令,处理器用于调用存储器中的指令,使得电子设备执行如第一方面所述的代码编译方法,或执行如第二方面所述的代码运行方法。
第五方面,本申请实施例提供一种计算机程序产品,当计算机程序产品在电子设备(如计算机)上运行时,使得电子设备执行如第一方面所述的代码编译方法,或执行如第二方面所述的代码运行方法。
第六方面,提供一种装置,所述装置具有实现上述第一方面或第二方面所提供的方法中电子设备行为的功能。功能可以通过硬件实现,也可以通过硬件执行相应的软件实现。硬件或软件包括一个或多个与上述功能相对应的模块。
可以理解地,上述提供的第三方面所述的计算机可读存储介质,第四方面所述的电子设备,第五方面所述的计算机程序产品,第六方面所述的装置均与上述第一方面或第二方面的方法对应,因此,其所能达到的有益效果可参考上文所提供的对应的方法中的有益效果,此处不再赘述。
附图说明
图1为本申请一实施例提供的一种电子设备的结构示意图;
图2为本申请一实施例提供的一种电子设备的软件结构示意图;
图3为本申请一实施例提供的代码编译方法的应用场景图;
图4为本申请一实施例提供的第一电子设备对AOT文件进行解析的示意图;
图5为本申请一实施例提供的第一电子设备与第二电子设备构建键值对的示意图;
图6为本申请另一实施例提供的第一电子设备与第二电子设备构建键值对的示意图;
图7为本申请一实施例提供的代码编译方法的流程示意图;
图8为本申请另一实施例提供的代码运行方法的流程示意图。
具体实施方式
需要说明的是,本申请中“至少一个”是指一个或者多个,“多个”是指两个或多于两个。“和/或”,描述关联对象的关联关系,表示可以存在三种关系,例如,A和/或B可以表示:单独存在A,同时存在A和B,单独存在B的情况,其中A,B可以是单数或者复数。本申请的说明书和权利要求书及附图中的术语“第一”、“第二”、“第三”、“第四”等(如果存在)是用于区别类似的对象,而不是用于描述特定的顺序或先后次序。
在本申请实施例中,“示例性的”或者“例如”等词用于表示作例子、例证或说明。本申请实施例中被描述为“示例性的”或者“例如”的任何实施例或设计方案不应被解释为比其它实施例或设计方案更优选或更具优势。确切而言,使用“示例性的”或者“例如”等词旨在以具体方式呈现相关概念。
为了便于理解本申请实施例中的技术方案,下面首先对本申请实施例中所涉及的部分术语进行解释:
JavaScript:简称“JS”,是一种具有函数优先的轻量级,解释型或即时编译型的编程语言。
TypeScript:简称“TS”,是开发的一个开源的编程语言,通过在JavaScript的基础上添加静态类型定义构建而成,TS可通过TypeScript编译器或Babel转译为JavaScript代码,运行在各种浏览器,各种操作系统。
即时编译(Just In Time,JIT):指的是在程序的运行过程中,将字节码转换为可在硬件上直接运行的机器码的过程。
提前编译(ahead of time,AOT):又称运行前编译,指的是在程序的运行前,将字节码转换为可在硬件上直接运行的机器码的过程。
底层虚拟机(low level virtual machine,LLVM):是构架编译器(compiler)的框架系统,以C++编写而成,用于优化以任意程序语言编写的程序的编译时间(compile-time)、链接时间(link-time)、运行时间(run-time)以及空闲时间(idle-time)。
虚拟机(Virtual Machine,VM):是指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统。
现有的应用程序代码的优化方案,主机侧(例如开发平台服务器)生成的AOT文件中的LLVM STACKMAP的数据量一般较大,且与主机侧具有地址相关性,端侧(例如终端设备)加载主机侧生成的AOT文件,将会占用较多的内存空间,且需要对LLVMSTACKMAP进行地址重定位处理,增加了端侧的运行负担。
为解决上述技术问题,本申请实施例提供一种代码编译方法,可以降低主机侧生成的AOT文件的数据量,且具有地址无关代码(position-independent code,PIC)特性,使得端侧无需进行地址重定位处理。
本申请实施例提供的代码编译方法或代码运行方法,可应用于电子设备中,电子设备可以通过通信网络与其他电子设备进行通信。本申请的电子设备可以是服务器或者终端设备,终端设备可以包括手机、可折叠电子设备、平板电脑、个人电脑(personalcomputer,PC)、膝上型计算机、手持计算机、笔记本电脑、超级移动个人计算机(ultra-mobile personal computer,UMPC)、上网本、蜂窝电话、个人数字助理(personaldigital assistant,PDA)、增强现实(augmented reality,AR)设备、虚拟现实(virtual reality,VR)设备、人工智能(artificial intelligence,AI)设备、可穿戴式设备、智能家居设备、智慧城市设备中的至少一种,本申请实施例对电子设备的具体类型不作特殊限制。通信网络可以是有线网络,也可以是无线网络。例如,通信网络可以是局域网(local area networks,LAN),也可以是广域网(wide area networks,WAN),例如互联网。当该通信网络为局域网时,示例性的,该通信网络可以是无线保真(wireless fidelity,Wi-Fi)热点网络、Wi-Fi P2P网络、蓝牙网络、zigbee网络或近场通信(near fieldcommunication,NFC)网络等近距离通信网络。当该通信网络为广域网时,示例性的,该通信网络可以是第三代移动通信技术(3rd-generation wireless telephone technology,3G)网络、第四代移动通信技术(the 4th generationmobile communication technology,4G)网络、第五代移动通信技术(5th-generation mobilecommunication technology,5G)网络、未来演进的公共陆地移动网络(public land mobilenetwork,PLMN)或因特网等。
电子设备包括但不限于搭载Windows/> 或其他操作系统。
图1示意了一种电子设备10的结构示意图。
电子设备10可以包括处理器110,外部存储器接口120,内部存储器121,天线1,天线2,移动通信模块130,无线通信模块140,音频模块150,显示屏160等。
可以理解的是,本申请实施例示意的结构并不构成对电子设备10的具体限定。在本申请另一些实施例中,电子设备10可以包括比图示更多或更少的部件,或者组合某些部件,或者拆分某些部件,或者不同的部件布置。图示的部件可以以硬件,软件或软件和硬件的组合实现。
处理器110可以包括一个或多个处理单元,例如:处理器110可以包括应用处理器(application processor,AP),调制解调处理器,图形处理器(graphics processingunit,GPU),图像信号处理器(image signal processor,ISP),控制器,视频编解码器,数字信号处理器(digital signal processor,DSP),基带处理器,和/或神经网络处理器(neural-networkprocessing unit,NPU)等。其中,不同的处理单元可以是独立的器件,也可以集成在一个或多个处理器中。
处理器110中还可以设置存储器,用于存储指令和数据。在一些实施例中,处理器110中的存储器可以为高速缓冲存储器。所述存储器可以保存处理器110用过或使用频率较高的指令或数据。如果处理器110需要使用所述指令或数据,可从所述存储器中直接调用。避免了重复存取,减少了处理器110的等待时间,因而提高了系统的效率。
在一些实施例中,处理器110可以包括一个或多个接口。接口可以包括集成电路(inter-integrated circuit,I2C)接口,集成电路内置音频(inter-integrated circuitsound,I2S)接口,脉冲编码调制(pulse code modulation,PCM)接口,通用异步收发传输器(universalasynchronous receiver/transmitter,UART)接口,移动产业处理器接口(mobile industryprocessor interface,MIPI),通用输入输出(general-purpose input/output,GPIO)接口,用户标识模块(subscriber identity module,SIM)接口,和/或通用串行总线(universal serial bus,USB)接口等。处理器110可以通过以上至少一种接口连接音频模块、无线通信模块、显示器等模块。
可以理解的是,本申请实施例示意的各模块间的接口连接关系,只是示意性说明,并不构成对电子设备10的结构限定。在本申请另一些实施例中,电子设备10也可以采用上述实施例中不同的接口连接方式,或多种接口连接方式的组合。
电子设备10的无线通信功能可以通过天线1,天线2,移动通信模块130,无线通信模块140,调制解调处理器以及基带处理器等实现。
移动通信模块130可以提供应用在电子设备10上的包括2G/3G/4G/5G等无线通信的解决方案。移动通信模块130可以包括至少一个滤波器,开关,功率放大器,低噪声放大器(low noise amplifier,LNA)等。在一些实施例中,移动通信模块130的至少部分功能模块可以被设置于处理器110中。在一些实施例中,移动通信模块130的至少部分功能模块可以与处理器110的至少部分模块被设置在同一个器件中。
无线通信模块140可以提供应用在电子设备10上的包括无线局域网(wirelesslocalarea networks,WLAN)(如无线保真(wireless fidelity,Wi-Fi)网络),蓝牙(bluetooth,BT),蓝牙低功耗(bluetooth low energy,BLE),超宽带(ultra wide band,UWB),全球导航卫星系统(global navigation satellite system,GNSS),调频(frequencymodulation,FM),近距离无线通信技术(near field communication,NFC),红外技术(infrared,IR)等无线通信的解决方案。无线通信模块140可以是集成至少一个通信处理模块的一个或多个器件。
在一些实施例中,电子设备10可以通过无线通信技术与网络和其他电子设备通信。所述无线通信技术可以包括全球移动通讯系统(global system for mobilecommunications,GSM),通用分组无线服务(general packet radio service,GPRS),码分多址接入(code divisionmultiple access,CDMA),宽带码分多址(wideband codedivision multiple access,WCDMA),时分码分多址(time-division code divisionmultiple access,TD-SCDMA),长期演进(longterm evolution,LTE),BT,GNSS,WLAN,NFC,FM,和/或IR技术等。所述GNSS可以包括全球卫星定位系统(global positioning system,GPS),全球导航卫星系统(globalnavigation satellite system,GLONASS),北斗卫星导航系统(beidou navigation satellitesystem,BDS),准天顶卫星系统(quasi-zenithsatellite system,QZSS)和/或星基增强系统(satellite based augmentation systems,SBAS)。
电子设备10可以通过GPU,显示屏160,以及应用处理器等实现显示功能。GPU为门店经营状态获取的微处理器,连接显示屏160和应用处理器。GPU用于执行数学和几何计算,用于图形渲染。处理器110可包括一个或多个GPU,其执行程序指令以生成或改变显示信息。
显示屏160用于显示图像,视频等。显示屏160包括显示面板。显示面板可以采用液晶显示屏(liquid crystal display,LCD),有机发光二极管(organic light-emittingdiode,OLED),有源矩阵有机发光二极体或主动矩阵有机发光二极体(active-matrixorganic lightemitting diode的,AMOLED),柔性发光二极管(flex light-emittingdiode,FLED),Miniled,MicroLed,Micro-oLed,量子点发光二极管(quantum dot lightemitting diodes,QLED)等。在一些实施例中,电子设备10可以包括1个或多个显示屏160。
外部存储器接口120可以用于连接外部存储卡,例如Micro SD卡,实现扩展电子设备10的存储能力。外部存储卡通过外部存储器接口120与处理器110通信,实现数据存储功能。
内部存储器121可以用于存储计算机可执行程序代码,所述可执行程序代码包括指令。内部存储器121可以包括存储程序区和存储数据区。其中,存储程序区可存储操作系统,至少一个功能所需的应用程序(比如声音播放功能,图像播放功能等)等。存储数据区可存储电子设备10使用过程中所创建的数据等。此外,内部存储器121可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件,闪存器件,通用闪存存储器(universal flash storage,UFS)等。处理器110通过运行存储在内部存储器121的指令,和/或存储在设置于处理器中的存储器的指令,执行电子设备10的各种功能方法或数据处理。
音频模块150用于将数字音频信息转换成模拟音频信号输出,也用于将模拟音频输入转换为数字音频信号。音频模块150还可以用于对音频信号编码和解码。在一些实施例中,音频模块150可以设置于处理器110中,或将音频模块150的部分功能模块设置于处理器110中。
电子设备10的软件系统可以采用分层架构,事件驱动架构,微核架构,微服务架构,或云架构。本申请实施例以分层架构的Android系统为例,示例性说明电子设备10的软件结构。
图2是本申请一实施例的电子设备10的软件结构框图。
分层架构将软件分成若干个层,每一层都有清晰的角色和分工。层与层之间通过软件接口通信。在一些实施例中,将Android系统分为五层,从上至下分别为应用程序层,应用程序框架层,安卓运行时(Android runtime,ART)和原生C/C++库,硬件抽象层(HardwareAbstract Layer,HAL)以及内核层。
应用程序层可以包括一系列应用程序包。
如图2所示,应用程序包可以包括相机,图库,日历,通话,地图,导航,WLAN,蓝牙,音乐,视频,短信息等应用程序。
应用程序框架层为应用程序层的应用程序提供应用编程接口(applicationprogramming interface,API)和编程框架。应用程序框架层包括一些预先定义的函数。
如图2所示,应用程序框架层可以包括窗口管理器,内容提供器,视图系统,资源管理器,通知管理器,活动管理器,输入管理器等。
窗口管理器提供窗口管理服务(Window Manager Service,WMS),WMS可以用于窗口管理、窗口动画管理、surface管理以及作为输入系统的中转站。
内容提供器用来存放和获取数据,并使这些数据可以被应用程序访问。所述数据可以包括视频,图像,音频,拨打和接听的电话,浏览历史和书签,电话簿等。
视图系统包括可视控件,例如显示文字的控件,显示图片的控件等。视图系统可用于构建应用程序。显示界面可以由一个或多个视图组成的。例如,包括短信通知图标的显示界面,可以包括显示文字的视图以及显示图片的视图。
资源管理器为应用程序提供各种资源,比如本地化字符串,图标,图片,布局文件,视频文件等等。
通知管理器使应用程序可以在状态栏中显示通知信息,可以用于传达告知类型的消息,可以短暂停留后自动消失,无需用户交互。比如通知管理器被用于告知下载完成,消息提醒等。通知管理器还可以是以图表或者滚动条文本形式出现在系统顶部状态栏的通知,例如后台运行的应用程序的通知,还可以是以对话窗口形式出现在屏幕上的通知。例如在状态栏提示文本信息,发出提示音,电子设备振动,指示灯闪烁等。
活动管理器可以提供活动管理服务(Activity Manager Service,AMS),AMS可以用于系统组件(例如活动、服务、内容提供者、广播接收器)的启动、切换、调度以及应用进程的管理和调度工作。
输入管理器可以提供输入管理服务(Input Manager Service,IMS),IMS可以用于管理系统的输入,例如触摸屏输入、按键输入等。IMS从输入设备节点取出事件,通过和WMS的交互,将事件分配至合适的窗口。
安卓运行时包括核心库和安卓运行时。安卓运行时负责将源代码转换为机器码。安卓运行时主要包括采用提前(ahead or time,AOT)编译技术和及时(just in time,JIT)编译技术。
核心库主要用于提供基本的Java类库的功能,例如基础数据结构、数学、IO、工具、数据库、网络等库。核心库为用户进行安卓应用开发提供了API。
原生C/C++库可以包括多个功能模块。例如:表面管理器(surface manager),媒体框架(Media Framework),libc,OpenGL ES、SQLite、Webkit等。
其中,表面管理器用于对显示子系统进行管理,并且为多个应用程序提供了2D和3D图层的融合。媒体框架支持多种常用的音频,视频格式回放和录制,以及静态图像文件等。媒体库可以支持多种音视频编码格式,例如:MPEG4,H.264,MP3,AAC,AMR,JPG,PNG等。OpenGL ES提供应用程序中2D图形和3D图形的绘制和操作。SQLite为电子设备10的应用程序提供轻量级关系型数据库。
硬件抽象层运行于用户空间(user space),对内核层驱动进行封装,向上层提供调用接口。
内核层是硬件和软件之间的层。内核层可以包含显示驱动,音频驱动等。
下面结合图3,示例性的介绍本申请实施例提供的代码编译方法的应用场景图。
如图3所示的应用场景,该实施例可包括第一电子设备10a与第二电子设备10b。第一电子设备10a可以通过通信网络与第二电子设备10b连接。第一电子设备10a可以是服务器、电脑、便携式终端等设备,第二电子设备10b可以为手机、平板电脑、智能手表等终端设备。例如,第一电子设备10a是生产第二电子设备10b的厂商的服务器,或者是第二电子设备10b安装的操作系统所属厂商的服务器。图3以第二电子设备10b为手机,第一电子设备10a为手机安装的操作系统所属厂商的服务器(下文简称为“厂商服务器”)为例进行示意。
如图4所述,第一电子设备10a可以安装有LLVM,通过LLVM可以对代码文件f1进行AOT编译。代码文件f1可以是指应用程序的源代码或者软件的源代码,本申请对此不作限定。代码文件f1可以划分为多个编译单元(Module),以一个个Module的形式进行编译,即可以将代码文件f1划分为多个Module,LLVM可以对每个Module进行AOT编译,得到与代码文件f1对应的AOT文件f2,AOT文件f2可以包括对代码文件f1中的代码编译得到的机器码及LLVMSTACKMAP。
如下表1所示,为第一电子设备10a采用LLVM对代码文件f1进行AOT编译得到的第一堆栈映射LLVM STACKMAP_1。
表1
表1以第一堆栈映射LLVM STACKMAP_1记录有代码文件f1中的热函数的信息进行示意,热函数可以是指各个Module中的高频调用的函数。Header可以记录有与代码文件f1关联的描述信息,例如可以包括标题、作者、描述、快捷键信息等。NumFunctions可以记录有热函数的数量信息,NumConstants可以记录有热函数的常量数量信息,NumRecords可以记录有热函数的调用点数量信息。Function Address可以记录有热函数的地址,Stack Size可以记录有热函数的堆栈大小,Record Count可以记录有热函数调用其他函数的调用记录。LargeConstant可以记录有热函数的常量,PatchPoint ID可以记录有调用点身份标识,Instruction Offset可以记录有调用指令的偏移量,NumLocations可以记录有调用点的变量数量信息,每个Location可以包括四个属性:Kind、Location Size、RegNum及Offset。Kind为变量类型,Location Size为变量占用的空间大小,RegNum为存储变量的寄存器编号,Offset为偏移量,通过RegNum+Offset可以唯一访问一个变量。RegNum可以包含帧指针(frame point,FP)信息与栈指针(stack point,SP)信息。
第二电子设备10b上可以安装有JS虚拟机(JS VM),JS VM可以加载第一电子设备10a生成的AOT文件f2,并解析AOT文件f2中的LLVM STACKMAP,以建立全局哈希映射。全局哈希映射可以包括多个键值对<callsitepc,stack_map>,其中键值对中的callsitepc为“key”,callsitepc也可称为调用点程序计数器,键值对中的stack_map为“value”,全局哈希映射的键值对可以按照callsitepc的值升序排列。
对于AOT文件f2中的代码段(机器码)而言,假设第一电子设备10a为代码段分配一段存储地址Ad1,以存储各个Module的代码段。callsitepc可记录有调用点相对于该段存储地址Ad1的段起始地址的偏移量,stack_map记录有与调用点的变量关联的信息:Kind、Location Size、RegNum与Offset。第二电子设备10b解析LLVM STACKMAP的过程可以包括:a.基于热函数的地址查找与该热函数关联的调用点;b.基于调用点ID查找关联的Location;c.基于Location查找对应的Kind、Location Size、RegNum与Offset,以创建键值对<callsitepc,stack_map>。
如图5所示,假设AOT文件f2中的代码段包括热函数funcA与热函数funcB,第一电子设备10a分配的用于存储该代码段的段起始地址为0x7fff000,热函数funcA调用bar函数bar_1,热函数funcA执行调用bar函数bar_1相对于段起始地址的偏移量为0x40,与热函数funcA调用bar函数bar_1关联的堆栈映射信息stackmap_1记录有:(funcA:0x7fff000,0x40,Location A),对应的键值对为<0x7fff040,Location A>,LocationA包含与热函数funcA的调用点(bar函数bar_1)关联的Kind、Location Size、RegNum与Offset。热函数funcB调用bar函数bar_2,热函数funcB执行调用bar函数bar_2相对于段起始地址的偏移量为0x150,与热函数funcB调用bar函数bar_2关联的堆栈映射信息stackmap_2记录有:(funcB:0x7fff100,0x50,Location B),对应的键值对为<0x7fff150,Location B>,Location B包含与热函数funcB的调用点(bar函数bar_2)关联的Kind、Location Size、RegNum与Offset。
第一电子设备10a生成的AOT文件f2可以通过通信网络发送给第二电子设备10b,使得第二电子设备10b的JS VM可以加载运行AOT文件f2。假设第二电子设备10b为AOT文件f2中的代码段分配一段存储地址Ad2,该段存储地址Ad2的段起始地址为0x8000。由于存储代码段的段起始地址由0x7fff000变更为0x8000,第二电子设备10b需对与funcA关联的堆栈映射信息stackmap_1及与热函数funcB关联的堆栈映射信息stackmap_2进行地址重定位。即堆栈映射信息stackmap_1由(funcA:0x7fff000,0x40,Location A)变更为(funcA:0x8000,0x40,Location A),对应的键值对变更为<0x8040,Location A>;stackmap_2由(funcB:0x7fff100,0x50,Location B)变更为(funcB:0x8100,0x50,Location B),对应的键值对变更为<0x8150,Location B>。即第二电子设备10b的JS VM基于键值对<0x8040,Location A>与<0x8150,Location B>运行热函数funcA与热函数funcB。
在一些实施例中,为了降低第一堆栈映射LLVM STACKMAP_1的数据量,第一电子设备10a还可以对第一堆栈映射LLVM STACKMAP_1进行解析处理,得到如下表2所示的第二堆栈映射STACKMAP_2。
表2
表2记录的内容相比表1明显减少,即第二堆栈映射STACKMAP_2的数据量会少于第一堆栈映射LLVM STACKMAP_1的数据量。Sechead可以记录有与代码文件f1关联的描述信息,Total Size可以记录有热函数的总堆栈大小,例如为表1中的每个StackSize的和。CallsiteNum可以记录有调用点的编号信息,CallsiteStart可以记录有起始调用点的信息,CallsiteEnd可以记录有最后一个调用点的信息。CallsiteOffest可以记录有调用点的相对偏移量,相对偏移量可以是指调用点相对于当前所处的Module的起始地址的偏移量,由于调用点相对于当前所处的Module的起始地址的偏移量不会因为AOT文件f2存储在不同的设备而发生变化,即CallsiteOffest记录的调用点的相对偏移量具有地址无关性。Ark_startmapkOffest可以记录有Ark_startmapk的偏移量,Ark_startmapNum可以记录有Ark_startmapk的编号。当确定CallsiteOffest之后,可以基于与该CallsiteOffest关联的Ark_startmapkOffest与Ark_startmapNum,采用诸如二分法查找方法或者其他查找方法实现快速确定与该CallsiteOffest对应的Ark_stackmap中的某条RegNum与Offset。
如图6所示,假设AOT文件f2中的代码段被分割成m个Module,m个Module中的第一Module包括热函数funcA与热函数funcB,热函数funcA调用bar函数bar_1,热函数funcA执行调用bar函数bar_1相对于第一Module的起始地址的偏移量为0x40。热函数funcB调用bar函数bar_2,热函数funcB执行调用bar函数bar_2相对于第一Module的起始地址的偏移量为0x150。
与热函数funcA调用bar函数bar_1关联的堆栈映射信息stackmap_1记录有:(0x40,Location A’),Location A’相比Location A而言,Location A’仅记录RegNum与Offset,即省去了Kind与Location Size,数据量更小。与热函数funcB调用bar函数bar_2关联的堆栈映射信息stackmap_2记录有:(0x150,Location B’),Location B’相比LocationB而言,Location B’仅记录RegNum与Offset,同样省去了Kind与Location Size,数据量更小。通过上述堆栈映射信息可创建两组新的键值对<callsitepc_1,stack_map_1>:<0x40,Location A’>、<0x150,Location B’>。
当AOT文件f2通过通信网络发送给第二电子设备10b之后,对于存储在第二电子设备10b上的AOT文件f2而言,假设第二电子设备10b为AOT文件f2中的代码段分配一段存储地址Ad2,该段存储地址Ad2的段起始地址为0x8000。虽然第二电子设备10b分配的用于存储AOT文件f2的存储地址与第一电子设备10a分配的用于存储AOT文件f2的存储地址不同,但对于代码段中的第一Module而言,调用点(bar函数bar_1)相对于第一Module的起始地址的偏移量仍然为0x40,调用点(bar函数bar_2)相对于第一Module的起始地址的偏移量仍然为0x150。
由于调用点相对于当前所处的Module的起始地址的偏移量是保持不变的,不会因为AOT文件f2存储在不同的设备而发生变化。即第二电子设备10b并不需要对与funcA关联的堆栈映射信息stackmap_1及与热函数funcB关联的堆栈映射信息stackmap_2进行地址重定位处理,第二电子设备10b的JS VM可以直接基于键值对<0x40,Location A’>与<0x150,Location B’>运行热函数funcA与热函数funcB。
在一些实施例中,若LLVM支持去优化(Deopt)模式,第一电子设备10a采用LLVM对代码文件f1进行AOT编译得到的第一堆栈映射LLVM STACKMAP_1,还记录有与Deopt模式关联的编译信息。例如,代码文件f1中的热函数在Deopt模式下的编译信息。第一电子设备10a同样可以对第一堆栈映射LLVM STACKMAP_1中与Deopt模式关联的编译信息进行解析处理,以实现精简Deopt模式关联的编译信息,得到数据量较小的第二堆栈映射STACKMAP_2。
例如,第一电子设备10a对包含有与Deopt模式关联的编译信息的第一堆栈映射LLVM STACKMAP_1进行解析处理,得到如下表3所示的第二堆栈映射STACKMAP_2。
表3
Ark_DeoptOffest可以记录有Ark_Deopt的偏移量,Ark_DeoptNum可以记录有Ark_Deopt的编号。即当确定CallsiteOffest之后,可以基于与该CallsiteOffest关联的Ark_DeoptOffestt与Ark_DeoptNum,采用二分法查找方法或者其他查找方法快速确定与该CallsiteOffest对应的Ark_Deopt中的某条调用点参数(例如,上表中的Kind::INDIRECT、RegNum与Offset,或Kind::CONSTINDEX与LargeInt,或Kind::CONST与offestorsmallInt)。
参照图7所示,本申请一实施例提供一种代码编译方法。本实施例中,代码编译方法可以应用于第一电子设备10a,代码编译方法可以包括:
步骤S71,响应于代码文件的编译指令,第一电子设备10a对代码文件进行编译,得到与代码文件对应的第一堆栈映射及机器码。
在一些实施例中,代码文件可以包括多个调用点,多个调用点可以是指代码文件中的热函数的调用点。第一堆栈映射记录多个调用点中的每个调用点的变量信息,例如第一堆栈映射记录的变量信息包括与变量有关的Kind、Location Size、RegNum及Offset。
在一些实施例中,第一电子设备10a可以安装有LLVM,通过将代码文件划分为多个编译单元,对每个编译单元进行编译,可以提升代码文件的编译效率。第一电子设备10a可以基于每个编译单元的编译结果生成第一堆栈映射,例如第一堆栈映射记录的内容如表1所示。
步骤S72,第一电子设备10a对第一堆栈映射进行解析处理,得到第二堆栈映射,第二堆栈映射记录每个调用点的相对偏移量及变量信息。
在一些实施例中,第二堆栈映射的数据量小于第一堆栈映射的数据量。第二堆栈映射记录的相对偏移量可以是调用点相对于调用点所在的编译单元的起始地址的偏移量。该相对偏移量不会因为编译文件存储在不同的设备而发生变化,使得第二电子设备10b可以通过调用点的相对偏移量从第二堆栈映射查询到对应的变量信息,无需进行地址重定位处理,可提高第二电子设备运行编译文件的效率,降低了第二电子设备10b的运行负担。第二堆栈映射记录的变量信息可以仅包括用于存储变量的寄存器信息:RegNum及Offset。例如,第二堆栈映射记录的内容如表2所示。
步骤S73,第一电子设备10a向第二电子设备10b发送编译文件,编译文件包括机器码以及第二堆栈映射。
参照图8所示,本申请一实施例提供一种代码运行方法。本实施例中,代码运行方法可以应用于第二电子设备10b,代码运行方法可以包括:
步骤S81,第二电子设备10b接收第一电子设备10a发送的编译文件,编译文件包括与代码文件对应的机器码及第二堆栈映射。
在一些实施例中,代码文件可以包括多个调用点,第二堆栈映射记录多个调用点中的每个调用点的相对偏移量及变量信息。
步骤S82,第二电子设备10b启动虚拟机,及控制虚拟机根据第二堆栈映射运行机器码。
在一些实施例中,虚拟机可以是JS虚拟机,或者其他类型的虚拟机,本申请对此不作限定。第二电子设备10b可以基于第二堆栈映射建立与多个调用点对应的多个键值对,每个键值对可记录一个调用点的相对偏移量与变量信息的映射,第二电子设备10b可以基于多个键值对运行机器码,开发者可以基于JS虚拟机运行机器码的运行结果对代码文件进行优化。
本申请一实施例提供的电子设备10,内部存储器121可用于存储指令,处理器110可用于调用内部存储器121中的指令,使得电子设备10执行上述相关方法步骤实现上述实施例中的代码编译方法,或代码运行方法。
本申请一实施例还提供一种计算机存储介质,所述计算机存储介质中存储有计算机指令,当所述计算机指令在电子设备10上运行时,使得电子设备10执行上述相关方法步骤实现上述实施例中的代码编译方法,或代码运行方法。
本申请一实施例还提供了一种计算机程序产品,当所述计算机程序产品在电子设备上运行时,使得电子设备执行上述相关步骤,以实现上述实施例中的代码编译方法,或代码运行方法。
另外,本申请一实施例还提供一种装置,这个装置具体可以是芯片,组件或模块,所述装置可包括相连的处理器和存储器;其中,存储器用于存储计算机执行指令,当装置运行时,处理器可执行存储器存储的计算机执行指令,以使芯片执行上述各方法实施例中的代码编译方法,或代码运行方法。
其中,本申请实施例提供的计算机存储介质、计算机程序产品或芯片均用于执行上文所提供的对应的方法,因此,其所能达到的有益效果可参考上文所提供的对应的方法中的有益效果,此处不再赘述。
通过以上的实施方式的描述,所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,仅以上述各功能模块的划分进行举例说明,实际应用中,可以根据需要而将上述功能分配由不同的功能模块完成,即将装置的内部结构划分成不同的功能模块,以完成以上描述的全部或者部分功能。
在本申请所提供的几个实施例中,应所述理解到,所揭露的装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例是示意性的,例如,所述模块或单元的划分,为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个装置,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是一个物理单元或多个物理单元,即可以位于一个地方,或者也可以分布到多个不同地方。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本申请各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个可读取存储介质中。基于这样的理解,本申请实施例的技术方案本质上或者说对现有技术做出贡献的部分或者所述技术方案的全部或部分可以以软件产品的形式体现出来,所述软件产品存储在一个存储介质中,包括若干指令用以使得一个设备(可以是单片机,芯片等)或处理器(processor)执行本申请各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(Read-Only Memory,ROM)、随机存取存储器(Random Access Memory,RAM)、磁碟或者光盘等各种可以存储程序代码的介质。
以上所述,仅为本申请的具体实施方式,但本申请的保护范围并不局限于此,任何在本申请揭露的技术范围内的变化或替换,都应涵盖在本申请的保护范围之内。

Claims (11)

1.一种代码编译方法,应用于第一电子设备,其特征在于,所述方法包括:
响应于代码文件的编译指令,所述第一电子设备对所述代码文件进行编译,得到与所述代码文件对应的第一堆栈映射及机器码,所述代码文件包括多个调用点,所述第一堆栈映射记录所述多个调用点中的每个调用点的变量信息;
所述第一电子设备对所述第一堆栈映射进行解析处理,得到第二堆栈映射,所述第二堆栈映射记录所述每个调用点的相对偏移量及变量信息;
所述第一电子设备向第二电子设备发送编译文件,所述编译文件包括所述机器码以及所述第二堆栈映射。
2.如权利要求1所述的代码编译方法,其特征在于,所述对所述代码文件进行编译,得到与所述代码文件对应的第一堆栈映射,包括:
将所述代码文件划分为多个编译单元,及对所述多个编译单元中的每个编译单元进行编译;
基于所述每个编译单元的编译结果生成第一堆栈映射。
3.如权利要求2所述的代码编译方法,其特征在于,所述相对偏移量为所述调用点相对于所述调用点所在的编译单元的起始地址的偏移量。
4.如权利要求1至3中任意一项所述的代码编译方法,其特征在于,所述第一堆栈映射记录的变量信息包括变量类型、变量大小及用于存储变量的寄存器信息,所述第二堆栈映射记录的变量信息包括用于存储变量的寄存器信息。
5.如权利要求1至3中任意一项所述的代码编译方法,其特征在于,所述第二堆栈映射的数据量小于所述第一堆栈映射的数据量。
6.一种代码运行方法,应用于第二电子设备,所述第二电子设备安装有虚拟机,其特征在于,所述方法包括:
所述第二电子设备接收第一电子设备发送的编译文件,所述编译文件包括与代码文件对应的机器码及堆栈映射,所述代码文件包括多个调用点,所述堆栈映射记录所述多个调用点中的每个调用点的相对偏移量及变量信息;
所述第二电子设备启动所述虚拟机,及控制所述虚拟机根据所述堆栈映射运行所述机器码。
7.如权利要求6所述的代码运行方法,其特征在于,所述代码文件被划分为多个编译单元,所述相对偏移量为所述调用点相对于所述调用点所在的编译单元的起始地址的偏移量。
8.如权利要求6或7所述的代码运行方法,其特征在于,所述控制所述虚拟机根据所述堆栈映射运行所述机器码,包括:
基于所述堆栈映射建立与所述多个调用点对应的多个键值对,所述多个键值对中的每个键值对记录一个调用点的相对偏移量与变量信息的映射;
基于所述多个键值对运行所述机器码。
9.一种计算机可读存储介质,其特征在于,包括计算机指令,当所述计算机指令在电子设备上运行时,使得所述电子设备执行如权利要求1至权利要求5中任一项所述的代码编译方法,或者执行如权利要求6至权利要求8中任一项所述的代码运行方法。
10.一种电子设备,其特征在于,所述电子设备包括处理器和存储器,所述存储器用于存储指令,所述处理器用于调用所述存储器中的指令,使得所述电子设备执行如权利要求1至权利要求5中任一项所述的代码编译方法,或者执行如权利要求6至权利要求8中任一项所述的代码运行方法。
11.一种计算机程序产品,其特征在于,包括计算机指令,当所述计算机指令在处理器上运行时,使得电子设备执行如权利要求1至权利要求5中任一项所述的代码编译方法,或者执行如权利要求6至权利要求8中任一项所述的代码运行方法。
CN202211517755.XA 2022-11-29 2022-11-29 代码编译方法、代码运行方法及相关设备 Pending CN118113289A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202211517755.XA CN118113289A (zh) 2022-11-29 2022-11-29 代码编译方法、代码运行方法及相关设备

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202211517755.XA CN118113289A (zh) 2022-11-29 2022-11-29 代码编译方法、代码运行方法及相关设备

Publications (1)

Publication Number Publication Date
CN118113289A true CN118113289A (zh) 2024-05-31

Family

ID=91217646

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202211517755.XA Pending CN118113289A (zh) 2022-11-29 2022-11-29 代码编译方法、代码运行方法及相关设备

Country Status (1)

Country Link
CN (1) CN118113289A (zh)

Similar Documents

Publication Publication Date Title
CN109358936B (zh) 信息处理方法、装置、存储介质、电子设备及系统
KR102436987B1 (ko) 웹페이지 콘텐츠를 추출하기 위한 방법 및 단말 장치
WO2021018005A1 (zh) 一种跨进程通信方法、装置及设备
WO2022199111A1 (zh) 应用程序中功能的实现方法、装置、电子设备和存储介质
US11556348B2 (en) Bootstrapping profile-guided compilation and verification
EP3848798A1 (en) Information processing method and apparatus, storage medium, and electronic device
CN102939579A (zh) 绑定用户接口元素和粒度反映处理的方法和装置
Wu et al. Porting mobile web application engine to the android platform
US20230082375A1 (en) Permission Reuse Method, Permission Reuse-Based Resource Access Method, and Related Device
EP4390690A1 (en) Notification processing method, chip, electronic device, and computer readable storage medium
CN103443763A (zh) 包含对重写虚拟函数的调用的支持的isa桥接
CN108376066B (zh) 代码处理装置及代码处理方法
US20230214231A1 (en) Driver Configuration Management Method and Apparatus, Medium, Device, and System
KR101117165B1 (ko) 이기종 운영체제 계층 모듈에서 동작하는 웹기반어플리케이션의 연동이 가능한 모바일 단말기용 웹 플랫폼 유닛
CN114840214A (zh) 程序编译和启动方法、设备及存储介质
US9128735B2 (en) Method for updating media database in portable terminal
CN116643778B (zh) 一种应用程序优化方法及电子设备
CN118113289A (zh) 代码编译方法、代码运行方法及相关设备
CN116136826A (zh) 内存访问方法、芯片、电子设备及计算机可读存储介质
EP4216052A1 (en) Method for developing mvvm architecture-based application, and terminal
WO2024078262A1 (zh) 快照方法、电子设备、计算机程序产品及可读存储介质
WO2022228035A1 (zh) 应用程序的图标更新方法及相关装置
CN117827228A (zh) 快应用部署方法及相关设备
CN117785221A (zh) 一种应用程序安装方法及电子设备
CN117667430A (zh) 持锁进程检测方法及相关设备

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination