掌桥专利:专业的专利平台
掌桥专利
首页

WebAssembly代码的执行方法及装置

文献发布时间:2024-04-18 19:58:21


WebAssembly代码的执行方法及装置

技术领域

本说明书实施例涉及通信领域,尤其涉及一种WebAssembly代码的执行方法及装置。

背景技术

WebAssembly(也可以简称为wasm)是一种采用“基于栈的虚拟机”的机制,其可以通过解释执行的方式执行由wasm字节码构成的WebAssembly代码。WebAssembly具有快速、高效、可移植性等特点。资源受限设备通常是指电量供应有限,计算能力有限,以及存储容量有限的电子设备,例如智能卡、安全单元等。

由于WebAssembly代码执行前,需要计算执行WebAssembly所需资源;而资源受限设备本身资源有限,因此计算过程消耗的资源会比较大,导致WebAssembly代码执行效率很低。

发明内容

本说明书实施例提供的一种WebAssembly代码的执行方法及装置,用以解决资源受限设备中WebAssembly执行代码效率较低的问题。

根据本说明书实施例的第一方面,提供一种WebAssembly代码的执行方法,应用于资源受限设备,所述方法包括:

接收WebAssembly代码的执行请求;

响应于所述执行请求,确定所述WebAssembly代码中的目标函数,并由外部计算模块计算执行所述目标函数所需的执行环境参数;

在执行所述WebAssembly代码时,基于所述外部计算模块计算的执行环境参数,创建用于执行所述目标函数的函数栈帧。

可选的,在执行所述WebAssembly代码之前,还包括:

由所述外部计算模块对所述WebAssembly代码所在的WebAssembly二进制文件进行修改,以在所述WebAssembly二进制文件内的所述目标函数的代码段中记录所述执行环境参数;

所述基于所述外部计算模块计算的执行环境参数,创建用于执行所述目标函数的函数栈帧,包括:

加载所述WebAssembly二进制文件,并解析所述WebAssembly二进制文件的字节码;

根据所述目标函数的代码段记录的执行环境参数计算用于执行所述目标函数的函数栈帧的大小;进而创建所述大小的函数栈帧。

可选的,所述执行环境参数包括最大操作数栈和/或最大控制块数。

可选的,还包括:

由所述外部计算设备计算控制块大小,并记录在WebAssembly二进制文件中;

在所述WebAssembly二进制文件完成加载之后,由所述资源受限设备计算控制块大小,与所述WebAssembly二进制文件中记录的控制块大小进行比较;

如果比对一致,则在执行所述WebAssembly二进制文件的字节码时,基于所述控制块大小计算跳转的目标地址,并将该目标地址设置为所述控制块内的跳转指令的跳转目标地址。

可选的,所述记录在WebAssembly二进制文件中,包括:

将所述控制块大小记录在WebAssembly二进制文件中的控制块大小字段;其中,所述控制块大小字段通过以下方式记录:

由所述外部计算模块对所述WebAssembly二进制文件中用于生成所述控制块的控制指令的字节码格式进行修改,以在所述控制指令的字节码格式中增加控制块大小字段。

可选的,在所述控制指令为Block指令或if指令时,所述在所述控制指令的字节码格式中增加控制块大小字段,包括:

在所述Block指令的字节码格式的操作码后增加控制块大小字段;或者,

在所述if指令的字节码格式的操作码后增加控制块大小字段及else分支偏移字段。

可选的,修改后Block指令的字节码格式为Block(0x20)|BlockSize|Bt|Instr|end;

其中,所述BlockSize的为控制块大小,Bt为块类型,Instr为表达式,end为结束标记。

可选的,修改后if指令的字节码格式为

if(0x04)|BlockSize|elseOffset|Bt|Instr1|else(0x05)|Instr2|end;

其中,BlockSize为控制块大小,elseOffset为else分支地址偏移,Bt为块类型,Instr1为if对应的表达式,Instr2为else对应的表达式,end为结束标记。

根据本说明书实施例的第三方面,提供一种WebAssembly代码的执行装置,应用于资源受限设备,所述装置包括:

接收单元,接收WebAssembly代码的执行请求;

响应单元,响应于所述执行请求,确定所述WebAssembly代码中的目标函数,并由外部计算模块计算执行所述目标函数所需的执行环境参数;

执行单元,在执行所述WebAssembly代码时,基于所述外部计算模块计算的执行环境参数,创建用于执行所述目标函数的函数栈帧。

