CN110704108A - 解释执行字节码指令流的方法及装置 - Google Patents

解释执行字节码指令流的方法及装置 Download PDF

Info

Publication number
CN110704108A
CN110704108A CN201910818266.XA CN201910818266A CN110704108A CN 110704108 A CN110704108 A CN 110704108A CN 201910818266 A CN201910818266 A CN 201910818266A CN 110704108 A CN110704108 A CN 110704108A
Authority
CN
China
Prior art keywords
instruction
current
register
value
memory
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.)
Granted
Application number
CN201910818266.XA
Other languages
English (en)
Other versions
CN110704108B (zh
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.)
Advanced New Technologies Co Ltd
Advantageous New Technologies Co Ltd
Original Assignee
Alibaba Group Holding 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 Alibaba Group Holding Ltd filed Critical Alibaba Group Holding Ltd
Priority to CN201910818266.XA priority Critical patent/CN110704108B/zh
Priority to PCT/CN2020/071560 priority patent/WO2021036173A1/zh
Publication of CN110704108A publication Critical patent/CN110704108A/zh
Priority to US16/786,856 priority patent/US10802854B2/en
Priority to TW109107460A priority patent/TWI743698B/zh
Application granted granted Critical
Publication of CN110704108B publication Critical patent/CN110704108B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • 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/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/38Concurrent instruction execution, e.g. pipeline or look ahead
    • G06F9/3802Instruction prefetching
    • 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/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/32Address formation of the next instruction, e.g. by incrementing the instruction counter
    • G06F9/321Program or instruction counter, e.g. incrementing

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Memory System Of A Hierarchy Structure (AREA)

Abstract

本说明书实施例提供一种解释执行字节码指令流的方法和装置,通过虚拟机的解释器实现,其中利用第一寄存器存储下一条指令的模拟函数地址,利用第二寄存器存储当前指令的模拟函数地址。在方法中,首先读取第一寄存器中存储的第一值;当第一值为有效值时,将第一值存储到第二寄存器中,作为字节码指令流中当前指令对应的当前模拟函数地址。然后,从存储器获取当前指令的下一条指令对应的下一模拟函数地址,并将该下一模拟函数地址存储在第一寄存器中,并且,根据从第二寄存器中读取的当前模拟函数地址,执行当前指令。

Description

