22 个版本
0.2.0 | 2019 年 3 月 29 日 |
---|---|
0.1.7 | 2019 年 3 月 14 日 |
0.0.13 | 2019 年 3 月 7 日 |
0.0.2 | 2019 年 2 月 9 日 |
#718 in WebAssembly
56 每月下载量
用于 2 crates
47KB
1.5K SLoC
Wasmly
这是一个创建字节阵列模块的简约 WebAssembly 工具。这有助于您更接近地开发底层存在的 WebAssembly 应用。
如果您检查此项目并只想获取设置依赖项
make setup
进入任何示例目录
make
make serve
然后打开浏览器到 https://127.0.0.1:9999
查看控制台输出!
如果您将其用作 npm 模块
npm install wasmly
非常简单的模块
如果您只是编写一个单个导出的 "main" 函数,该函数接收输入、返回输出并暴露 "内存"。尝试此操作以节省样板代码
var fs = require('fs');
let {makeSimple,int,I32,I32_CONST,END} = require("wasmly");
// main() -> i32
app = makeSimple([],[I32],[
vec([]), // no local variables
I32_CONST, int(42), // return 42
END
])
fs.writeFileSync('out.wasm',Buffer.from(app))
可能的简单模块
如果您试图从头创建最简单的模块。此模块没有任何函数
var fs = require('fs');
let {flatten,MAGIC_NUMBER,VERSION_1} = require("wasmly");
app = [
MAGIC_NUMBER,
VERSION_1,
]
// this is just a nested array of bytes:
// [[[0, 97, 115, 109]][[1, 0, 0, 0]]]
fs.writeFileSync('out.wasm',Buffer.from(flatten(app)))
不是很实用!
main()
从头开始
...
// main() -> i32 { return 42 }
main_function_signature = [FUNC,vec([]),vec([I32])] // function signature returns 42
main_function_code = bytevec([
vec([]), // no local variables
[I32_CONST, int(42)], // return 42
END
])
//lets make memory at least 2 pages and at most 10 pages long
memory = [LIMIT_MIN_MAX,uint(2),uint(10)]
// put it all together as a module
app = [
MAGIC_NUMBER,
VERSION_1,
[SECTION_TYPE,bytevec(vec([main_function_signature]))],
[SECTION_FUNCTION,bytevec(vec([int(0)]))],
[SECTION_MEMORY,bytevec(vec([memory]))],
[SECTION_EXPORT,bytevec(vec([
[str("main"),DESC_FUNCTION,0],
[str("memory"),DESC_MEMORY,0]
]))],
[SECTION_CODE,bytevec(vec([main_function_code]))]
]
...
内存分配器
让我们创建一个非常简单的内存分配器。
...
// malloc(length:i32) -> i32 { ... }
malloc_function_signature = [FUNC,vec([I32]),vec([I32])] // function signature returns 42
malloc_function_code = bytevec([
vec([
[1, I32] // current_heap:i32
]),
// current_heap = global.heap
GLOBAL_GET, 0,
LOCAL_SET, 1,
// memorycurrent_heap = length
GLOBAL_GET, 0,
LOCAL_GET, 0,
I32_STORE, 0, 0,
// global.heap = current_heap + 1 + length
LOCAL_GET, 1,
I32_CONST, 1,
I32_ADD,
LOCAL_GET, 0,
I32_ADD,
GLOBAL_SET, 0,
// return current_heap + 1
LOCAL_GET, 1,
I32_CONST, 5,
I32_ADD,
END
])
// create a heap global set to zero
heap_global = [I32,MUTABLE,I32_CONST, int(0),END]
//lets make memory at least 2 pages and at most 10 pages long
memory = [LIMIT_MIN_MAX,uint(2),uint(10)]
// put it all together as a module
app = [
MAGIC_NUMBER,
VERSION_1,
[SECTION_TYPE,bytevec(vec([malloc_function_signature]))],
[SECTION_FUNCTION,bytevec(vec([0]))],
[SECTION_MEMORY,bytevec(vec([memory]))],
[SECTION_GLOBAL,bytevec(vec([heap_global]))],
[SECTION_EXPORT,bytevec(vec([
[str("malloc"),DESC_FUNCTION,0],
[str("memory"),DESC_MEMORY,0],
[str("heap"),DESC_GLOBAL,0]
]))],
[SECTION_CODE,bytevec(vec([malloc_function_code]))]
]
...