根据本说明书实施例的第三方面,提供一种电子设备,包括:

处理器;

用于存储处理器可执行指令的存储器;

其中,所述处理器被配置为上述任一项WebAssembly代码的执行方法。

本说明书实施例,提供了一种WebAssembly代码的执行方案,将每个函数执行时所需的执行环境参数的计算过程由外部计算模块完成,通过修改WebAssembly规范中规定的二进制文件格式,记录每个函数的执行环境参数;

如此,资源受限设备在执行WebAssembly代码时无需使用内部计算资源,直接使用WebAssembly二进制文件中已经计算好的执行环境参数就可以创建用于执行函数的函数栈帧,从而可以更为高效得调用函数完成WebAssembly代码执行。

另一方面,出于安全考虑,可以在WebAssembly二进制文件加载完成后再一次计算控制块大小,并与外部计算模块计算的控制块大小进行比较,避免WebAssembly二进制文件被篡改的风险。

附图说明

图1是本说明书一实施例提供WebAssembly代码的执行方法的流程图;

图2是本说明书一实施例提供的WebAssembly二进制文件生成及加载的示意图;

图3是本说明书一实施例提供的WebAssembly二进制文件中代码段格式修改的示意图;

图4是本说明书一实施例提供的WebAssembly二进制文件中Block字节码格式修改的示意图;

图5是本说明书一实施例提供的WebAssembly二进制文件中if字节码格式修改的示意图;

图6是本说明书一实施例提供的WebAssembly代码的执行装置的硬件结构图;

图7是本说明书一实施例提供的WebAssembly代码的执行装置的模块。

具体实施方式

这里将详细地对示例性实施例进行说明,其示例表示在附图中。下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下示例性实施例中所描述的实施方式并不代表与本说明书相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本说明书的一些方面相一致的装置和方法的例子。

在本说明书使用的术语是仅仅出于描述特定实施例的目的,而非旨在限制本说明书。在本说明书和所附权利要求书中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其他含义。还应当理解,本文中使用的术语“和/或”是指并包含一个或多个相关联的列出项目的任何或所有可能组合。

应当理解,尽管在本说明书可能采用术语第一、第二、第三等来描述各种信息,但这些信息不应限于这些术语。这些术语仅用来将同一类型的信息彼此区分开。例如,在不脱离本说明书范围的情况下,第一信息也可以被称为第二信息,类似地,第二信息也可以被称为第一信息。取决于语境,如在此所使用的词语“如果”可以被解释成为“在……时”或“当……时”或“响应于确定”。

由于WebAssembly技术规范中没有规定函数执行时所需的执行环境参数,因此执行WebAssembly代码中的函数时,每次都需要在设备内临时计算执行环境参数。

对于一般的设备(如智能手机、PC电脑等)来说,相对于计算执行环境参数所需的计算资源,设备本身的计算资源是足够的,因此即使需要临时计算执行环境参数,也不会影响WebAssembly代码的正常执行。

然而,在将WebAssembly应用于资源受限设备时,由于资源受限设备本身的计算资源非常有限,因此计算执行环境参数会占用资源受限设备大部分的计算资源,从而严重影响代码执行效率。

为此,本说明书旨在提供一种面向资源受限设备并可以提升WebAssembly代码执行效率的方案。本说明书的资源受限设备可以例如智能卡、安全单元(Secure Element,SE)、物联网设备等;需要说明的是,这里仅是示例性的资源受限设备,并不是对资源受限设备具体的限定,因此可以理解的,本说明书提供方案可以适用于任意类型的资源受限设备。

以下请参考图1所示的WebAssembly代码的执行方法流程示意图,该方法可以应用于资源受限设备,该方法可以包括以下步骤:

步骤110:接收WebAssembly代码的执行请求。

步骤120:响应于所述执行请求,确定所述WebAssembly代码中的目标函数,并由外部计算模块计算执行所述目标函数所需的执行环境参数。

步骤130:在执行所述WebAssembly代码时,基于所述外部计算模块计算的执行环境参数,创建用于执行所述目标函数的函数栈帧。

函数栈帧是一种数据结构,用于管理函数调用的内存布局和状态。每当一个函数被调用时,都会在程序的执行栈上创建一个新的函数栈帧,用于存储该函数的参数、局部变量和返回地址等信息。

函数栈帧通常可以包括以下几个部分:

