真实世界的 WebAssembly

Posted 刘祺

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了真实世界的 WebAssembly 相关的知识,希望对你有一定的参考价值。

本作品采用知识共享署名-非商业性使用 4.0 国际许可协议(https://creativecommons.org/licenses/by-nc/4.0/deed.zh)进行许可。



2.2 WebAssembly 线性内存


您可以通过 WebAssembly.Memory() 来创建 WebAssembly 线性内存实例,这当然是在 javascript 当中。不要忘记把它放到您需要引入的对象实例中。在 WebAssembly 中只允许有一段线性内存,不过它仍然要遵守两层命名空间。这看起来有一些赘余。然而实际上它统一了函数和内存的引入规范。您可以这样写:


var mem = new  WebAssembly.Memory({initial:10, maximum:100});

 

var importObject = {

     memory: {

         main: mem

     }

};

 

和引入函数类似,在 WebAssembly 中您可以通过 import 来引入它。


;; 返回字符串示例

(module

     ;; 这里引入了一段线性内存

     ;; (memory 1) 的含义是最小为 1 页内存

     (import "memory" "main" (memory 1))

     ;; 这里通过 data 写入这一全局线性内存

     (data (i32.const 0) "\04\00\00\00")

     (data (i32.const 4) "test")

     (func (export "returnString") (result i32)

         i32.const 0

     )

)



function getString (offset) {

     var len = new Uint8Array(mem.buffer, offset, 4);

     var length = 0;

     for(i=3; i>=0; i--) {

         length *= 256;

         length += len[i];

     }

     var bytes = new Uint8Array(mem.buffer, offset + 4, length);

     var str = new TextDecoder('utf8').decode(bytes);

     return str;

}


fetchAndInstantiate('demo.wasm',  importObject).then(function(instance) {

     instance.exports.print()

     console.log(getString(instance.exports.returnString()));

});


这里您可以对 getString 函数做一定的优化,这里由于篇幅限制我们不再赘余。




关于封面: 一些著名的技术出版商都会以较为统一的封面设计来标识自己的系列图书,譬如 O'Reilly 的动物书、Packt 的一张照片以及 Manning 的人像画。所以笔者自己的系列就以知名艺术品作为封面了,所以下回去博物馆就不要只围着《蒙娜丽莎》了。同时笔者也希望大家能够在关注技术的同时,多留意生活中的美。

以上是关于真实世界的 WebAssembly 的主要内容,如果未能解决你的问题,请参考以下文章

真实世界的 WebAssembly

真实世界的 WebAssembly

探索WebAssembly实现iOS热修复/第一篇/WebAssembly快速上手

一文带你走进 Rust 和 WebAssembly 的世界

安全客简报 | WebAssembly入门:将字节码带入Web世界

Blazor Server 和 WebAssembly 应用程序入门指南