如何在 AssemblyScript 中使用 asc 编译 console.log("1")?

Posted

技术标签:

【中文标题】如何在 AssemblyScript 中使用 asc 编译 console.log("1")?【英文标题】:How to compile console.log("1") with asc in AssemblyScript? 【发布时间】:2021-03-20 20:52:21 【问题描述】:

我想在 AssemblyScript (TypeScript) 中编译一个显示 1 的代码,使用 console.log

我的名为 example.ts 的文件包含以下内容:

console.log("1")

我编译如下:

asc example.ts

但我收到以下错误:

ERROR TS2304: Cannot find name 'console'.

 console.log("1")
 ~~~~~~~
 in example.ts(1,1)

FAILURE 1 compile error(s)

process.stdout.write("1") 也会发生同样的事情。

这是怎么解决的?

【问题讨论】:

【参考方案1】:

我在 Discord 上的 AssemblyScript 服务器上寻求帮助,贡献者 (dcodeIO) 能够修复有关 UTF-8 编码的错误 .因此,为此需要有 AssemblyScript 版本 0.17.7,即修复此错误的版本。另外,另一位合作者 (MaxGraey) 帮助我创建了代码并安装了软件包。

首先你必须安装加载器:

npm i @assemblyscript/loader

在我的情况下,我不能,我不得不全局安装它,因为我安装了操作系统的 USB 上的读取问题:

npm install --force -g @assemblyscript/loader

你要小心,有一个名为assemblyscript-loadernpm包,注意它的中心有一个减号,你不必这样做:

npm install --force -g assemblyscript-loader # Do not do it, it is wrong.

example.ts的代码如下:

namespace console 
    declare function log(str: string): void;


/*
  main generally unnecessary if you don't use
   the `import` object on the host side,
   but in this case it's better to delay the implicit
   initialization during module instantiation
*/
export function main(): void 
    console.log("1");

要使用 asc 编译 example.ts,您可以执行以下操作...我添加了优化以减少文件重量:

asc -O3z --converge -b ./example.wasm ./example.ts

这会生成一个3033字节的文件,相当于3 kb

要从 Node.js 执行 wasm 代码,您必须创建一个文件,例如 example.js,它会如下所示:

const fs = require("fs")
const loader = require('@assemblyscript/loader/umd');

loader.instantiate( fs.readFileSync("./example.wasm"), 
    example:  // if your file called "example.ts"
        "console.log"(ptr) 
            console.log(exports.__getString(ptr));
        
    
)
.then(module => 
    exports = module.exports;

    exports.main(); // call entry point
)
.catch(e => 
    console.error(e);
)

使用fs.readFileSync("./example.wasm") 很重要,因为仅使用"./example.wasm" 时,它不起作用。这是因为 loader AssemblyScript 的实现(在 Node.js 中创建),在 index.js 文件中大约在 第 333 行,将Buffer 类型的变量作为参数询问,它是 example.wasm 的字节。

就我而言,当我在全局安装它时,在 example.js 中我将其更改为以下内容:

const loader = require('/usr/lib/node_modules/@assemblyscript/loader/umd');

要从 Node.js 运行 example.js 文件,可以按如下方式进行。我放置了代码跟踪参数以防发生奇怪的事情:

node --trace-warnings --track-heap-objects ./example.js

运行命令的输出如下:

1

如您所见,它工作正常。

【讨论】:

以上是关于如何在 AssemblyScript 中使用 asc 编译 console.log("1")?的主要内容,如果未能解决你的问题,请参考以下文章

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

在 AssemblyScript 中实例化数组的三种不同方法

在 AssemblyScript 中连接或合并 TypedArrays

三等号 (===) 在 AssemblyScript 中的行为是不是不同?

三等号(===)在AssemblyScript中的行为是否不同?

NEAR,如何实现撤销(汇编脚本)