参数:函数的输入参数被存储在函数栈帧中,并在函数执行期间被引用。

局部变量:函数体内定义的变量在函数栈帧中被分配内存,并在函数执行期间被引用。

返回地址:函数返回时,需要知道返回到哪里继续执行代码。因此,函数栈帧中也包含了一个返回地址,指示程序应该返回哪个位置继续执行代码。

数据栈:在函数执行期间,有时需要在函数栈帧中分配额外的内存来临时存储数据。这种内存通常被称为数据栈,可以用于存储中间结果、临时变量等。

函数栈帧通常按照相反的顺序排列,最新的函数被放置在栈的顶部,而最早的函数被放置在栈的底部。这种方式被称为“后进先出”(LIFO)或“栈”的方式管理函数调用。当一个函数执行完成时,它的函数栈帧会从程序的执行栈中弹出,以释放内存并返回到调用该函数的位置。

在本说明书中,由于采用了WebAssembly,因此目标函数的函数栈帧中还包括控制块栈帧;所述控制块栈帧的内部存放控制块信息,以便控制块内的跳转指令能够准确的跳转到正确的目标地址。

本说明书通过将每个函数执行时所需的执行环境参数的计算过程由外部计算模块完成,从而避免占用资源受限设备本身的计算资源;如此,资源受限设备在执行WebAssembly代码时无需使用内部计算资源,直接使用已经计算好的执行环境参数就可以创建用于执行函数的函数栈帧,从而可以更为高效得调用函数完成WebAssembly代码执行。

值得一提的是,所述外部计算模块如图2所示,可以包括将任意类型源代码的代码文件转换为WebAssembly二进制文件(即图2中的“.wasm”)的计算模块;该计算模块可以是位于资源受限设备之外的,所以称之为外部计算模块。

在实现时,外部计算模块与资源受限设备之间无需直接通讯,外部计算模块通过将源代码转换成WebAssembly二进制文件,WebAssembly二进制文件通过下载命令加载到资源受限设备;其中,对于需要外部计算模块计算的执行环境参数,该外部计算模块通过对WebAssembly二进制文件进行修改(在WebAssembly二进制文件的相关代码段记录所述执行环境参数),从而使资源受限设备加载WebAssembly二进制文件时能够读取到所述执行环境参数。

在一示例性的实施例中,在步骤130执行所述WebAssembly代码之前,还可以包括:

由所述外部计算模块对所述WebAssembly代码所在的WebAssembly二进制文件进行修改,以在所述WebAssembly二进制文件内的所述目标函数的代码段中记录所述执行环境参数;

相应地,所述步骤130中的基于所述外部计算模块计算的执行环境参数,创建用于执行所述目标函数的函数栈帧,可以包括:

加载所述WebAssembly二进制文件,并解析所述WebAssembly二进制文件的字节码;

根据所述目标函数的代码段记录的执行环境参数计算用于执行所述目标函数的函数栈帧的大小;进而创建所述大小的函数栈帧。

需要说明的是,资源受限设备在加载WebAssembly二进制文件之后再解析执行字节码;并且一次加载之后就可以反复执行字节码,无需每次执行字节码时都加载WebAssembly二进制文件。

本说明书中,WebAssembly二进制文件可以是一种包含WebAssembly字节码的二进制格式,其可以在所有支持WebAssembly的运行时中加载和执行。与文本格式不同,WebAssembly二进制文件是一种真正意义上的二进制格式,其中包含了编写的WebAssembly程序的所有必要信息,例如代码、数据段、导入和导出等。这使得WebAssembly二进制文件非常紧凑,相比文本格式,其体积通常可以减少至少10倍以上。

WebAssembly二进制文件的扩展名为“.wasm”,其可以直接从Web服务器加载和执行。除了在Web浏览器中使用之外,WebAssembly二进制文件也可以被用于其他应用程序和平台,例如服务器端、桌面应用程序和移动应用程序。

本说明书中,WebAssembly字节码是一种中间代码格式,可以在所有支持WebAssembly的运行时中解释执行。它是一种类似于汇编语言的低级别语言,由一系列指令组成,这些指令被称为操作码(opcode)。

WebAssembly字节码的指令集非常简洁,并且可以轻松地被翻译成各种不同的机器语言。这使得WebAssembly成为一个高效、可移植和安全的虚拟机技术,可以用于Web浏览器以外的各种应用程序和平台。

