EOS 新增的 WebAssembly 解釋器,是什麽鬼?
對於很多沒有中間語言的(字節碼)的編程語言來說,根本不存在解釋執行與編譯執行的選項,比如傳統 C/C++ 只能編譯執行,直接將代碼編譯成為可執行的二進制機器碼,我們電腦上 .exe 文件就是編譯的成果。再比如 python 和 javascript 只能解釋執行,用戶拿到的就是原始的代碼,解釋器會像翻譯員一樣,一行一行地執行代碼。
為什麽 WebAssembly 智能合約有兩種執行方式?因為 WebAssembly 類似 java,會生成中間語言:字節碼,字節碼既可以編譯成機器碼後執行,又可以使用解釋器直接執行。中間語言賦予了 WebAssembly 靈活的執行方式。這就是為什麽 EOS 的智能合約不能直接上傳 c++ 文件,而是需要上傳編譯後的 .wasm 文件,這就是 WebAssembly 的中間語言(字節碼)。
編譯執行的優點是執行速度快,但缺點是每次智能合約有更新時,見證人的服務器都要重新編譯生成二進制機器碼,對於執行次數不多的智能合約,是不劃算的。解釋執行正好相反,不需要提前編譯,但執行時速度比編譯執行慢很多,Daniel 說速度僅僅是原來的20%,也就是比原來慢5倍,不過 Daniel 還說明,WebAssembly 在整個智能合約執行中只占很小的一部分,對於真正系統性能的影響大約在 5%。
所以折騰了半天,效果還沒有原來好嗎?Daniel 說,引入 WebAssembly 的官方解釋器是給智能合約的結果提供了一個權威參考,當各個見證人的編譯執行結果不一致時,就可以使用解釋器得到參考結果。而且解釋器也會給編譯執行做後補,以防 WASM 編譯器出問題時維持系統穩定。
目前來看,不論是 EOS 系統,還是 WebAssembly 技術 都還在快速發展階段,還沒有針對性能做更細致的優化,我認為 WebAssembly 可以參考 Java 的 JIT(Just In Time) 技術,對高頻執行的代碼進行編譯優化,對低頻代碼直接解釋執行。不過鑒於 WebAssembly 並不是系統性能的最主要瓶頸,現在看來這方面的需求並不迫切。
參考文獻:
1. EOSIO Development Update
https://medium.com/@bytemaster/eosio-development-update-272198df22c1
2. WebAssembly/binaryen
https://github.com/WebAssembly/binaryen
3. 編譯中的一些事兒(講解主流的編譯技術,包括WebAssembly)
http://blog.csdn.net/qq_33280027/article/details/69944498
4. 幾張圖讓你看懂WebAssembly
http://www.sohu.com/a/141587149_464084
圓方圓區塊鏈匯集大批區塊鏈名師,采取導師值班制,為學員實時解決技術疑難。請關註圓方圓區塊鏈知識星球與導師。(培訓咨詢請聯系船長13826054890微信手機同號)
作者小笛 ,專註於 EOS 技術研究與區塊鏈智能合約開發.是圓方圓區塊鏈的導師,更多小笛老師的文章和視頻請關註圓方圓鏈圈公眾號。
EOS 新增的 WebAssembly 解釋器,是什麽鬼?