解释执行字节码指令流的方法及装置
技术领域
本说明书一个或多个实施例涉及计算机领域,尤其涉及解释执行字节码指令流的方法和装置。
背景技术
虚拟机(Virtual Machine)是通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统。由于虚拟机可以隔离底层硬件平台以及操作系统对上层应用的影响,因此非常有利于上层应用的开发。上层应用开发过程中无需关注底层平台的细节,只需要关注具体的业务逻辑。开发完成后,由虚拟机运行上层应用,负责将应用的代码转换为适于底层平台执行的代码。具体地,在许多场景中,上层应用由开发人员使用高级语言编写开发,之后通过编译器编译为字节码(bytecode)。字节码是一种包含执行程序,由一序列op代码(操作码)/数据对组成的二进制文件,是一种中间码。然后,虚拟机中的解释器对字节码代表的指令流进行解释和执行。
例如,在支持智能合约的区块链应用场景中,可以在区块链网络的每个节点中部署虚拟机。例如,在以太坊中,每个节点中部署有以太坊虚拟机EVM。用户可以用高级语言编写智能合约,然后经由编译器编译为字节码之后,将该字节码包含在创建智能合约的交易中,发布到区块链网络中,也就是部署到区块链网络的各个节点中。在需要执行智能合约时,由各个节点中的虚拟机EVM对该字节码进行解释执行。
在包括但不限于区块链的各种应用场景中,虚拟机解释器对字节码的解释执行速度对于整个系统的性能都至关重要。因此,希望能有改进的方案,进一步提高字节码指令流的执行效率。
发明内容
本说明书一个或多个实施例描述了一种解释执行字节码指令流的方法和装置,其中在执行当前指令时预取下一条指令的函数地址,并将其存储在寄存器中,从而加快字节码指令流的执行效率。
根据第一方面,提供了一种解释执行字节码指令流的方法,通过虚拟机解释器执行,包括:
读取第一寄存器中存储的第一值;
当所述第一值为有效值时,将所述第一值存储到第二寄存器中,所述第二寄存器用于存储所述字节码指令流中当前指令对应的当前模拟函数地址;
从存储器获取所述当前指令的下一条指令对应的下一模拟函数地址,并将该下一模拟函数地址存储在所述第一寄存器中,并且,根据从所述第二寄存器中读取的所述当前模拟函数地址,执行所述当前指令。
根据一种实施方式,上述方法还包括,当所述第一值不是有效值时,从存储器获取所述当前指令对应的当前模拟函数地址,并将其存储到所述第二寄存器中。
在一个实施例中,通过以下方式获取下一模拟函数地址:
确定下一条指令对应的操作码;
查询所述存储器中存储的映射表,从而得到所述操作码对应的模拟函数地址。
进一步的,在一个实施例中,通过以下方式确定下一条指令对应的操作码:将程序计数器的PC值累加预定字节长度,得到下一条指令的位置编号;根据该位置编号,查询所述存储器中存储的指令顺序表,得到下一条指令对应的操作码。
在另一实施例中,通过以下方式确定下一条指令对应的操作码:确定所述当前指令的指令长度;将程序计数器的PC值累加所述指令长度,得到下一条指令的位置编号;根据该位置编号,查询所述存储器中存储的指令顺序表,得到下一条指令对应的操作码。
在不同实施例中,上述存储器可以为高速缓存或内存;所述查询存储器中存储的映射表,和/或,查询存储器中存储的指令顺序表,包括:在高速缓存中进行查询;在不命中的情况下,在内存中进行查询。
根据一个实施例,执行当前指令具体包括:
判断当前指令是否会改变指令流顺序;
如果是,则将所述第一寄存器设为无效值,并执行所述当前指令对应的当前模拟函数;
如果否,直接执行所述当前指令对应的当前模拟函数。
在一个实施例中,在从存储器获取所述当前指令的下一条指令对应的下一模拟函数地址之后,还包括:根据所述下一模拟函数地址,判断所述下一条指定对应的下一模拟函数是否被加载到高速缓存中;如果没有,则将该下一模拟函数加载到高速缓存中。
根据一个实施例,所述字节码指令流为智能合约编译后的字节码指令流,所述虚拟机为WASM虚拟机或Solidity虚拟机。
根据第二方面,提供了一种解释执行字节码指令流的装置,部署在虚拟机的解释器中,包括:
读取单元,配置为读取第一寄存器中存储的第一值;
存储单元,配置为当所述第一值为有效值时,将所述第一值存储到第二寄存器中,所述第二寄存器用于存储所述字节码指令流中当前指令对应的当前模拟函数地址;
预取及执行单元,配置为从存储器获取所述当前指令的下一条指令对应的下一模拟函数地址,并将该下一模拟函数地址存储在所述第一寄存器中,并且,根据从所述第二寄存器中读取的所述当前模拟函数地址,执行所述当前指令。
根据第三方面,提供了一种计算机可读存储介质,其上存储有计算机程序,当所述计算机程序在计算机中执行时,令计算机执行第一方面的方法。
根据第四方面,提供了一种计算设备,包括存储器和处理器,其特征在于,所述存储器中存储有可执行代码,所述处理器执行所述可执行代码时,实现第一方面的方法。
根据本说明书实施例提供的方法和装置,提前预取下一条指令对应的模拟函数地址,并将其存储在寄存器中,同时执行当前指令的模拟函数。在执行完当前指令后,就可以直接从寄存器中读取下一条指令所需的模拟函数地址进行执行。由于CPU访问寄存器速度极快,因此,这样的方式可以极大地缩减执行字节码指令流的耗时,提高执行效率。
附图说明
为了更清楚地说明本发明实施例的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其它的附图。
图1示出在一个实施例中的应用场景示意图;
图2示出在一个实施例中解释执行字节码指令流的过程示意图;
图3示出根据一个实施例的解释执行字节码指令流的方法流程图;
图4示出根据一个实施例的解释执行一段字节码指令流的完整步骤流程示意图;
图5示出根据一个实施例的解释执行字节码指令流的装置的示意性框图。
具体实施方式
下面结合附图,对本说明书提供的方案进行描述。
图1示出在一个实施例中的应用场景示意图。如图1所示,在多种应用场景中,通过编译器将高级语言编写的程序编译为字节码文件,由虚拟机解释器对字节码代表的指令流进行解释,使其在CPU中执行。
图2示出在一个实施例中解释执行字节码指令流的过程示意图。如本领域技术人员所知,在执行字节码文件之前,虚拟机首先会将该字节码文件加载到内存中,并得到图2中表A所示的指令顺序表。在表A中,左侧的100,108…等等是位置编号,右侧的20,31,等等,示例性代表操作码(opcode)。可以看到每个操作码都是两位十六进制数,长度为一个字节,这也正是其称为字节码的原因。
虚拟机使用程序计数器(Program Counter)来记录当前执行指令的位置编号,该程序计数器的值又称为PC值。因此,根据表A,当PC值为100时,表示当前要执行操作码20。
为了执行操作码指示的指令,需要查阅表B所示的映射表,该映射表示出各个操作码对应的模拟函数。例如,根据表B,操作码10对应于Move函数,操作码20对应于Add函数,操作码31对应于JMP函数,等等。表B的映射表有时又称为指令集,用于记录各个操作码对应的操作指令含义(通过模拟函数体现)。不过,更具体而言,该映射表并不记录模拟函数包含的指令代码本身,而是记录存储模拟函数的指令代码的地址。因此,通过查询表B,可以得到当前要执行的操作码所对应的模拟函数地址,经由该地址,可以访问得到模拟函数的指令代码。模拟函数的指令代码可以是适于机器执行的形式,由此,就可以通过执行模拟函数的指令代码,执行各个操作码代表的指令。
结合具体例子而言,假定当前PC值为100,那么通过表A可以得到,字节码指令流中当前要执行的操作码为20。然后,查询表B,得到操作码20对应的模拟函数地址,根据该地址,执行模拟函数中的代码,从而执行当前指令。由于字节码文件是顺序执行的指令流,因此除了个别跳转指令之外,PC值会顺序累加。在执行完100位置处的指令后,PC值累加到108,指向下一条指令作为当前要执行的指令。相应地,通过表A得到,位置编号108处当前要执行的指令中的操作码为31。类似的,通过查询表B,得到操作码31对应的模拟函数地址,执行其中的代码,从而执行当前指令。如此继续。
通过以上过程可以看到,每执行一条指令,至少需要经过两次查表过程。也就是,首先根据PC值查询表A,得到将要执行的操作码;然后,根据该操作码查询表B,得到操作码对应的模拟函数地址,然后才能执行该模拟函数。
可以理解,通过虚拟机对字节码文件的加载过程,表A和表B至少会存储于内存中。进一步地,综合CPU中高速缓存(cache)的容量大小,以及表A和表B被访问的频次,表A和/或表B还有可能被存储在高速缓存中。在执行指令过程中,CPU为了查询表A和表B,会优先访问高速缓存,在高速缓存不命中的情况下,再去访问内存。对于目前的多数CPU而言,访问L1级高速缓存需要10多个时钟周期(Cycle),访问L2级高速缓存需要20多个时钟周期,如果访问内存,则需要200多个时钟周期。因此,即使表A和表B均存储于L1级高速缓存,两次查表至少要耗时20多个时钟周期;而在访问表A或表B时缓存不命中(miss)的情况下,则需要花费几百个时钟周期从内存中进行查表。
考虑到以上过程中查表造成的耗时,在本说明书的实施例中提出一种地址预取的方案,也就是,提前预取下一条指令对应的模拟函数地址,并将其存储在寄存器中,同时执行当前指令的模拟函数。在执行完当前指令后,就可以直接从寄存器中读取下一条指令所需的模拟函数地址进行执行。由于CPU访问寄存器速度极快(只需1个时钟周期),因此,这样的方式可以极大地缩减执行字节码指令流的耗时,提高执行效率。下面描述该发明构思的实现方式。
图3示出根据一个实施例的解释执行字节码指令流的方法流程图。可以理解,该方法可以通过虚拟机解释器执行,其中虚拟机可以部署于任何具有计算、处理能力的装置、设备、平台、设备集群中。在一个实施例中,虚拟机可以是一些通用的虚拟机,例如Java虚拟机,Python虚拟机,从而用于解释执行各种应用对应的字节码文件。在一个实施例中,虚拟机可以是区块链网络中用于执行智能合约的虚拟机,例如EVM虚拟机,WASM虚拟机,Solidity虚拟机。这些虚拟机可以利用其中的解释器,解释执行智能合约编译后生成的字节码指令流。
根据前述的构思,在图3所示的方法中,利用两个寄存器来进行模拟函数地址的预取,为了表述的方便,将这两个寄存器称为第一寄存器和第二寄存器,其中可以将第一寄存器设定用于存储下一条指令对应的模拟函数地址,将第二寄存器设定用于存储当前指令对应的模拟函数地址。图3具体示出在任一个指令执行循环中实施的方法步骤,为了描述的清楚和简单,结合第n个循环中要执行第n条指令的情况进行描述,此时,将该循环中要执行的第n条指令称为当前指令,其中n>1。另外需要理解,结合图2中表A和图3描述中所称的当前指令、下一条指令,均为操作码指令,以区别于处理器直接执行的机器指令。
如图3所示,首先在步骤31,读取第一寄存器中存储的第一值,并判断第一值的有效性。如前所述,第一寄存器用于存储下一条指令对应的模拟函数地址。因此,如果第一寄存器中存储的值无效,则表明,在执行之前的第n-1条指令时对第n条指令所需地址的预取无效;如果第一寄存器中存储的值有效,则表明,在执行之前第n-1条指令时对第n条指令所需地址的预取操作成功,且该第一值即为第n条指令所需的函数地址。具体地,在一个示例中,如果第一寄存器中存储的第一值为零,则为无效值,否则为有效值。在另一示例中,还可以通过其他方式示出是否为有效值,例如将寄存器中的某一位设为状态位,通过该状态位示出上一轮是否预取成功。
当第一值为有效值时,表明上一轮的预取成功,因此,在步骤33,将该第一值存储到第二寄存器中。于是,第二寄存器中存储了上述第一值,即第n条指令对应的模拟函数地址,也就是当前指令对应的当前模拟函数地址。由此,实现了指令执行轮次或循环的更新,此时,第一寄存器重新可用于存储下一条指令所需的函数地址,而第二寄存器存储了当前指令的函数地址。
接着,在步骤35,通过访问存储器获取当前的第n条指令的下一条指令(第n+1条指令)对应的下一模拟函数地址,将该下一模拟函数地址存储在上述第一寄存器中,并且,根据从第二寄存器中读取的当前模拟函数地址,执行当前指令。
可以看到,步骤35中包含预取下一条指令的函数地址的操作,以及执行当前指令的操作,下面对其分别进行描述。
首先描述预取下一条指令的函数地址的操作,该操作与常规获取模拟函数地址的过程类似,仍然通过查询图2所示的表A和表B来实现。具体地,预取下一条指令的函数地址的操作可以包括以下过程。
首先,确定下一条指令对应的操作码。
在一个实施例中,各个指令为预定长度的定长指令,例如如图2所示,每个指令对应一个操作码opcode,长度为定长的一个字节。此时,将程序计数器的PC值累加该预定字节长度,即可得到下一条指令的位置编号;然后,根据该位置编号,查询指令顺序表,即表A,便可得到下一条指令对应的操作码。
在另一实施例中,指令流中包含的指令长度不一。例如,在WASM字节码中,字节码通过leb 128编码,而leb 128编码是不定长编码。由此,各个指令的长度并不一致。在这样的情况下,首先需要确定当前指令的指令长度,将程序计数器的PC值累加该指令长度,得到下一条指令的位置编号。然后,根据该位置编号,查询指令顺序表,确定出下一条指令对应的操作码。
在确定下一条指令对应的操作码后,查询表B所示的映射表,从而得到该操作码对应的模拟函数地址,作为下一模拟函数地址。
在以上查询指令顺序表A和映射表B时,都是首先在高速缓存中查询,如果不命中,则访问内存进行查询。通过查询这两个表,获取到下一条指令对应的下一模拟函数地址。
在一个实施例中,在获取到下一模拟函数地址后,根据该地址,判断对应的下一模拟函数是否被加载到高速缓存中。如果没有,则将该下一模拟函数加载到高速缓存中。如此,可以在下一模拟函数没有加载到高速缓存的情况下,提前将其加载到高速缓存,避免执行下一条指令时访问内存的耗时,进一步加快指令的执行。
下面描述执行当前指令的操作。具体而言,由于在步骤33已经将当前模拟函数地址转存到第二寄存器中,因此,在步骤35,从第二寄存器中读取当前模拟函数地址,根据该地址,获取到当前模拟函数以及实现该模拟函数的指令代码。
首先根据该模拟函数判断当前指令是否会改变指令流执行顺序,即判断当前指令是否为跳转指令,如果是,则说明下一条指令可能并不是以上按照顺序执行更新PC值确定的指令,以上下一条指令地址的预取可能出错。因此,将第一寄存器设为无效值,例如将其重置为零,或者将状态位设为无效。然后,执行当前指令对应的模拟函数的指令代码。如果当前指令不是跳转指令,则直接执行模拟函数的指令代码。
在一个例子中,该指令代码为适于CPU直接执行的机器代码,在这样的情况下,可以直接按照所述机器代码执行机器指令,从而执行当前的操作码指令。在另一例子中,该指令代码为比字节码更接近机器指令形式的代码,例如汇编代码,在这样的情况下,可以将该指令代码转换为机器代码,通过执行机器代码执行当前的操作码指令。
如上所述,步骤35包含预取下一条指令的函数地址的预取操作,和执行当前指令的执行操作。在预取操作中,由于模拟函数地址必须通过查询映射表才能获取,而映射表存储于高速缓存或内存中,因此预取下一条指令地址仍然需要通过访问存储器(缓存或内存)实现。假定预取下一条指令的模拟函数地址需要时间T1。另一方面,当前指令的执行是通过执行对应的模拟函数实现,而模拟函数一般对应于许多条机器指令构成的指令流,因此当前指令的执行一般要花费更多的时间,该时间记为T2。
可以理解,执行当前指令的时间T2是无法避免的,因此,希望能够将预取下一条指令地址所需的执行时间T1“隐藏”起来,例如“隐藏”在T2中,使得预取操作尽量少地单独占用时间,则可以提升整个执行效率。
在一个实施例中,在执行步骤35时,可以使得预取操作和当前指令的执行操作在CPU的不同执行单元(即处理器)中并行执行,如此使得预取操作完全不会单独占用时间。不过,这仅仅适用于具有不同执行单元的CPU,例如一些多核CPU。
在另一个实施例中采用更普适的方案,也就是,在解释器的逻辑层面上,先执行预取操作,然后执行当前模拟函数,但是,在处理器的执行层面上,通过多机器指令的并行执行,隐藏预取操作的执行时间。
具体而言,当前的多数处理器通过采用流水线(pipeline)方式,将机器指令拆分为更小的子过程,多个子过程之间可以并行执行,从而可以支持多机器指令的并行执行。对于预取操作和当前模拟函数的执行操作而言,这两项操作都被转换给一系列机器指令流。由于预取操作和当前模拟函数的执行并不依赖,因此,预取操作尚未完成,在某些机器指令需要等待的间歇(例如访问高速缓存或访问内存时的等待),处理器会并行地乱序执行后续机器指令,也就是执行当前模拟函数,之后将乱序执行的结果再次排序(reorder),得到当前模拟函数的执行结果。由此,在效果上实现两者的并行执行,将预取操作的时间T1隐藏在当前模拟函数的执行时间T2中。
于是,在当前模拟函数执行完毕时,下一模拟函数的地址已经预取成功,存储到第一寄存器中。于是,通过再次执行图3的方法,进入下一轮指令执行,其中可以从寄存器中直接获取所需地址,执行模拟函数。通过这样的方式,在每一轮指令执行过程中,隐藏或者消除了从存储器获取模拟函数地址的时间,加速了指令的执行。
然而,也会存在地址预取不成功的情况,例如,如前所述,当前指令为跳转指令,需要依赖于当前指令的执行结果确定跳转的位置,那么提前确定的下一条指令有可能不准确,此时,将第一寄存器设置为无效值。这对应于图3的步骤34。也就是说,当第一寄存器中的值不是有效值时,从存储器获取当前指令对应的当前模拟函数地址,并将其存储到第二寄存器中。这相当于上一轮的投机预取没有成功,在这一轮,按照常规方式正常获取当前指令的当前模拟函数地址。并且,将该当前模拟函数地址存储到第二寄存器中。接着,仍然执行上述步骤35,尝试下一条指令地址的预取,并执行当前指令的模拟函数。
图4示出根据一个实施例的解释执行一段字节码指令流的完整步骤流程示意图。下面仍然结合图2表A所示的指令顺序表描述图4所示的过程。
首先,在步骤401,获取起始指令的操作码。一般地,根据预设的字节码指令流的入口位置,即入口PC值,获取起始指令的操作码。在图2的例子中,假定入口PC值为100,那么起始指令的操作码为20。
接着,在步骤402,获取起始指令对应的模拟函数地址,将其存入第一寄存器。在图1的例子中,根据起始指令的操作码20查询表B,可以得到对应的模拟函数Add函数的地址,假定其为地址A,将该地址A存入第一寄存器。
然后,在步骤403,确定下一条指令的位置编号。在定长的情况下,假定PC值更新为108,作为下一条指令的位置编号。
在步骤404,判断是否遇到结束条件。结束条件可以有多种设定,例如指令流执行完毕,溢出,等等。
由于没有遇到结束条件,继续前进至步骤405,判断第一寄存器中是否为有效值。由于当前第一寄存器中存储了有效值地址A,那么流程前进至步骤406,将第一寄存器中的值存储到第二寄存器中。于是,第二寄存器中存储了地址A。
接着,在步骤407,根据下一条指令的位置编号获取下一条指令。由于在步骤403,PC值更新为108,因此,根据该位置编号可以得到下一条指令为操作码31。
于是,在步骤408,获取下一条指令对应的模拟函数地址,存储到第一寄存器中。延续上例,通过查询映射表,可以得到下一条指令的操作码31对应于JMP函数,相应的将JMP函数的地址,地址J存储在第一寄存器中。此时,第一寄存器中的值得到更新。
接着,在步骤409,再次更新下一条指令的位置编号。此时,PC值更新为116。
并且,在步骤410,根据第二寄存器中的地址,执行当前指令对应的模拟函数。也就是,根据前述的地址A,执行Add函数。
如前所述,在CPU执行过程中,由于步骤407-408与步骤410并不依赖,因此,通过机器指令的并行执行,步骤407-408的执行时间被隐藏在步骤410的执行过程中。
在第一条指令对应的Add函数执行完毕之后,流程回到步骤404。由于没有遇到结束条件,继续前进至步骤405,判断第一寄存器中是否为有效值。此时,第一寄存器中存储了有效值地址J,那么流程前进至步骤406,将第一寄存器中的值存储到第二寄存器中。
接着,在步骤407,根据下一条指令的位置编号获取下一条指令。由于在上一轮的步骤409,PC值更新为116,因此,根据该位置编号可以得到下一条指令为操作码60。
于是,在步骤408,获取下一条指令对应的模拟函数地址,存储到第一寄存器中。类似的,通过查询映射表,可以得到下一条指令的操作码60对应于Push函数,相应的将Push函数的地址,地址P存储在第一寄存器中。
接着,在步骤409,再次更新下一条指令的位置编号。此时,PC值更新为124。
并且,在步骤410,根据第二寄存器中的地址J,执行当前指令对应的模拟函数JMP。假定该函数是一个条件跳转函数,根据执行中某个参数的值确定跳转目标。那么,在执行该模拟函数时,首先将第一寄存器中存储的值设为无效,例如,将第一寄存器中的值清除为零,或者将其状态位设为无效,等等。此外,通过执行该JMP函数,可以确定接下来要执行的指令。假定,通过执行该函数,确定跳转到132处的指令,那么PC值重设为132。
再次回到步骤404后进入步骤405,在其中判断第一寄存器中是否为有效值。此时,第一寄存器已被清除或设为无效,因此步骤405的判断为否,于是进入另一分支的步骤411。
在步骤411,获取当前指令的操作码。由于经过跳转,PC重设为132,因此可以得到132处的操作码10为当前指令的操作码。
接着,在步骤412,获取当前指令的当前模拟函数地址,将其存入第二寄存器。于是,通过查询映射表,得到操作码10对应的Move函数,将其地址M存入第二寄存器。
然后,在步骤413,获得下一条指令的位置编号。于是,进一步对PC值累加,更新为140。
再次执行步骤407-408,预取下一条指令的模拟函数地址,存入第一寄存器;然后在步骤409继续更新PC值,并在步骤410,按照第二寄存器中存储的地址M,执行当前的模拟函数Move。
如此持续执行,直到遇到结束条件。
从以上过程可以看到,在指令顺序执行的情况下,会按照步骤406的分支执行,此时,对于当前指令,只需要读取第二寄存器就可获得要执行的函数地址,而寄存器读取(只需1个时钟周期)相比于访问高速缓存或内存(几十甚至几百时钟周期)的耗时大大降低。同时,如前所述,预取下一条指令函数地址的耗时被隐藏在执行本次指令之中,几乎不增加额外耗时,因此,整个执行过程得到加速。仅仅在遇到跳转指令,指令流的执行顺序发生改变时,需要沿着步骤411的分支执行。但是一般而言,跳转指令仅占总体指令的很小一部分(20%左右),因此,多数指令都可以通过预取的方式加快执行过程,整个指令流的执行效率得到提升。
根据另一方面的实施例,提供了一种解释执行字节码指令流的装置,该装置部署在虚拟机的解释器中,虚拟机可以安装在任何具有计算、处理能力的设备、平台或设备集群中。图5示出根据一个实施例的解释执行字节码指令流的装置的示意性框图。如图5所示,该装置500包括:
读取单元51,配置为读取第一寄存器中存储的第一值;
存储单元53,配置为当所述第一值为有效值时,将所述第一值存储到第二寄存器中,所述第二寄存器用于存储所述字节码指令流中当前指令对应的当前模拟函数地址;
预取及执行单元55,配置为从存储器获取所述当前指令的下一条指令对应的下一模拟函数地址,并将该下一模拟函数地址存储在所述第一寄存器中,并且,根据从所述第二寄存器中读取的所述当前模拟函数地址,执行所述当前指令。
在一个实施例中,装置500还包括地址获取单元54,配置为,当所述第一值不是有效值时,从存储器获取所述当前指令对应的当前模拟函数地址,并将其存储到所述第二寄存器中。
根据一个实施例,所述预取及执行单元55包括预取模块551,所述预取模块551配置为:
确定下一条指令对应的操作码;
查询所述存储器中存储的映射表,从而得到所述操作码对应的模拟函数地址。
进一步的,在一个实施例中,所述预取模块551进一步配置为:
将程序计数器的PC值累加预定字节长度,得到下一条指令的位置编号;
根据该位置编号,查询所述存储器中存储的指令顺序表,得到下一条指令对应的操作码。
在另一实施例中,所述预取模块551进一步配置为:
确定所述当前指令的指令长度;
将程序计数器的PC值累加所述指令长度,得到下一条指令的位置编号;
根据该位置编号,查询所述存储器中存储的指令顺序表,得到下一条指令对应的操作码。
在不同实施例中,所述存储器可以为高速缓存或内存;相应地,所述预取模块551配置为:在高速缓存中查询所述映射表和/或所述指令顺序表;在不命中的情况下,在内存中进行查询。
根据一个实施例,所述预取及执行单元55包括执行模块552,所述执行模块552配置为:
判断当前指令是否会改变指令流顺序;
如果是,则将所述第一寄存器设为无效值,并执行所述当前指令对应的当前模拟函数;
如果否,直接执行所述当前指令对应的当前模拟函数。
在一个实施例中,所述预取及执行单元55还配置为:
根据所述下一模拟函数地址,判断所述下一条指定对应的下一模拟函数是否被加载到高速缓存中;如果没有,则将该下一模拟函数加载到高速缓存中。
在一个实施例中,所述字节码指令流为智能合约编译后的字节码指令流,所述虚拟机为WASM虚拟机或Solidity虚拟机。
根据另一方面的实施例,还提供一种计算机可读存储介质,其上存储有计算机程序,当所述计算机程序在计算机中执行时,令计算机执行结合图3和图4所描述的方法。
根据再一方面的实施例,还提供一种计算设备,包括存储器和处理器,所述存储器中存储有可执行代码,所述处理器执行所述可执行代码时,实现结合图3和图4所述的方法。
本领域技术人员应该可以意识到,在上述一个或多个示例中,本发明所描述的功能可以用硬件、软件、固件或它们的任意组合来实现。当使用软件实现时,可以将这些功能存储在计算机可读介质中或者作为计算机可读介质上的一个或多个指令或代码进行传输。
以上所述的具体实施方式,对本发明的目的、技术方案和有益效果进行了进一步详细说明,所应理解的是,以上所述仅为本发明的具体实施方式而已,并不用于限定本发明的保护范围,凡在本发明的技术方案的基础之上,所做的任何修改、等同替换、改进等,均应包括在本发明的保护范围之内。