WebAssembly字节码也具有可读性,可以使用文本格式(.wat文件)描述。这种文本格式可以帮助开发人员更好地理解和分析WebAssembly代码,以及进行手动调试或反汇编。

在本说明书中,在计算出执行环境参数之后,可以由该外部计算模块修改WebAssembly二进制文件,将计算出的函数的执行环境参数记录到WebAssembly二进制文件中。如此,资源受限设备在执行WebAssembly代码时无需使用内部计算资源,直接使用WebAssembly二进制文件中已经计算好的执行环境参数就可以创建用于执行函数的函数栈帧,从而可以更为高效得调用函数完成WebAssembly代码执行。

在一示例性的实施例中,所述执行环境参数包括最大操作数栈和/或最大控制块数。

每个函数的最大操作数栈和最大控制块数是用于计算函数栈帧大小的,函数的栈帧包括函数的参数和局部变量(Frame_lp)、函数操作数栈(Frame_sp)和函数的控制块栈(Frame_csp)。

函数栈帧的大小需要在调用函数之前确定,以便函数调用时创建合适大小的函数栈帧。

函数栈帧中Frame_lp可以根据函数的参数和局部变量个数计算得出,而Frame_sp和Frame_csp的大小则需要根据函数内字节码计算获得。

其中,Frame_sp的计算方法是统计函数内的字节码堆栈的操作中使用到的最大的数量。在传统资源受限设备中,Frame_sp需要在设备内计算,计算过程严重影响设备内执行效率;而本说明书则采用外部计算模块计算Frame_sp,计算方式不变,计算结果记录在WebAssembly二进制文件中,这样资源受限设备在加载WebAssembly二进制文件进行解释执行时可直接使用。如此可以提升二进制文件加载效率。

Frame_csp的计算方法是统计函数内字节码中的控制指令,从而计算控制指令的最大深度(即最大控制块数)。在传统资源受限设备中,Frame_csp需要在设备内计算,计算过程严重影响设备内执行效率;而本说明书则采用外部计算模块计算Frame_csp,计算方式不变,计算结果记录在WebAssembly二进制文件中,这样资源受限设备在加载WebAssembly二进制文件进行解释执行时可直接使用。如此可以提升二进制文件加载效率。

下面请结合图2示出的WebAssembly二进制文件生成及加载的示意图为例加以说明;对于任意类型的源代码,可以通过外部计算模块将源代码的代码文件转换为WebAssembly二进制文件(即图2中的“.wasm”)。

这样在资源受限设备响应于WebAssembly代码的执行请求时,可以借助外部计算模块计算最大操作数栈及最大控制块数(以下称为执行环境参数);并在计算出执行环境参数之后,由该外部计算模块修改WebAssembly二进制文件,将计算出的函数的执行环境参数记录到WebAssembly二进制文件中。如此,资源受限设备使用二进制文件加载器加载WebAssembly二进制文件之后执行时,直接使用记录的执行环境参数即可(即创建用于执行函数的函数栈帧),进而使用虚拟机解释器执行WebAssembly二进制文件,以完成代码执行。

在一示例性的实施例中,由所述外部计算设备计算控制块大小,并记录在WebAssembly二进制文件中;

这样,在所述WebAssembly二进制文件完成加载之后,由所述资源受限设备再一次计算控制块大小,与所述WebAssembly二进制文件中记录的控制块大小(即所述外部计算模块计算的控制块大小)进行比较;

如果比对不一致,则返回加载不成功;

如果比对一致,则在执行所述WebAssembly二进制文件的字节码时,基于所述控制块大小计算跳转的目标地址,并将该目标地址设置为所述控制块内的跳转指令的跳转目标地址。

本说明书中,资源受限设备在执行WebAssembly的字节码时,每个控制指令(如Block、loop、if)可以视为一个控制块,控制块内的跳转指令的跳转目标即为对应的控制块的目标地址。

本说明书中,针对资源受限设备内计算控制块大小影响代码执行效率,通过将计算过程放在外部计算模块,由外部计算模块计算控制块大小。如此,在WebAssembly二进制文件执行时资源受限设备可以直接使用记录的控制块大小来计算跳转的目标地址,从而能够提升代码执行效率。

