我有一段非常简单的 Typescript 代码,可以解析特定的数据格式,输入是 UInt8Array。我已经尽可能地优化它,但我认为这个相当简单的解析器应该能够比我让它作为 JS 运行得更快。我想尝试使用 AssemblyScript 在 web 程序集中编写它,以确保我没有遇到任何 Javascript 引擎的怪癖。
正如我现在发现的,我不能只是将 TypedArray 传递给 Wasm 并让它自动工作。据我所知,我可以传递一个指向数组的指针,并且应该能够直接从 Wasm 访问它而无需复制数组。但是我不能让它与 AssemblyScript 一起工作。
以下是一个最小示例,显示了我如何无法将 ArrayBuffer 传递给 Wasm。
设置 Wasm 导出的代码主要来自自动生成的样板:
const fs = require("fs");
const compiled = new WebAssembly.Module(
fs.readFileSync(__dirname + "/build/optimized.wasm")
);
const imports = {
env: {
abort(msgPtr, filePtr, line, column) {
throw new Error(`index.ts: abort at [${line}:${column}]`);
}
}
};
Object.defineProperty(module, "exports", {
get: () => new WebAssembly.Instance(compiled, imports).exports
});
Run Code Online (Sandbox Code Playgroud)
下面的代码调用了 WASM,index.js 是上面的胶水代码。
const m = require("./index.js");
const data …
Run Code Online (Sandbox Code Playgroud) 我从这里遵循解决方案: 如何从WebAssembly函数返回JavaScript字符串 ,这里: 如何从WebAssembly中的Rust返回字符串(或类似字符串)?
但是,当从内存中读取时,我没有得到预期的结果.
AssemblyScript文件,helloWorldModule.ts:
export function getMessageLocation(): string {
return "Hello World";
}
Run Code Online (Sandbox Code Playgroud)
index.html的:
<script>
fetch("helloWorldModule.wasm").then(response =>
response.arrayBuffer()
).then(bytes =>
WebAssembly.instantiate(bytes, {imports: {}})
).then(results => {
var linearMemory = results.instance.exports.memory;
var offset = results.instance.exports.getMessageLocation();
var stringBuffer = new Uint8Array(linearMemory.buffer, offset, 11);
let str = '';
for (let i=0; i<stringBuffer.length; i++) {
str += String.fromCharCode(stringBuffer[i]);
}
debugger;
});
</script>
Run Code Online (Sandbox Code Playgroud)
这将返回32的偏移量.最后产生一个过早开始的字符串,并在"Hello World"的每个字母之间有空格:
但是,如果我将数组更改为Int16Array,并将8添加到偏移量(即32),则偏移量为40.如下所示:
<script>
fetch("helloWorldModule.wasm").then(response =>
response.arrayBuffer()
).then(bytes =>
WebAssembly.instantiate(bytes, {imports: {}})
).then(results => {
var linearMemory = results.instance.exports.memory;
var …
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 Assemblyscript 将 TypeScript 编译为 WebAssembly,并且尝试从 WebAssembly 导出一个类,以便可以在 JavaScript 中使用它。为了澄清,我希望能够在 .js 文件中构造该类的新实例,即使该类是在 .wasm 中定义的。
我做了一些研究和实验,似乎 Assemblyscript 会将类方法导出为函数,而不是将类作为一个整体导出。
这就是我希望它在 WebAssembly 端的外观:
export class Point {
public x: i32;
public y: i32;
constructor(x: i32, y: i32) {
this.x = x;
this.y = y;
}
}
Run Code Online (Sandbox Code Playgroud)
这就是我想在 JavaScript 方面完成的任务:
// Omitted code for instatiating the Wasm Module
var exports = object.instance.exports; // The exports of the Wasm instance
var Point = exports.Point; // The Point class
let point = new Point(0, 0) // …
Run Code Online (Sandbox Code Playgroud) 我正在附近使用简单的汇编脚本进行实验,似乎无法找到一种打印数组长度的方法。这是最小的复制品:
let a = new Array<string>();
logging.log(a.length.toString());
Run Code Online (Sandbox Code Playgroud)
不与
ERROR TS2339: Property 'toString' does not exist on type 'i32'.
logging.log(a.length.toString());
~~~~~~~~
in assembly/main.ts(171,23)
Run Code Online (Sandbox Code Playgroud)
虽然toString()
明显存在于上i32
,例如以下代码段可以编译和运行:
let a: i32 = 5;
logging.log(a.toString());
Run Code Online (Sandbox Code Playgroud) 我正在尝试将简单的碰撞检测库从 JavaScript 移植到 WebAssembly 以提高速度。在查找了编译为 WASM 的语言之后,AssemblyScript 似乎很完美,因为我只需要向 JS 文件添加类型。整个库是 a Class
,添加类型后我尝试编译它,但它无法正确编译。例如,使用命令编译npx asc path/to/main.ts -o wasm.wasm --exportRuntime -t wasm.wat --bindings esm
:
export class Test {
constructor() {
console.log('Successful!');
}
};
Run Code Online (Sandbox Code Playgroud)
结果出现了这个错误:
WARNING AS235: Only variables, functions and enums become WebAssembly module exports.
export class Test {
~~~~
in main.ts(1,14)
Run Code Online (Sandbox Code Playgroud)
看到错误后,我尝试通过执行以下操作来修复它:
WARNING AS235: Only variables, functions and enums become WebAssembly module exports.
export class Test {
~~~~
in main.ts(1,14)
Run Code Online (Sandbox Code Playgroud)
但这导致了另一个错误:
ERROR AS234: Expression does not compile to a …
Run Code Online (Sandbox Code Playgroud) 这是一个基本汇编脚本项目。但我在 tsconfig.json 文件中遇到此错误消息。
{
"extends": "assemblyscript/std/assembly.json",
"include": [
"./**/*.ts"
]
}
Run Code Online (Sandbox Code Playgroud)
这是我的 package.json
{
"devDependencies": {
"assemblyscript": "^0.27.1"
}
Run Code Online (Sandbox Code Playgroud)