Claims (20)

1.一种解释执行字节码指令流的方法,通过虚拟机的解释器执行,包括:
读取第一寄存器中存储的第一值;
当所述第一值为有效值时,将所述第一值存储到第二寄存器中,所述第二寄存器用于存储所述字节码指令流中当前指令对应的当前模拟函数地址;
从存储器获取所述当前指令的下一条指令对应的下一模拟函数地址,并将该下一模拟函数地址存储在所述第一寄存器中,并且,根据从所述第二寄存器中读取的所述当前模拟函数地址,执行所述当前指令。
2.根据权利要求1所述的方法,还包括,当所述第一值不是有效值时,从存储器获取所述当前指令对应的当前模拟函数地址,并将其存储到所述第二寄存器中。
3.根据权利要求1或2所述的方法,其中,从存储器获取所述当前指令的下一条指令对应的下一模拟函数地址,包括:
确定下一条指令对应的操作码;
查询所述存储器中存储的映射表,从而得到所述操作码对应的模拟函数地址。
4.根据权利要求3所述的方法,其中,确定下一条指令对应的操作码包括:
将程序计数器的PC值累加预定字节长度,得到下一条指令的位置编号;
根据该位置编号,查询所述存储器中存储的指令顺序表,得到下一条指令对应的操作码。
5.根据权利要求3所述的方法,其中,确定下一条指令对应的操作码包括:
确定所述当前指令的指令长度;
将程序计数器的PC值累加所述指令长度,得到下一条指令的位置编号;
根据该位置编号,查询所述存储器中存储的指令顺序表,得到下一条指令对应的操作码。
6.根据权利要求4或5所述的方法,其中,所述存储器为高速缓存或内存;
所述查询所述存储器中存储的映射表,和/或,查询所述存储器中存储的指令顺序表,包括:
在高速缓存中进行查询;在不命中的情况下,在内存中进行查询。
7.根据权利要求1或2所述的方法,其中,执行所述当前指令包括:
判断当前指令是否会改变指令流顺序;
如果是,则将所述第一寄存器设为无效值,并执行所述当前指令对应的当前模拟函数;
如果否,直接执行所述当前指令对应的当前模拟函数。
8.根据权利要求1或2所述的方法,其中,在从存储器获取所述当前指令的下一条指令对应的下一模拟函数地址之后,还包括:
根据所述下一模拟函数地址,判断所述下一条指定对应的下一模拟函数是否被加载到高速缓存中;如果没有,则将该下一模拟函数加载到高速缓存中。
9.根据权利要求1所述的方法,其中,所述字节码指令流为智能合约编译后的字节码指令流,所述虚拟机为WASM虚拟机或Solidity虚拟机。
10.一种解释执行字节码指令流的装置,部署在虚拟机的解释器中,包括:
读取单元,配置为读取第一寄存器中存储的第一值;
存储单元,配置为当所述第一值为有效值时,将所述第一值存储到第二寄存器中,所述第二寄存器用于存储所述字节码指令流中当前指令对应的当前模拟函数地址;
预取及执行单元,配置为从存储器获取所述当前指令的下一条指令对应的下一模拟函数地址,并将该下一模拟函数地址存储在所述第一寄存器中,并且,根据从所述第二寄存器中读取的所述当前模拟函数地址,执行所述当前指令。
11.根据权利要求10所述的装置,还包括地址获取单元,配置为,当所述第一值不是有效值时,从存储器获取所述当前指令对应的当前模拟函数地址,并将其存储到所述第二寄存器中。
12.根据权利要求10或11所述的装置,其中,所述预取及执行单元包括预取模块,所述预取模块配置为:
确定下一条指令对应的操作码;
查询所述存储器中存储的映射表,从而得到所述操作码对应的模拟函数地址。
13.根据权利要求12所述的装置,其中,所述预取模块配置为:
将程序计数器的PC值累加预定字节长度,得到下一条指令的位置编号;
根据该位置编号,查询所述存储器中存储的指令顺序表,得到下一条指令对应的操作码。
14.根据权利要求12所述的装置,其中,所述预取模块配置为:
确定所述当前指令的指令长度;
将程序计数器的PC值累加所述指令长度,得到下一条指令的位置编号;
根据该位置编号,查询所述存储器中存储的指令顺序表,得到下一条指令对应的操作码。
15.根据权利要求13或14所述的装置,其中,所述存储器为高速缓存或内存;
所述预取模块配置为:
在高速缓存中查询所述映射表和/或所述指令顺序表;在不命中的情况下,在内存中进行查询。
16.根据权利要求10或11所述的装置,其中,所述预取及执行单元包括执行模块,所述执行模块配置为:
判断当前指令是否会改变指令流顺序;
如果是,则将所述第一寄存器设为无效值,并执行所述当前指令对应的当前模拟函数;
如果否,直接执行所述当前指令对应的当前模拟函数。
17.根据权利要求10或11所述的装置,其中,所述预取及执行单元还配置为:
根据所述下一模拟函数地址,判断所述下一条指定对应的下一模拟函数是否被加载到高速缓存中;如果没有,则将该下一模拟函数加载到高速缓存中。
18.根据权利要求10所述的装置,其中,所述字节码指令流为智能合约编译后的字节码指令流,所述虚拟机为WASM虚拟机或Solidity虚拟机。
19.一种计算机可读存储介质,其上存储有计算机程序,当所述计算机程序在计算机中执行时,令计算机执行权利要求1-9中任一项的所述的方法。
20.一种计算设备,包括存储器和处理器,其特征在于,所述存储器中存储有可执行代码,所述处理器执行所述可执行代码时,实现权利要求1-9中任一项所述的方法。
CN201910818266.XA 2019-08-30 2019-08-30 解释执行字节码指令流的方法及装置 Active CN110704108B (zh)