此外,由于WebAssembly二进制文件在资源受限设备外生成的,如果该WebAssembly二进制文件中记录的控制块大小被恶意篡改,那么资源受限设备在加载后篡改内容就会直接存储到资源受限设备内。为此,这里在WebAssembly二进制文件加载到资源受限设备之后,由资源受限设备再一次计算控制块大小,可以用于验证外部计算模块计算的正确性(确保控制块大小没有被篡改)。即保证安全,又能提升运行时效率。

在一示例性的实施例中,所述记录在WebAssembly二进制文件中,包括:

将所述控制块大小记录在WebAssembly二进制文件中的控制块大小字段;其中,所述控制块大小字段通过以下方式记录:

由所述外部计算模块对所述WebAssembly二进制文件中用于生成所述控制块的控制指令的字节码格式进行修改,以在所述控制指令的字节码格式中增加控制块大小字段。

本说明书中,WebAssembly二进制文件加载后计算控制块的目标地址所需的控制块大小,需要记录在WebAssembly二进制文件中,以便WebAssembly二进制文件运行时直接使用。

这里,WebAssembly二进制文件的修改内容为用于生成所述控制块的控制指令(如Block、if)的字节码格式,并在该控制指令的字节码格式中存放控制块大小。

如此,在WebAssembly二进制文件加载完成后,控制块大小就可以记录在对应字节码格式中的控制块大小字段;进一步在执行WebAssembly二进制文件的字节码时,根据该控制块大小字段中记录的控制块大小和控制块的起始地址可以计算出目标地址,从而将控制块内的跳转指令的跳转目标设置为该目标地址。

WebAssembly支持结构化控制指令和受限制的跳转指令。

一般的,最基本的控制结构可以有顺序、循环和分支。组合使用这三种控制结构就可以构造出其他控制结构以及复杂程序。

WebAssembly提供有了3条控制指令:block(操作码0x02)、loop(操作码0x03)、if(操作码0x04),分别对应三种控制结构。这3条控制指令都必须和end伪指令成对出现,由于具有良好的结构特征,因此被成为结构化控制指令。

受限制的跳转指令只能跳转到结构化控制指令所定义的目标处,这些跳转目标称为跳转标签。对于block和if指令来说,跳转目标位于指令的结尾处,对于loop指令跳转目标在指令的开始处。跳转指令根据跳转标签索引跳转至对应的目标位置。

函数栈帧中包含控制块栈帧,即在字节码执行过程中,当遇到控制指令,则会创建一个新的控制块栈帧,压入函数栈帧中。运行时控制块栈帧由控制命令返回值占用的操作数栈大小(cell_num)、控制指令参数占用的参数栈(frame_sp)、控制块的目标地址(target_addr)、控制块起始地址(begin_addr)组成。

跳转指令根据跳转标签跳转、以及分支指令执行时,需要明确target_addr。对于loop类型的控制指令,跳转的target_addr即为起始地址,该地址在执行loop字节码时可以确定。而对于Block类型的控制指令,跳转地址为该控制块的结束地址,if类型的控制指令根据条件,其target_addr可以是顺序执行、else分支、结束地址中的任意一种。

所以Block类型和if类型的控制指令在执行字节码时不能确定target_addr,需要以该字节码为起始,依次统计后面的字节码,直到找到与之对应的end为止。查找并确定target_addr的操作在运行时进行,非常消耗运行时性能,尤其是控制块嵌套的比较深的情况。

针对这种情况,如前所述本说明书在设备外计算装置计算控制块大小,记录在WebAssembly二进制文件中,只需要一次计算,资源受限设备在执行WebAssembly二进制文件可以直接使用,而不需要每次执行的时候再进行计算,可以极大的提升效率。

WebAssembly二进制文件以魔数和版本号开头,在魔数和版本号之后是模块的主体内容,这些内容分门别类放在不同的段中。每个段可以包含多个项目,WebAssembly一共定义了12种段,并给每个段分配了ID(从0到11)。本发明主要修改二进制文件中的代码段,代码段的格式为代码段ID|代码段_size|函数个数(count)|函数代码(Func_code)。

根据前面所述,由外部计算模块计算的最大操作数栈和最大控制块数记录在WebAssembly二进制文件中,最大操作数栈和最大控制块数是每个函数的特征,需要记录在代码段的函数代码(Func_code)字段。下面结合图3所示,S300是WebAssembly规范中规定的代码段Func_code字段结构,S301是本说明书中修改后Func_code字段结构,S302是由外部计算模块计算的最大操作数栈,S303是由外部计算模块计算的最大控制块数。

