innative可以幫助用戶編輯WebAssembly,您可以在軟件上獲取構建WebAssembly模塊需要的大部分功能,構建完畢就可以將其添加到其他開發軟件使用,結合SDK功能就可以嵌入到新的項目使用,讓用戶可以快速完成新項目編程,軟件提供了一個符合標準的WebAssembly環境,還允許進行廣泛的自定義,并且包括一些非標準的內置功能,從而使本機WebAssembly模塊的工作更加輕松,您可以通過靜態嵌入、靜態共享嵌入、動態共享嵌入的方式部署innative,也可以通過命令行的方式運行軟件!
innative軟件功能
inNative是跨平臺的WebAssembly實現,可以嵌入到您的程序中,也可以作為的運行時安裝。它將WebAssembly模塊編譯成C二進制文件,可以將其鏈接為靜態或動態庫,并可以通過簡單的C接口進行訪問。
盡管inNative符合標準,但它為您提供了一些選項,可以調整要實施的標準的哪些部分,從而允許您指定如何對所生成的WebAssembly二進制文件進行沙盒化(或不進行沙盒化)。這使inNative可以安全地在主機程序中執行沙盒WebAssembly,或者像本機程序一樣編譯調用內核函數的模塊。
輔助功能
該inNative默認環境提供了幾個輔助功能旨在使調試本地WebAssembly容易。所有這些函數都被視為具有默認調用約定的原始C函數,并且應像其他任何C函數一樣導入。編譯器本身還提供了一些內在函數,從WebAssembly的角度來看它們就像輔助函數。其中一些功能并不安全,如果啟用了白名單,則必須像其他C函數一樣將所有白名單列入白名單。
本地cref擴展
inNative實現cref代表C指針的自定義值類型。在大多數情況下,它的行為anyref與“引用類型建議”中的行為類似,充當傳遞給C存儲器的不透明指針。anyref但是,與不同,您可以傳遞i32或傳遞i給cref類型。該類型具有二進制編碼,可以在任何標準的webassembly模塊中實現,但是由于沒有編譯器可以生成該值,因此該類型主要用于.wat文件中。
innative軟件特色
inNative隨附執行3個測試階段的測試工具:
內部測試,旨在測試本機特定結構和非標準Webassembly擴展
基準測試,針對一個函數的多個Webassembly編譯版本測試C ++版本的能
標準的Web程序集測試,這是inNative實施.wast的當前規范中指定的所有核心文件。
命令行
inNative命令行使您可以訪問已安裝的運行時的功能,從而可以通過多種方式來編譯,反編譯或運行Webassembly模塊。命令行接受格式為的WebAssembly文件列表.wasm,.wat或.wast根據提供的命令行選項將它們鏈接在一起。它還具有通過某些標志或命令行開關訪問的其他功能
innative使用說明
靜態嵌入
對于要加載WebAssembly模塊的大多數應用程序,建議使用靜態嵌入inNative方法。盡管依賴于平臺,但所有平臺都必須:
1、下載或安裝SDK。
2、鏈接到inNative靜態庫
3、將include/innative頭文件添加到項目
4、包含inNative Deflt Envinment靜態庫
靜態庫不能包含其他靜態庫,因此您需要將其包含innative.lib在正在構建的根可執行文件或DLL中。因為您是靜態嵌入庫,所以您可以訪問外部API中列出的所有靜態函數。
Windows
靜態庫:innative.lib和innative-d.lib
默認環境:innative-env.lib和innative-env-d.lib
將靜態庫添加到項目的其他依賴項(對于Visual Studio)或構建系統的等效項。將默認環境庫放在/bin/文件夾中,并確保將其隨應用程序一起分發。
創建自定義環境
nNative嵌入環境實際上只是標準C庫,它們將C函數公開給正在使用其進行編譯的WebAssembly模塊。但是,inNative還支持通過基于名稱處理規則導出專門命名的函數來創建公開與WebAssembly兼容的函數的C庫。
導出C函數
編譯一個靜態(或共享)庫,該庫將要公開的C函數導出到WebAssembly模塊。如果您使用的是C ++,請確保使用extern “C”來防止任何C ++名稱修改。,只需在引用庫的同時編譯WebAssembly模塊即可。
Windows示例
./innative-cmd.exe your_module.wasm -l your_library.lib
因為Windows會.lib為DLL生成文件,所以您應該為DLL或靜態庫執行此作。
Linux示例
./innative-cmd your_module.wasm -l your_library.a
或者
./innative-cmd your_module.wasm -L your_shared_library
Linux有一個特殊的-L選項,告訴它鏈接到應該使用的共享庫。請記住,在上面的示例中,實際文件名為libyour_shared_library.so,這是鏈接程序將在當前路徑中查找的名稱。有時,鏈接程序可能對庫路徑有些挑剔,在這種情況下,您可能想指定整個絕對路徑。
如果已按照上述說明進行作,則現在可以使用基本的C導入方法來導入C函數:
(import “ ” “ your_function ”(func $ yourfunc(result i32)))
使用標準的C調用約定通常是一個好主意,但是對于C函數,您還可以使用其他調用約定
導出WebAssembly函數
也可以創建一個公開WebAssembly函數的庫,但前提是它們必須遵循嚴格的規則集?!懊Q修飾”文章詳細介紹了名稱修飾如何將模塊+函數名稱對轉換為單個C符號:[module]_WA_[function]??梢韵喾吹剡M行這種處理,以從C函數聲明中獲取WebAssembly模塊+函數名稱對。
再一次,extern “C”如果您使用的是C ++ ,請確保添加。如果使用此功能編譯庫并將其添加到inNative命令行中,則可以將其導入到WebAssembly模塊中,如下所示:
(import “ your_module ” “ your_function ”(func $ functest(param i f f32 i32)(result i)))
但是,有一些限制:函數必須具有默認的C調用約定!如果它使用任何其他調用約定,則該行為是不確定的且不安全的。此外,只能使用5種類型:
當然,您也可以替換uint32_t為int32_t,并uint_t為int_t沒有問題。您也可以將任意指針類型替換為void*。但是,void*必須映到i位體系結構,i3232位體系結構,或者cref要使用inNative的cref擴展名。在將C函數簽名與WebAssembly等效項進行匹配時,請格外小心,因為簽名不匹配會沙箱或使程序完全崩潰。
請記住,WebAssembly函數勝過C函數-如果導出偽裝為WebAssembly導入的C函數,但是存在另一個具有相同名稱和函數定義的WebAssembly模塊,則WebAssembly版本將獲勝。在將C函數導出為WebAssembly導入時,請確保為假模塊選擇唯一的名稱。