Priority Applications (4)

Application Number Priority Date Filing Date Title
CN201910818266.XA CN110704108B (zh) 2019-08-30 2019-08-30 解释执行字节码指令流的方法及装置
PCT/CN2020/071560 WO2021036173A1 (zh) 2019-08-30 2020-01-11 解释执行字节码指令流的方法及装置
US16/786,856 US10802854B2 (en) 2019-08-30 2020-02-10 Method and apparatus for interpreting bytecode instruction stream
TW109107460A TWI743698B (zh) 2019-08-30 2020-03-06 解譯執行位元組碼指令流的方法及裝置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201910818266.XA CN110704108B (zh) 2019-08-30 2019-08-30 解释执行字节码指令流的方法及装置

Publications (2)

Publication Number Publication Date
CN110704108A true CN110704108A (zh) 2020-01-17
CN110704108B CN110704108B (zh) 2020-08-14

Family

ID=69194002

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201910818266.XA Active CN110704108B (zh) 2019-08-30 2019-08-30 解释执行字节码指令流的方法及装置

Country Status (3)

Country Link
CN (1) CN110704108B (zh)
TW (1) TWI743698B (zh)
WO (1) WO2021036173A1 (zh)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN111399990A (zh) * 2020-05-29 2020-07-10 支付宝(杭州)信息技术有限公司 解释执行智能合约指令的方法及装置