在图3中Func_code结构中的expr为函数字节码,控制指令中会产生控制块的字节码包括if(0x04),block(0x02),loop(0x03);其中loop执行时目标地址是loop的起始地址,在字节码执行过程中可以获取,所以字节码结构不需要修改;而block和if字节码则需要修改,也就是需要在block和if字节码中增加控制块大小字段,其中if字节码还需要添加else分支偏移字段。

在一示例性的实施例中,在所述控制指令为Block指令或if指令时,所述在所述控制指令的字节码格式中增加控制块大小字段,包括:

在所述Block指令的字节码格式的操作码后增加控制块大小字段;或者,

在所述if指令的字节码格式的操作码后增加控制块大小字段及else分支偏移字段。

其中,修改后Block指令的字节码格式为Block(0x20)|BlockSize|Bt|Instr|end;所述BlockSize为控制块大小(用于计算控制块结束的目标地址),Bt为块类型,Instr为表达式,end为结束标记。

其中,修改后if指令的字节码格式为

if(0x04)|BlockSize|elseOffset|Bt|Instr1|else(0x05)|Instr2|end;

其中,BlockSize为控制块大小(用于计算控制块结束的目标地址),elseOffset为else分支偏移(用于计算else分支目标地址),Bt为块类型,Instr1为if对应的表达式,Instr2为else对应的表达式,end为结束标记。其中else分支可以不存在,当else分支不存在时,elseOffset字段依然存在,但是该elseOffset字段内存放的值没有意义。

下面结合图4所示的block字节码修改示意图和图5所示的if字节码修改示意图进行说明。图4中的S400和图5中的S500分别是WebAssembly规范中规定的block和if字节码结构,S401和S501分别是修改后block和if的字节码结构。而S402、S502、S503是控制块大小字段,本实施例中分别记录block控制码块的大小、if控制块的大小和else地址偏移;如此,在WebAssembly二进制文件加载之前可以由外部计算模块计算控制块大小,并将计算结果记录到该控制块大小字段。在二进制文件加载之后,设备内再一次计算控制块大小,与设备外计算的结果进行比较,以保证二进制文件没有被恶意篡改。进一步,在执行字节码的时候,根据起始地址和WebAssembly二进制文件中记录的控制块大小,就可以确定控制块对应的目标地址。

与前述WebAssembly代码的执行方法实施例相对应,本说明书还提供了WebAssembly代码的执行装置的实施例。所述装置实施例可以通过软件实现,也可以通过硬件或者软硬件结合的方式实现。以软件实现为例,作为一个逻辑意义上的装置,是通过其所在设备的处理器将非易失性存储器中对应的计算机程序读取到内存中运行形成的。从硬件层面而言,如图6所示,为本说明书WebAssembly代码的执行装置所在设备的一种硬件结构图,除了图6所示的处理器、网络接口、内存以及非易失性存储器之外,实施例中装置所在的设备通常根据通信实际功能,还可以包括其他硬件,对此不再赘述。

请参见图7,为本说明书一实施例提供的WebAssembly代码的执行装置的模块图,所述装置对应了图1所示实施例,应用于资源受限设备,所述装置包括:

接收单元710,接收WebAssembly代码的执行请求;

响应单元720,响应于所述执行请求,确定所述WebAssembly代码中的目标函数,并由外部计算模块计算执行所述目标函数所需的执行环境参数;

执行单元730,在执行所述WebAssembly代码时,基于所述外部计算模块计算的执行环境参数,创建用于执行所述目标函数的函数栈帧。

可选的,在执行单元730之前,还包括:

修改单元,由所述外部计算模块对所述WebAssembly代码所在的WebAssembly二进制文件进行修改,以在所述WebAssembly二进制文件内的所述目标函数的代码段中记录所述执行环境参数;

所述执行单元730中的基于所述外部计算模块计算的执行环境参数,创建用于执行所述目标函数的函数栈帧,进一步包括:

加载所述WebAssembly二进制文件,并解析所述WebAssembly二进制文件的字节码;

根据所述目标函数的代码段记录的执行环境参数计算用于执行所述目标函数的函数栈帧的大小;进而创建所述大小的函数栈帧。

可选的,所述执行环境参数包括最大操作数栈和/或最大控制块数。

可选的,所述装置还包括:

记录单元,由所述外部计算设备计算控制块大小,并记录在WebAssembly二进制文件中;

