【許曉笛】EOS 新增的 WebAssembly 直譯器,是什麼鬼?

圓方圓區塊鏈發表於2018-11-20

Daniel Larimer 在最近的部落格中透露,EOS 新增了官方的 WebAssembly 直譯器,用來解釋執行 WebAssembly 智慧合約,加上之前的編譯執行,EOS 智慧合約有了兩種執行方式。

對於很多沒有中間語言的(位元組碼)的程式語言來說,根本不存在解釋執行與編譯執行的選項,比如傳統 C/C++ 只能編譯執行,直接將程式碼編譯成為可執行的二進位制機器碼,我們電腦上 .exe 檔案就是編譯的成果。再比如 python 和 javascript 只能解釋執行,使用者拿到的就是原始的程式碼,直譯器會像翻譯員一樣,一行一行地執行程式碼。

為什麼 WebAssembly 智慧合約有兩種執行方式?因為 WebAssembly 類似 java,會生成中間語言:位元組碼,位元組碼既可以編譯成機器碼後執行,又可以使用直譯器直接執行。中間語言賦予了 WebAssembly 靈活的執行方式。這就是為什麼 EOS 的智慧合約不能直接上傳 c++ 檔案,而是需要上傳編譯後的 .wasm 檔案,這就是 WebAssembly 的中間語言(位元組碼)。

【許曉笛】EOS 新增的 WebAssembly 直譯器,是什麼鬼?

編譯執行的優點是執行速度快,但缺點是每次智慧合約有更新時,見證人的伺服器都要重新編譯生成二進位制機器碼,對於執行次數不多的智慧合約,是不划算的。解釋執行正好相反,不需要提前編譯,但執行時速度比編譯執行慢很多,Daniel 說速度僅僅是原來的20%,也就是比原來慢5倍,不過 Daniel 還說明,WebAssembly 在整個智慧合約執行中只佔很小的一部分,對於真正系統效能的影響大約在 5%。

所以折騰了半天,效果還沒有原來好嗎?Daniel 說,引入 WebAssembly 的官方直譯器是給智慧合約的結果提供了一個權威參考,當各個見證人的編譯執行結果不一致時,就可以使用直譯器得到參考結果。而且直譯器也會給編譯執行做後補,以防 WASM 編譯器出問題時維持系統穩定。

目前來看,不論是 EOS 系統,還是 WebAssembly 技術 都還在快速發展階段,還沒有針對效能做更細緻的優化,我認為 WebAssembly 可以參考 Java 的 JIT(Just In Time) 技術,對高頻執行的程式碼進行編譯優化,對低頻程式碼直接解釋執行。不過鑑於 WebAssembly 並不是系統效能的最主要瓶頸,現在看來這方面的需求並不迫切。

參考文獻:

  1. EOSIO Development Update medium.com/@bytemaster…

  2. WebAssembly/binaryen github.com/WebAssembly…

  3. 編譯中的一些事兒(講解主流的編譯技術,包括WebAssembly) blog.csdn.net/qq_33280027…

  4. 幾張圖讓你看懂WebAssembly www.sohu.com/a/141587149…


相關文章和視訊推薦

【許曉笛】從零開始執行EOS系統

圓方圓學院彙集大批區塊鏈名師,打造精品的區塊鏈技術課程。 在各大平臺都長期有優質免費公開課,歡迎報名收看。

公開課地址:ke.qq.com/course/3451…

相關文章