2017-04-20 141 views
2

讓我們假設我們有以下幾點:Webassembly多個模塊?

(module) 

只是一個簡單的模塊,沒有功能,本地人,內存和所有的花哨的東西。 現在如果我不想過度使用我的模塊?我的意思是ID想有兩個模塊,但我顯然得到一個錯誤試圖編譯像時:

(module) 
(module) 

那麼,有沒有辦法給每個模塊自身的存儲器或ID?或者有什麼辦法可以這樣做?它有意義嗎?我只是說,因爲一個模塊真的會變得巨大。

我試圖完成的是在兩個模塊之間進行通信,因爲我認爲防止模塊變得太大是有意義的。即時通訊新的webassembly所以也許我說的聽起來很瘋狂。

編譯測試中,我使用https://mbebenita.github.io/WasmExplorer/

回答

2

WebAssembly模塊類似於磁盤上的可執行文件:它們沒有被加載到內存中。

WebAssembly實例是什麼使模塊成爲現實。您可以多次實例化相同的模塊,或者實例化多個模塊。實例化將加載模塊,編譯/驗證它,初始化它的全局變量和內存(如果有的話),填充導出,然後調用它的啓動函數。

您的示例使用s表達式語法,但您不指定如何執行WebAssembly。 s表達式本身就是文本,需要使用嵌入器來運行編譯結果!

在JavaScript嵌入the APIWebAssembly.ModuleWebAssembly.Instance構造,還有WebAssembly.compileWebAssembly.instantiate功能(無論是工作,WebAssembly.instantiate更簡單/更好)。您將實例構造函數/函數傳遞給一個導入對象。 WebAssembly存儲器可以通過在二進制文件中聲明一個存儲器部分來創建(然後在實例化時自動創建一個存儲器),或者通過導入對象導出它。

您甚至可以通過創建多個模塊來執行動態鏈接,通過在它們之間共享內存來實例化它們,並讓它們導入/導出彼此的功能。

在spec解釋器中,你可以聲明多個模塊,這些模塊會被驗證,並且你有額外的幫助器來捅他們。見this test其開頭:

(module "\00asm\01\00\00\00") 
(module "\00asm" "\01\00\00\00") 
(module $M1 "\00asm\01\00\00\00") 
(module $M2 "\00asm" "\01\00\00\00") 

(assert_malformed (module "") "unexpected end") 
(assert_malformed (module "\01") "unexpected end") 
+0

我還在使用由Mozilla(尚在測試階段上有)https://mbebenita.github.io/WasmExplorer/提供的探險家。後來即將安裝真實的東西,但我假設瀏覽器使用相同的編譯器,我們可以從git等下載那些編譯器 – Asperger

+0

我是否明白,使模塊彼此協作的這項任務絕對需要JavaScript? – Asperger

+0

WebAssembly不指定您可以使用哪種編譯器。 LLVM + Emscripten是不錯的選擇,還有一個GCC實驗,我相信我們會在未來看到更多。 –