TWI743698B - 解譯執行位元組碼指令流的方法及裝置 - Google Patents
解譯執行位元組碼指令流的方法及裝置 Download PDFInfo
- Publication number
- TWI743698B TWI743698B TW109107460A TW109107460A TWI743698B TW I743698 B TWI743698 B TW I743698B TW 109107460 A TW109107460 A TW 109107460A TW 109107460 A TW109107460 A TW 109107460A TW I743698 B TWI743698 B TW I743698B
- Authority
- TW
- Taiwan
- Prior art keywords
- instruction
- current
- register
- address
- value
- Prior art date
Links
Images
Classifications
-
- 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/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/38—Concurrent instruction execution, e.g. pipeline, look ahead
- G06F9/3802—Instruction prefetching
-
- 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/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/32—Address formation of the next instruction, e.g. by incrementing the instruction counter
- G06F9/321—Program 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示出在一個實施例中的應用場景示意圖。如圖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所述的方法。
本領域技術人員應該可以意識到,在上述一個或多個示例中,本發明所描述的功能可以用硬體、軟體、韌體或它們的任意組合來實現。當使用軟體實現時,可以將這些功能儲存在電腦可讀媒體中或者作為電腦可讀媒體上的一個或多個指令或代碼進行傳輸。
以上所述的具體實施方式,對本發明的目的、技術方案和有益效果進行了進一步詳細說明,所應理解的是,以上所述僅為本發明的具體實施方式而已,並不用於限定本發明的保護範圍,凡在本發明的技術方案的基礎之上,所做的任何修改、等同替換、改進等,均應包括在本發明的保護範圍之內。
31:步驟
33:步驟
34:步驟
35:步驟
401:步驟
402:步驟
403:步驟
404:步驟
405:步驟
406:步驟
407:步驟
408:步驟
409:步驟
410:步驟
411:步驟
412:步驟
413:步驟
500:裝置
51:讀取單元
53:儲存單元
54:位址獲取單元
55:預取及執行單元
551:預取模組
552:執行模組
PC:程式計數器
為了更清楚地說明本發明實施例的技術方案,下面將對實施例描述中所需要使用的圖式作簡單地介紹,顯而易見地,下面描述中的圖式僅僅是本發明的一些實施例,對於本領域普通技術人員來講,在不付出創造性勞動的前提下,還可以根據這些圖式獲得其它的圖式。
[圖1]示出在一個實施例中的應用場景示意圖;
[圖2]示出在一個實施例中解譯執行位元組碼指令流的過程示意圖;
[圖3]示出根據一個實施例的解譯執行位元組碼指令流的方法流程圖;
[圖4]示出根據一個實施例的解譯執行一段位元組碼指令流的完整步驟流程示意圖;
[圖5]示出根據一個實施例的解譯執行位元組碼指令流的裝置的示意性方塊圖。
Claims (20)
- 一種解譯執行位元組碼指令流的方法,透過虛擬機的解譯器執行,包括:讀取第一暫存器中儲存的第一值;當所述第一值為有效值時,將所述第一值儲存到第二暫存器中,所述第二暫存器用於儲存所述位元組碼指令流中當前指令對應的當前模擬函數位址,所述第一值包括所述當前模擬函數位址;從儲存器獲取所述當前指令的下一條指令對應的下一模擬函數位址,並將該下一模擬函數位址儲存在所述第一暫存器中,並且,根據從所述第二暫存器中讀取的所述當前模擬函數位址,執行所述當前指令。
- 根據請求項1所述的方法,還包括,當所述第一值不是有效值時,從儲存器獲取所述當前指令對應的當前模擬函數位址,並將其儲存到所述第二暫存器中。
- 根據請求項1所述的方法,其中,從儲存器獲取所述當前指令的下一條指令對應的下一模擬函數位址,包括:確定下一條指令對應的操作碼;查詢所述儲存器中儲存的映射表,從而得到所述操作碼對應的模擬函數位址。
- 根據請求項3所述的方法,其中,確定下一條指令對應的操作碼包括:將程式計數器的PC值累加預定位元組長度,得到下一 條指令的位置編號;根據該位置編號,查詢所述儲存器中儲存的指令順序表,得到下一條指令對應的操作碼。
- 根據請求項3所述的方法,其中,確定下一條指令對應的操作碼包括:確定所述當前指令的指令長度;將程式計數器的PC值累加所述指令長度,得到下一條指令的位置編號;根據該位置編號,查詢所述儲存器中儲存的指令順序表,得到下一條指令對應的操作碼。
- 根據請求項4或5所述的方法,其中,所述儲存器為高速緩存或內部記憶體;所述查詢所述儲存器中儲存的映射表,及/或,查詢所述儲存器中儲存的指令順序表,包括:在高速緩存中進行查詢;在不命中的情況下,在內部記憶體中進行查詢。
- 根據請求項1或2所述的方法,其中,執行所述當前指令包括:判斷當前指令是否會改變指令流順序;如果是,則將所述第一暫存器設為無效值,並執行所述當前指令對應的當前模擬函數;如果否,直接執行所述當前指令對應的當前模擬函數。
- 根據請求項1或2所述的方法,其中,在 從儲存器獲取所述當前指令的下一條指令對應的下一模擬函數位址之後,還包括:根據所述下一模擬函數位址,判斷所述下一條指定對應的下一模擬函數是否被加載到高速緩存中;如果沒有,則將該下一模擬函數加載到高速緩存中。
- 根據請求項1所述的方法,其中,所述位元組碼指令流為智慧合約編譯後的位元組碼指令流,所述虛擬機為WASM虛擬機或Solidity虛擬機。
- 一種解譯執行位元組碼指令流的裝置,部署在虛擬機的解譯器中,包括:讀取單元,配置為讀取第一暫存器中儲存的第一值;儲存單元,配置為當所述第一值為有效值時,將所述第一值儲存到第二暫存器中,所述第二暫存器用於儲存所述位元組碼指令流中當前指令對應的當前模擬函數位址,所述第一值包括所述當前模擬函數位址;預取及執行單元,配置為從儲存器獲取所述當前指令的下一條指令對應的下一模擬函數位址,並將該下一模擬函數位址儲存在所述第一暫存器中,並且,根據從所述第二暫存器中讀取的所述當前模擬函數位址,執行所述當前指令。
- 根據請求項10所述的裝置,還包括位址獲取單元,配置為,當所述第一值不是有效值時,從儲存器獲取所述當前指令對應的當前模擬函數位址,並將其儲存到所述第二暫存器中。
- 根據請求項10所述的裝置,其中,所述預取及執行單元包括預取模組,所述預取模組配置為:確定下一條指令對應的操作碼;查詢所述儲存器中儲存的映射表,從而得到所述操作碼對應的模擬函數位址。
- 根據請求項12所述的裝置,其中,所述預取模組配置為:將程式計數器的PC值累加預定位元組長度,得到下一條指令的位置編號;根據該位置編號,查詢所述儲存器中儲存的指令順序表,得到下一條指令對應的操作碼。
- 根據請求項12所述的裝置,其中,所述預取模組配置為:確定所述當前指令的指令長度;將程式計數器的PC值累加所述指令長度,得到下一條指令的位置編號;根據該位置編號,查詢所述儲存器中儲存的指令順序表,得到下一條指令對應的操作碼。
- 根據請求項13或14所述的裝置,其中,所述儲存器為高速緩存或內部記憶體;所述預取模組配置為:在高速緩存中查詢所述映射表及/或所述指令順序表;在不命中的情況下,在內部記憶體中進行查詢。
- 根據請求項10或11所述的裝置,其中, 所述預取及執行單元包括執行模組,所述執行模組配置為:判斷當前指令是否會改變指令流順序;如果是,則將所述第一暫存器設為無效值,並執行所述當前指令對應的當前模擬函數;如果否,直接執行所述當前指令對應的當前模擬函數。
- 根據請求項10或11所述的裝置,其中,所述預取及執行單元還配置為:根據所述下一模擬函數位址,判斷所述下一條指定對應的下一模擬函數是否被加載到高速緩存中;如果沒有,則將該下一模擬函數加載到高速緩存中。
- 根據請求項10所述的裝置,其中,所述位元組碼指令流為智慧合約編譯後的位元組碼指令流,所述虛擬機為WASM虛擬機或Solidity虛擬機。
- 一種電腦可讀儲存媒體,其上儲存有電腦程式,當所述電腦程式在電腦中執行時,令電腦執行請求項1至9中任一項的所述的方法。
- 一種計算設備,包括儲存器和處理器,其特徵在於,所述儲存器中儲存有可執行代碼,所述處理器執行所述可執行代碼時,實現請求項1至9中任一項所述的方法。
Applications Claiming Priority (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910818266.X | 2019-08-30 | ||
CN201910818266.XA CN110704108B (zh) | 2019-08-30 | 2019-08-30 | 解释执行字节码指令流的方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
TW202109288A TW202109288A (zh) | 2021-03-01 |
TWI743698B true TWI743698B (zh) | 2021-10-21 |
Family
ID=69194002
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
TW109107460A TWI743698B (zh) | 2019-08-30 | 2020-03-06 | 解譯執行位元組碼指令流的方法及裝置 |
Country Status (3)
Country | Link |
---|---|
CN (1) | CN110704108B (zh) |
TW (1) | TWI743698B (zh) |
WO (1) | WO2021036173A1 (zh) |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111399990B (zh) * | 2020-05-29 | 2020-09-22 | 支付宝(杭州)信息技术有限公司 | 解释执行智能合约指令的方法及装置 |
Citations (4)
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 |
CN101295239A (zh) * | 2007-04-26 | 2008-10-29 | 东信和平智能卡股份有限公司 | Java卡虚拟机的指令执行方法 |
CN108984392A (zh) * | 2018-06-12 | 2018-12-11 | 珠海市杰理科技股份有限公司 | 单步调试方法和调试器 |
TW201907296A (zh) * | 2017-07-04 | 2019-02-16 | 英商Arm股份有限公司 | 用於控制指令執行的設備與方法 |
Family Cites Families (7)
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 |
GB2367651B (en) * | 2000-10-05 | 2004-12-29 | Advanced Risc Mach Ltd | Hardware instruction translation within a processor pipeline |
US9361109B2 (en) * | 2010-05-24 | 2016-06-07 | Qualcomm Incorporated | System and method to evaluate a data value as an instruction |
WO2012027878A1 (zh) * | 2010-08-30 | 2012-03-08 | 华为技术有限公司 | 网络处理器的指令处理方法和网络处理器 |
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 |
-
2019
- 2019-08-30 CN CN201910818266.XA patent/CN110704108B/zh active Active
-
2020
- 2020-01-11 WO PCT/CN2020/071560 patent/WO2021036173A1/zh active Application Filing
- 2020-03-06 TW TW109107460A patent/TWI743698B/zh active
Patent Citations (4)
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 |
CN101295239A (zh) * | 2007-04-26 | 2008-10-29 | 东信和平智能卡股份有限公司 | Java卡虚拟机的指令执行方法 |
TW201907296A (zh) * | 2017-07-04 | 2019-02-16 | 英商Arm股份有限公司 | 用於控制指令執行的設備與方法 |
CN108984392A (zh) * | 2018-06-12 | 2018-12-11 | 珠海市杰理科技股份有限公司 | 单步调试方法和调试器 |
Also Published As
Publication number | Publication date |
---|---|
TW202109288A (zh) | 2021-03-01 |
CN110704108A (zh) | 2020-01-17 |
WO2021036173A1 (zh) | 2021-03-04 |
CN110704108B (zh) | 2020-08-14 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US9696966B2 (en) | Software development tool to automatically generate an optimized executable | |
JP5681473B2 (ja) | プログラムの最適化装置、最適化方法および最適化プログラム | |
US9201635B2 (en) | Just-in-time dynamic translation for translation, compilation, and execution of non-native instructions | |
US20020066081A1 (en) | Speculative caching scheme for fast emulation through statically predicted execution traces in a caching dynamic translator | |
US6721943B2 (en) | Compile-time memory coalescing for dynamic arrays | |
US9213563B2 (en) | Implementing a jump instruction in a dynamic translator that uses instruction code translation and just-in-time compilation | |
CN111399990B (zh) | 解释执行智能合约指令的方法及装置 | |
JP2015084251A (ja) | ソフトウェア・アプリケーションの性能向上 | |
US9524178B2 (en) | Defining an instruction path to be compiled by a just-in-time (JIT) compiler | |
US9529610B2 (en) | Updating compiled native instruction paths | |
US9183018B2 (en) | Dynamic on/off just-in-time compilation in a dynamic translator using instruction code translation | |
Hong et al. | Improving simd parallelism via dynamic binary translation | |
US6260191B1 (en) | User controlled relaxation of optimization constraints related to volatile memory references | |
TWI743698B (zh) | 解譯執行位元組碼指令流的方法及裝置 | |
US10802854B2 (en) | Method and apparatus for interpreting bytecode instruction stream | |
JP2004062908A (ja) | 動的遅延演算情報を使用して制御投機ロードの即時遅延を制御する方法およびシステム | |
US11288071B2 (en) | System and method for prefetching instructions and data | |
US11016771B2 (en) | Processor and instruction operation method | |
US11740906B2 (en) | Methods and systems for nested stream prefetching for general purpose central processing units | |
US20150186168A1 (en) | Dedicating processing resources to just-in-time compilers and instruction processors in a dynamic translator | |
EP3584698A1 (en) | Execution device for intermediate code | |
Drescher et al. | Fast Template-Based Code Generation for MLIR | |
Krylov | Ahead-of-Time compilation in a language-independent environment | |
AU2022226485A1 (en) | Hybrid just in time load module compiler with performance optimizations |