Daniel Larimer 在最近的博客中透露,EOS 新增了官方的 WebAssembly 解釋器,用來解釋執行 WebAssembly 智能合約,加上以前的編譯執行,EOS 智能合約有了兩種執行方式。javascript
對於不少沒有中間語言的(字節碼)的編程語言來講,根本不存在解釋執行與編譯執行的選項,好比傳統 C/C++ 只能編譯執行,直接將代碼編譯成爲可執行的二進制機器碼,咱們電腦上 .exe 文件就是編譯的成果。再好比 python 和 javascript 只能解釋執行,用戶拿到的就是原始的代碼,解釋器會像翻譯員同樣,一行一行地執行代碼。java
爲何 WebAssembly 智能合約有兩種執行方式?由於 WebAssembly 相似 java,會生成中間語言:字節碼,字節碼既能夠編譯成機器碼後執行,又可使用解釋器直接執行。中間語言賦予了 WebAssembly 靈活的執行方式。這就是爲何 EOS 的智能合約不能直接上傳 c++ 文件,而是須要上傳編譯後的 .wasm 文件,這就是 WebAssembly 的中間語言(字節碼)。python
編譯執行的優勢是執行速度快,但缺點是每次智能合約有更新時,見證人的服務器都要從新編譯生成二進制機器碼,對於執行次數很少的智能合約,是不划算的。解釋執行正好相反,不須要提早編譯,但執行時速度比編譯執行慢不少,Daniel 說速度僅僅是原來的20%,也就是比原來慢5倍,不過 Daniel 還說明,WebAssembly 在整個智能合約執行中只佔很小的一部分,對於真正系統性能的影響大約在 5%。c++
因此折騰了半天,效果尚未原來好嗎?Daniel 說,引入 WebAssembly 的官方解釋器是給智能合約的結果提供了一個權威參考,當各個見證人的編譯執行結果不一致時,就可使用解釋器獲得參考結果。並且解釋器也會給編譯執行作後補,以防 WASM 編譯器出問題時維持系統穩定。git
目前來看,不管是 EOS 系統,仍是 WebAssembly 技術 都還在快速發展階段,尚未針對性能作更細緻的優化,我認爲 WebAssembly 能夠參考 Java 的 JIT(Just In Time) 技術,對高頻執行的代碼進行編譯優化,對低頻代碼直接解釋執行。不過鑑於 WebAssembly 並非系統性能的最主要瓶頸,如今看來這方面的需求並不迫切。github
參考文獻:編程
1.EOSIO Development Update
https://medium.com/@bytemaste...segmentfault
2.WebAssembly/binaryen
https://github.com/WebAssembl...服務器
3.編譯中的一些事兒(講解主流的編譯技術,包括WebAssembly)
http://blog.csdn.net/qq_33280...編程語言
4.幾張圖讓你看懂WebAssembly
http://www.sohu.com/a/1415871...
圓方圓學院聚集大批區塊鏈名師,打造精品的區塊鏈技術課程。 在各大平臺都長期有優質免費公開課,歡迎報名收看。