校验单元,在所述WebAssembly二进制文件完成加载之后,由所述资源受限设备计算控制块大小,与所述WebAssembly二进制文件中记录的控制块大小进行比较;如果比较一致,则执行后续执行单元730;

所述执行单元730,还用于在执行所述WebAssembly二进制文件的字节码且控制块大小一致时,基于所述控制块大小计算跳转的目标地址,并将所述控制块内的跳转指令的跳转目标设置为所述WebAssembly二进制文件中记录的目标地址。

可选的,所述记录单元,进一步用于将所述控制块大小记录在WebAssembly二进制文件中的控制块大小字段;

其中,所述控制块大小字段通过以下记录单元记录:

记录单元,由所述外部计算模块对所述WebAssembly二进制文件中用于生成所述控制块的控制指令的字节码格式进行修改,以在所述控制指令的字节码格式中增加控制块大小字段。

可选的,在所述控制指令为Block指令或if指令时,所述记录单元中的在所述控制指令的字节码格式中增加控制块大小字段,进一步用于在所述Block指令的字节码格式的操作码后增加控制块大小字段;或者,在所述if指令的字节码格式的操作码后增加控制块大小字段。

可选的,修改后Block指令的字节码格式为Block(0x20)|BlockSize|Bt(块类型)|Instr(表达式)|end(结束标记);

其中,所述BlockSize为控制块大小,Bt为块类型,Instr为表达式,end为结束标记。

可选的,修改后if指令的字节码格式为

if(0x04)|BlockSize|elseOffset|Bt|Instr1|else(0x05)|Instr2|end;

其中,BlockSize为控制块大小,elseOffset存放eles分值地址的偏移,Bt为块类型,Instr1为if对应的表达式,Instr2为else对应的表达式,end为结束标记。

上述实施例阐明的系统、装置、模块或单元,具体可以由计算机芯片或实体实现,或者由具有某种功能的产品来实现。一种典型的实现设备为计算机,计算机的具体形式可以是个人计算机、膝上型计算机、蜂窝电话、相机电话、智能电话、个人数字助理、媒体播放器、导航设备、电子邮件收发设备、游戏控制台、平板计算机、可穿戴设备或者这些设备中的任意几种设备的组合。

上述装置中各个单元的功能和作用的实现过程具体详见上述方法中对应步骤的实现过程,在此不再赘述。

对于装置实施例而言,由于其基本对应于方法实施例,所以相关之处参见方法实施例的部分说明即可。以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本说明书方案的目的。本领域普通技术人员在不付出创造性劳动的情况下,即可以理解并实施。

以上图7描述了WebAssembly代码的执行装置的内部功能模块和结构示意,其实质上的执行主体可以为一种电子设备,包括:

处理器;

用于存储处理器可执行指令的存储器;

其中,所述处理器被配置为执行上述任一WebAssembly代码的执行方法的实施例。

在上述电子设备的实施例中,应理解,该处理器可以是中央处理单元(英文:Central Processing Unit,简称:CPU),还可以是其他通用处理器、数字信号处理器(英文:Digital Signal Processor,简称:DSP)、专用集成电路(英文:Application SpecificIntegrated Circuit,简称:ASIC)等。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等,而前述的存储器可以是只读存储器(英文:read-only memory,缩写:ROM)、随机存取存储器(英文:random access memory,简称:RAM)、快闪存储器、硬盘或者固态硬盘。结合本发明实施例所公开的方法的步骤可以直接体现为硬件处理器执行完成,或者用处理器中的硬件及软件模块组合执行完成。

本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于电子设备实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。

本领域技术人员在考虑说明书及实践这里公开的发明后,将容易想到本说明书的其它实施方案。本说明书旨在涵盖本说明书的任何变型、用途或者适应性变化,这些变型、用途或者适应性变化遵循本说明书的一般性原理并包括本说明书未公开的本技术领域中的公知常识或惯用技术手段。说明书和实施例仅被视为示例性的,本说明书的真正范围和精神由下面的权利要求指出。

应当理解的是,本说明书并不局限于上面已经描述并在附图中示出的精确结构,并且可以在不脱离其范围进行各种修改和改变。本说明书的范围仅由所附的权利要求来限制。

相关技术
  • 转换java代码的方法及装置、存储介质、电子装置
  • 将ST代码编译为WebAssembly代码的方法及装置
  • 将PLC程序代码编译为WebAssembly代码的方法及装置
技术分类

06120116485625