查看以下WasmFiddle,一旦编译为 wasm 文件为 259 字节。我正在尝试从 WasmFiddle 移动到我的本地环境,所以我已经下载并安装了Emscripten编译器。
现在,由于 Emscripten 环境添加了额外的功能,因此相同的代码为 22KB。
问:如何在本地机器上编译 c 代码并保持精简?更好的是我怎样才能拥有与 WasmFiddle 相同的输出?
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) 我正在为 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但仍然能够将原始指针转换为切片?
我见过的例子基本上表明了这一点:
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做一些事情可能会更好,我不确定。
我在哪里可以找到一个最简单的单文件演示,显示 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,不用设置任何框架和工具就可以试用?
我正在使用 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 …
我想相信刷新浏览器窗口或选项卡不会泄漏。不幸的是,就 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 的影响)
我现在正在学习WebAssembly,发现外部函数(libc 或第三方函数)无法被 Wasm 世界轻松访问(使用 import 是通用解决方案)。
我试图用emcc编译我的源代码到WASM但malloc并free广泛应用于我的源代码。我认为从现实世界中导入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) 既然 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
例如,C 没有与 Rust 相同的安全解决方案,但是用 Rust 编写的 WebAssembly 是否具有 Rust 的优点?
用 Rust 编写并转换为 WebAssembly 的程序会比用 C 编写的程序“更安全”吗?