标签: webassembly

将 C 编译为 wasm,设置与 WasmFiddle 相同

查看以下WasmFiddle,一旦编译为 wasm 文件为 259 字节。我正在尝试从 WasmFiddle 移动到我的本地环境,所以我已经下载并安装了Emscripten编译器。

现在,由于 Emscripten 环境添加了额外的功能,因此相同的代码为 22KB。

问:如何在本地机器上编译 c 代码并保持精简?更好的是我怎样才能拥有与 WasmFiddle 相同的输出?

javascript emscripten webassembly

4
推荐指数
1
解决办法
407
查看次数

如何在 WebAssembly 中使用加载和存储

WebAssembly 中的大多数演示仍然是 C/C++ 并且没有展示太多wat。到目前为止的几个例子显示了这样的事情:

;; Convert this to add.wasm by running:
;;
;;   wat2wasm add.wat -o add.wasm
;;
(module
  (func (export "add") (param i32 i32) (result i32)
    get_local 0
    get_local 1
    i32.add))
Run Code Online (Sandbox Code Playgroud)

使用局部变量并调用本机函数。我知道有get_global这样的。

我想知道的是如何使用加载和存储来管理全局(?)内存。我无法理解如何使用这些功能。

例如,如何将 JavaScript 中的字符串数组加载到 WebAssembly 中,然后将它们打印出来。像这样的东西:

const fs = require('fs')
const buf = fs.readFileSync('./add.wasm')
WebAssembly.instantiate(new Uint8Array(buf)).then(function(results){
  var lib = results.instance.exports
  lib.storeArray(['hello', 'world'])
  lib.logArray()
  // hello
  // world
})
Run Code Online (Sandbox Code Playgroud)

组装过程如下:

