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函数的库,但前提是它们必须遵循严格的规则集。“名称修饰”文章详细介绍了名称修饰如何将模块+函数名称对转换为单个C符号:[module]_WA_[function]。可以相反地进行这种处理,以从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导入时,请确保为假模块选择唯一的名称。
近期热门