Families Citing this family (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN117971722A (zh) * 2024-03-28 2024-05-03 北京微核芯科技有限公司 一种取数指令的执行方法及其装置

Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6256784B1 (en) * 1998-08-14 2001-07-03 Ati International Srl Interpreter with reduced memory access and improved jump-through-register handling
CN1484787A (zh) * 2000-10-05 2004-03-24 Arm 处理器流水线中的硬件指令翻译
CN101295239A (zh) * 2007-04-26 2008-10-29 东信和平智能卡股份有限公司 Java卡虚拟机的指令执行方法
CN102292705A (zh) * 2010-08-30 2011-12-21 华为技术有限公司 网络处理器的指令处理方法和网络处理器
CN108984392A (zh) * 2018-06-12 2018-12-11 珠海市杰理科技股份有限公司 单步调试方法和调试器

Family Cites Families (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
SE509499C2 (sv) * 1996-05-03 1999-02-01 Ericsson Telefon Ab L M Metod och anordning för hantering av villkorliga hopp vid instruktionsbehandling i en pipeline-arkitektur
US9361109B2 (en) * 2010-05-24 2016-06-07 Qualcomm Incorporated System and method to evaluate a data value as an instruction
CN104679481B (zh) * 2013-11-27 2020-04-28 上海芯豪微电子有限公司 一种指令集转换系统和方法
US10853074B2 (en) * 2014-05-01 2020-12-01 Netronome Systems, Inc. Table fetch processor instruction using table number to base address translation
GB2551548B (en) * 2016-06-22 2019-05-08 Advanced Risc Mach Ltd Register restoring branch instruction
GB2564130B (en) * 2017-07-04 2020-10-07 Advanced Risc Mach Ltd An apparatus and method for controlling execution of instructions

Patent Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6256784B1 (en) * 1998-08-14 2001-07-03 Ati International Srl Interpreter with reduced memory access and improved jump-through-register handling
CN1484787A (zh) * 2000-10-05 2004-03-24 Arm 处理器流水线中的硬件指令翻译
CN101295239A (zh) * 2007-04-26 2008-10-29 东信和平智能卡股份有限公司 Java卡虚拟机的指令执行方法
CN102292705A (zh) * 2010-08-30 2011-12-21 华为技术有限公司 网络处理器的指令处理方法和网络处理器
CN108984392A (zh) * 2018-06-12 2018-12-11 珠海市杰理科技股份有限公司 单步调试方法和调试器

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN111399990A (zh) * 2020-05-29 2020-07-10 支付宝(杭州)信息技术有限公司 解释执行智能合约指令的方法及装置

Also Published As

Publication number Publication date
WO2021036173A1 (zh) 2021-03-04
TWI743698B (zh) 2021-10-21
TW202109288A (zh) 2021-03-01
CN110704108B (zh) 2020-08-14

Similar Documents

Publication Publication Date Title
KR100463810B1 (ko) 어드레스되는 구성요소의 물리적 특성에 관한 추측 실패를 검출하는 마이크로프로세서용 메모리 제어기
US10860300B2 (en) Direct function call substitution using preprocessor
CN111399990B (zh) 解释执行智能合约指令的方法及装置
US9201635B2 (en) Just-in-time dynamic translation for translation, compilation, and execution of non-native instructions
US11003453B2 (en) Branch target buffer for emulation environments
US9213563B2 (en) Implementing a jump instruction in a dynamic translator that uses instruction code translation and just-in-time compilation
US7823140B2 (en) Java bytecode translation method and Java interpreter performing the same
JP2017527021A (ja) マイクロ命令シーケンスを最適化されたマイクロ命令シーケンスにリオーダして命令セットアグノスティックランタイムアーキテクチャを実施するための割振り及び発行ステージ
US10241810B2 (en) Instruction-optimizing processor with branch-count table in hardware
US9524178B2 (en) Defining an instruction path to be compiled by a just-in-time (JIT) compiler
US9529610B2 (en) Updating compiled native instruction paths
US6931638B2 (en) Method and apparatus to facilitate sharing optimized instruction code in a multitasking virtual machine
CN110704108B (zh) 解释执行字节码指令流的方法及装置
US9183018B2 (en) Dynamic on/off just-in-time compilation in a dynamic translator using instruction code translation
JP2002366367A (ja) プログラム命令解釈
US7243350B2 (en) Speculative execution for java hardware accelerator
US20030130834A1 (en) Execution time modification of instruction emulation parameters
KR20120064446A (ko) 컴퓨팅 시스템 상의 바이트코드의 분기 처리 장치 및 방법
JP4137735B2 (ja) 動的遅延演算情報を使用して制御投機ロードの即時遅延を制御する方法およびシステム
US10802854B2 (en) Method and apparatus for interpreting bytecode instruction stream
KR100522468B1 (ko) 타겟 프로세서의 상태를 일시적으로 홀딩하는 장치를 갖는 호스트 마이크로프로세서
US11016771B2 (en) Processor and instruction operation method
EP0924603A2 (en) Compiler controlled dynamic scheduling of program instructions
US20150186168A1 (en) Dedicating processing resources to just-in-time compilers and instruction processors in a dynamic translator

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
GR01 Patent grant
GR01 Patent grant
TR01 Transfer of patent right
TR01 Transfer of patent right

Effective date of registration: 20201012

Address after: Cayman Enterprise Centre, 27 Hospital Road, George Town, Grand Cayman Islands

Patentee after: Innovative advanced technology Co.,Ltd.

Address before: Cayman Enterprise Centre, 27 Hospital Road, George Town, Grand Cayman Islands

Patentee before: Advanced innovation technology Co.,Ltd.

Effective date of registration: 20201012

Address after: Cayman Enterprise Centre, 27 Hospital Road, George Town, Grand Cayman Islands

Patentee after: Advanced innovation technology Co.,Ltd.

Address before: A four-storey 847 mailbox in Grand Cayman Capital Building, British Cayman Islands

Patentee before: Alibaba Group Holding Ltd.

REG Reference to a national code

Ref country code: HK

Ref legal event code: DE

Ref document number: 40028853

Country of ref document: HK