(module
  (func (export "storeArray") (param ?) (result ?)
    iterate and …
Run Code Online (Sandbox Code Playgroud)

javascript webassembly

4
推荐指数
1
解决办法
1544
查看次数

在没有 std 的情况下将 *mut u8 转换为 &[u8]

我正在为 WebAssembly 编写 Rust 代码来处理来自 JavaScript 领域的字符串。

由于 WebAssembly 没有真正的字符串类型,我试图传递一个指向 WebAssembly 内存对象的指针,该对象指向 UTF-8 编码的字符串。

#[no_mangle]
pub extern "C" fn check(ptr: *mut u8, length: u32) -> u32 {
    unsafe {
        let buf: &[u8] = std::slice::from_raw_parts(ptr, length as usize);
        // do some operations on buf
        0
    }
}
Run Code Online (Sandbox Code Playgroud)

它工作正常,预计我必须依赖std板条箱,它将最终二进制文件膨胀到大约 600KB。

有没有办法摆脱std::slice::from_raw_parts但仍然能够将原始指针转换为切片?

rust webassembly

4
推荐指数
2
解决办法
2433
查看次数

如何在 JavaScript 中直接实例化 WebAssembly 模块

我见过的例子基本上表明了这一点:

fetch('simple.wasm').then(response =>
  response.arrayBuffer()
).then(bytes =>
  WebAssembly.instantiate(bytes, {})
).then(result =>
  result.instance.exports...
)
Run Code Online (Sandbox Code Playgroud)

但我想在不发出额外 HTTP 请求的情况下做到这一点。想知道是否唯一的方法是这个(或它的一些变体,这将有助于了解):

var binary = '...mywasmbinary...'
var buffer = new ArrayBuffer(binary.length)
var view = new DataView(buffer)
for (var i = 0, n = binary.length; i < n; i++) {
  var x = binary[i]
  view.setInt8(i * 8, x)
}
Run Code Online (Sandbox Code Playgroud)

想知道我是否必须担心字节序或类似的问题。

或者也许用URL和 blob做一些事情可能会更好,我不确定。

javascript webassembly

4
推荐指数
1
解决办法
688
查看次数

单文件 WebAssembly html 演示

我在哪里可以找到一个最简单的单文件演示,显示 html 中 WebAssembly 的用法?

JavaScript 示例很简单:

<script>
function hw() { console.log("Hello, world."); }
</script>
<button onclick="hw()">HW</button>
Run Code Online (Sandbox Code Playgroud)

是否有 WebAssembly 模拟?

我希望它具有类似于带有 wasm 二进制文件的硬编码字节缓冲区之类的东西,该缓冲区已加载并执行一些琐碎的功能。这是我期望的概述:

<script>
function hw() { 
    var wasm_code = [255, 0, 128, ..., whatever, ...];
    var magic = give_me_wasm(wasm_code);
    var x = magic.my_add(2,2);
    console.log("2 + 2 = ", x); 
}
</script>
<button onclick="hw()">HW</button>
Run Code Online (Sandbox Code Playgroud)

这样的demo可以做吗,一个简单的表格,可以粘贴到Developer Console,不用设置任何框架和工具就可以试用?

html javascript webassembly

4
推荐指数
1
解决办法
1371
查看次数

从 Wasm 加载文件?

我正在使用 rust 和 webassembly。我收到此错误消息operation not supported on wasm yet。所以两件事中的任何一件正在发生,我很好奇是否有人知道答案。所以要么我的文件路径不正确,这是最没有帮助的错误消息,要么 wasm 不支持加载文件。

#[wasm_bindgen]
#[macro_use]
pub fn file() -> () {
    let mut data: Vec<u8> = Vec::new();
    ///I would load the png with the same path in my javascript.
    let opened = File::open("./png/A_SingleCell.png");
    let unwraped = match opened {
        Ok(a) => log(&format!("opened {}", "worked")),
        Err(e) => log(&format!("{}", e)),
    };
    // .read_to_end(&mut data)
    // .unwrap();
    return ();
}

#[wasm_bindgen]
extern "C" {
    #[wasm_bindgen(js_namespace = console)]
    fn log(msg: &str);
}
Run Code Online (Sandbox Code Playgroud)

并且 javascript …

javascript rust webassembly

4
推荐指数
1
解决办法
2413
查看次数

为什么 Chrome 在反复刷新使用 WebAssembly 的页面后最终会抛出“内存不足:wasm 内存”?

我想相信刷新浏览器窗口或选项卡不会泄漏。不幸的是,就 WebAssembly 而言,情况似乎并非如此。

我用 Rust 构建了一个 WebAssembly 板条箱。crate 的编译大小约为 360 Kb(在内容压缩之前),并且 crate 在 Firefox 甚至 iOS 上的 Safari 中都可以正常工作。但是,我在 Chrome 中遇到了很多问题,其中之一是刷新使用.wasm最终导致控制台内存不足错误的页面。

该页面在大约 35 次刷新后正常工作,然后抛出以下内容:

Uncaught (in promise) RangeError: WebAssembly Instantiation: Out of memory: wasm memory
Run Code Online (Sandbox Code Playgroud)

在此之后,该选项卡没有用,但打开一个新选项卡并加载页面按预期工作——同样,大约前 35 次刷新。

这是浏览器中的错误还是我在代码中做错了什么?如果它是一个错误,有什么办法可以解决它吗?(并不是说我希望它会在生产中表现出来,但无论如何......)

(据推测,错误消息中提到的承诺是 返回的import('...')那个。我正在使用 webpack,所以我受到了https://github.com/webpack/webpack/issues/6615 的影响)

google-chrome webpack webassembly

4
推荐指数
1
解决办法
2438
查看次数

如何在 Wasm 中实现“malloc”

我现在正在学习WebAssembly,发现外部函数(libc 或第三方函数)无法被 Wasm 世界轻松访问(使用 import 是通用解决方案)。

我试图用emcc编译我的源代码到WASM但mallocfree广泛应用于我的源代码。我认为从现实世界中导入malloc和导入free是不可行的。

所以,我很好奇如何malloc在 wasm 世界中实现。我已经知道 malloc 是如何工作的glibc:使用 brk() 或 sbrk() 来扩展堆和线性地址的一些内存管理。但在 wasm 世界中,我认为不可能打电话brk()sbrk()获得班轮地址。

malloc像这样使用全局变量来实现是否合理?

u_char mem[10240];


void *wasm_malloc(size_t num)
{
    /*get the free mem idx*/
    return &mem[idx];
}
Run Code Online (Sandbox Code Playgroud)

emscripten webassembly

4
推荐指数
1
解决办法
2317
查看次数

使用 #standardSQL 在 BigQuery 上运行异步 JS 函数

既然 BigQuery 支持 #standardSQL 上的异步,我该如何转换这个 #legacySQL 函数以在 #standardSQL 上运行?

#legacySQL
SELECT SUM(s)
FROM
js((
  SELECT FLOOR(RAND()*100000) group, NEST(requests) as x
  FROM (
    SELECT requests, content_size
    FROM [fh-bigquery:wikipedia.pagecounts_201205]
  )
  GROUP BY group)
  , group, x
  , "[{name:'s', type: 'float'}]",
"function (row, emit) {
  const memory = new WebAssembly.Memory({ initial: 256, maximum: 256 });
  const env = {
      'abortStackOverflow': _ => { throw new Error('overflow'); },
      'table': new WebAssembly.Table({ initial: 0, maximum: 0, element: 'anyfunc' }),
      'tableBase': 0,
      'memory': memory,
      'memoryBase': 1024, …
Run Code Online (Sandbox Code Playgroud)

javascript sql user-defined-functions google-bigquery webassembly

4
推荐指数
1
解决办法
719
查看次数

转换为 WebAssembly 时使用什么语言有关系吗?

例如,C 没有与 Rust 相同的安全解决方案,但是用 Rust 编写的 WebAssembly 是否具有 Rust 的优点?

用 Rust 编写并转换为 WebAssembly 的程序会比用 C 编写的程序“更安全”吗?

webassembly

4
推荐指数
1
解决办法
109
查看次数