标签: assemblyscript

如何将 ArrayBuffer 从 JS 传递到 AssemblyScript/Wasm?

我有一段非常简单的 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)

javascript typescript webassembly assemblyscript

7
推荐指数
1
解决办法
2904
查看次数

使用内存来获取字符串会产生不正确的结果

我从这里遵循解决方案: 如何从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)

javascript webassembly assemblyscript

6
推荐指数
1
解决办法
160
查看次数

使用 Assemblyscript 将类从 WebAssembly 导出到 JavaScript?

我正在尝试使用 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)

typescript webassembly assemblyscript

6
推荐指数
1
解决办法
1732
查看次数

如何在AssemblyScript / Near中打印数组的长度?

我正在附近使用简单的汇编脚本进行实验,似乎无法找到一种打印数组长度的方法。这是最小的复制品:

  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)

assemblyscript nearprotocol

5
推荐指数
1
解决办法
58
查看次数

如何从 AssemblyScript 导出类?

我正在尝试将简单的碰撞检测库从 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)

javascript webassembly assemblyscript

5
推荐指数
1
解决办法
959
查看次数

找不到全局类型 CallableFunction

这是一个基本汇编脚本项目。但我在 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)

typescript webassembly assemblyscript

3
推荐指数
1
解决办法
373
查看次数