Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >MoonBit,用于Wasm的新型语言工具链简介

MoonBit,用于Wasm的新型语言工具链简介

作者头像
云云众生s
发布于 2024-07-15 01:31:17
发布于 2024-07-15 01:31:17
21200
代码可运行
举报
文章被收录于专栏:云云众生s云云众生s
运行总次数:0
代码可运行

我们来看看 MoonBit,这是一种现代语言加工作流程,旨在创建高效的 WebAssembly 项目(它也可以针对 JavaScript)。

译自 Introduction to MoonBit, a New Language Toolchain for Wasm,作者 David Eastman。

WebAssembly (Wasm) 将低级代码编程固有的效率与 Linux 容器中常见的组件可移植性相结合。在某些方面,它与 Docker 竞争。然而,浏览器内的密集工作强烈暗示着它在 AI 领域的未来。

碰巧的是,其他语言不一定能有效地编译成 Wasm,这在一定程度上抵消了拥有可以在浏览器中运行的程序的优势。这就是 MoonBit 的用武之地,尽管它

也可以针对其他后端,例如 JavaScript。通过针对 Wasm,MoonBit 在许多较小的专业设备上获得了免费的优势。

MoonBit 是一个由中国人领导的项目:这解释了它的一些美学,以及代码中偶尔出现的中文注释。如果适用,您应该在使用它之前检查您自己组织的治理系统。

正如 MoonBit 的创建者张洪波 所说,“我们决定采用容错类型系统的原因是,我们希望 IDE编译器共享相同的代码库。” 这使得您在 Visual Studio Code 中看到的 MoonBit 语言更像是一个一等公民。这就是类型系统很重要的原因——它越强大,IDE 在编译器接管之前就能完成更多有效的工作。

如何通过 MoonBit 运行 Wasm

但我们所说的“运行 Wasm”是什么意思?这一点很重要,因为您的操作系统还没有将它视为一个在您的文件系统中自由运行的应用程序。

在我们更深入地了解 MoonBit 之前,让我们确保我们了解如何运行 Wasm。在大多数情况下,我们需要一个 JavaScript 框架来加载和保存它。要在 JavaScript 中使用 WebAssembly,您首先需要将模块拉入内存,然后进行编译/实例化:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
WebAssembly.instantiateStreaming(fetch("simple.wasm"), importObject).then( 
  (results) => { 
  // Do something with the results! 
  }, 
);

将此与 MoonBit 数独画廊中的示例进行比较 代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
WebAssembly.instantiateStreaming(
  fetch("target/wasm/release/build/main/main.wasm"), 
  importObject 
  ).then((obj) => { 
    obj.instance.exports._start(); 
    assign = obj.instance.exports["sudoku/main::ij_assign"] 
    initValues = obj.instance.exports["sudoku/main::initValues"] 
    readValues = obj.instance.exports["sudoku/main::ij_read"] 
    solve = obj.instance.exports["sudoku/main::solveValues"] 
  });

因此,我们这里需要了解一些事情。WebAssemby.instantiateStreaming 方法等待 Wasm 文件加载的 Response 对象(作为 promise)。然后访问 obj 实例成员,并调用包含的导出函数。导出清楚地描述了要在 Wasm 代码中调用的模块/方法。

好的,所以这让我们了解了通过 MoonBit 需要做什么;准备一个包含必要导出函数的 Wasm 文件。虽然我们可以在这个 在线可视化代码网站 中自由地使用 MoonBit 语言,但在本文中,我将重点介绍构建 Wasm 本身。

关于 MoonBit 及其 CLI 的更多信息

以下是一些解释:

  • MoonMoonBit 语言的构建系统。
  • 您可以使用 mooncakes.io 构建第三方包,因此它是一个推测性的包管理系统。
  • 如我所述,有一个 Visual Studio 代码插件用于 MoonBit。
  • 术语 module 与项目同义。
  • 为了创建我们看到的导出证据,我们需要 外部函数接口,我们将在本文末尾进行检查。

有了这些,让我们深入了解。

我们可以从 Visual Studio 代码开始,并安装 MoonBit 语言扩展。像往常一样,我在我那台可靠的 2015 年款 Macbook 上进行操作,它运行良好。

但我们将重点关注 CLI 工具管理项目。这是因为我想在我的脑海中巩固 Wasm 代码与在浏览器中公开它之间的联系。

打开 Warp,我下载了 CLI 工具:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
> curl -fsSL https://cli.moonbitlang.com/install/unix.sh | bash

然后,我使用 moon new 命令创建了一个不错的默认“hello”模块:

该项目在磁盘上的设置显示了库和主包之间的关系:

JSON 包清单为每个包的构建器提供了提示。mod 文件描述了整个模块。第一行声明此模块名为“eastmad/hello”。

hello.mbt 文件包含我们熟悉的语言介绍:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pub fn hello() -> String { 
  "Hello, world!" 
}

这与现代语言中方法或函数的惯用语类似——例如,我们在 Gleam 中看到了它。这将 main.mbt 代码保留在 main 包中,并负责将字符串发布到控制台:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
fn main { 
 println(@lib.hello()) 
}

很明显,@lib.hello() 是对 lib 包的内部调用,该调用已在包描述中解析。

通过 CLI 运行它非常简单:

太棒了。但我想知道它产生了什么。有一个全新的 target 目录,所以让我们看一下:

(您可以看到对 wasm-gc 的引用,它是 Wasm 的垃圾回收版本。本质上,这意味着谁以及如何解决“清理自身”的责任。)

因此,我们得到了承诺的 .wasm 文件——它是一个 285 字节长的二进制文件,其中包含可见的问候语,以及示例 javascript 调用开头引用的令牌“_start”——以及其他支持对象。我还没有看到任何像 JavaScript 框架顶部的“导出”的证据;我们所做的只是在内部打印到控制台。

与托管运行时交互

为了在嵌入到浏览器中时与托管运行时交互,MoonBit 引用了 外部函数接口 (FFI)。让我们通过快速了解一下来结束我们的介绍。

要在 MoonBit 中声明一个外部函数,您可以这样做:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
fn cos(d : Double) -> Double = "Math" "cos" 

实际函数本身(主体)已被推测的模块名称和函数名称替换。当我们从 JavaScript 调用它时,您将在下面看到它被重建。

然后,您可以在模块 moon.pkg.json 文件中描述关系:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  "link": {
    "wasm-gc": {
      "exports": [
        "add",
        "fib:test"
      ]
    },
    "js": {
      "exports": [
        "add",
        "fib:test"
      ],
      "format": "esm"
    }
  }
}

在此示例中,函数 addfib 被导出,函数 fib 将以 test 的名称导出。

最后,对于我们的数学示例,JavaScript 调用框架看起来像这样:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
WebAssembly.instantiateStreaming(fetch("xxx.wasm"), { 
 Math: { 
  cos: (d) => Math.cos(d), 
 }, 
});

这让我们几乎回到了原点。大多数这些元素在 Sudoku 示例中可见。

虽然 MoonBit 几乎可以投入生产(查看 此处状态),但它已经描述了一种现代语言以及创建 Wasm 项目的工作流程。我预计小型 LLM 将在不久的将来有效地打包到 Wasm 格式中。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-07-142,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Nginx静态资源服务的配置
上面配置中的http、server、location等都是指令块。指令块配置项之后是否如参数(例如 location /),取决于解析这个块配置项的模块。
mazhen
2023/11/24
3.6K0
Nginx静态资源服务的配置
保姆级Nginx日志配置文件总结
Nginx服务器日志相关指令主要有两条:一条是log_format,用来设置日志格式;另外一条是access_log,用来指定日志文件的存放路径、格式和缓存大小,可以参加ngx_http_log_module。一般在Nginx的配置文件的日志配置(/usr/local/nginx/conf/nginx.conf)。
兔云小新LM
2023/03/24
2.9K0
03 . Nginx日志配置及日志切割
access_log /usr/local/nginx/logs/b_test/access.log;
iginkgo18
2020/09/27
2.7K0
nginx负载均衡
Tengine是由淘宝网发起的Web服务器项目。它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能和特性。Tengine的性能和稳定性已经在大型的网站如淘宝网,天猫商城等得到了很好的检验。它的最终目标是打造一个高效、稳定、安全、易用的Web平台。
超蛋lhy
2018/08/31
1.2K0
nginx负载均衡
nginx日志配置
日志对于统计排错来说非常有利的。本文总结了nginx日志相关的配置如access_log、log_format、open_log_file_cache、log_not_found、log_subrequest、rewrite_log、error_log。 nginx有一个非常灵活的日志记录模式。每个级别的配置可以有各自独立的访问日志。日志格式通过log_format命令来定义。ngx_http_log_module是用来定义请求日志格式的。
用户5640963
2019/07/26
1.3K0
Nginx状态监控及日志分析
【转载请注明出处】:https://cloud.tencent.com/developer/article/1636526
后端老鸟
2020/06/01
3K0
Nginx状态监控及日志分析
Nginx 日志格式配置介绍
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
授客
2019/09/11
2.9K0
如何自定义 Nginx日志?
开始之前 为什么要自定义nginx日志? 这里有个例子。示例中希望 nginx 能够记录 php-fpm (上游服务器)执行程序所花费的时间,以便为优化服务器端(程序)响应时间提供支持,nginx 提
用户1560186
2019/11/19
2.4K0
Nginx日志配置
众所周知,线上如果出现事故我们通常都是查看日志去进行问题定位并且进行修复。使用好Nginx日志有利于我们线上进行修复异常问题。在Nginx中日志主要分为两种:access_log(访问日志)和error_log(错误日志)。通过查看access_log我们可以查看用户ip,浏览器信息及请求时间等信息,通过查看error_log我们可以查看线上出错的具体信息,可以帮助我们定位异常的原因。本篇文章主要带领大家详细了解Nginx如何配置日志。本文将会涉及到的日志配置指令:
创译科技
2019/09/06
1.4K0
Nginx日志配置
nginx Access日志格式「建议收藏」
默认,access日志路径是./logs/access.log, 默认的日志格式为combined格式; 使用log_format指令可以自定义日志格式;
全栈程序员站长
2022/06/28
1.6K0
004.Nginx日志配置及状态监控
对于HTTP而言,客户端负责发起request请求,服务端负责response响应。
木二
2020/07/10
1.4K0
004.Nginx日志配置及状态监控
NGINX日志配置总结
本来准备讲解nginx和apache的日志的,但是个人不太推荐apache(纯属个人爱好),这里就不介绍apache的日志了。
CrazyCodes
2018/09/18
1.3K0
【Nginx26】Nginx学习:日志与镜像流量复制
总算到了日志模块,其实这个模块的指令之前我们就用过了,而且也是是非常常见的指令。相信这一块的学习大家应该不会有什么难度。另一个则是镜像功能,这个估计用过的同学就比较少了,不过也并不是特别的复杂,一会讲到的时候咱们再详细说哦。
硬核项目经理
2023/09/18
1.3K0
【Nginx26】Nginx学习:日志与镜像流量复制
玩转 Nginx 之:使用 Lua 扩展 Nginx 功能
1、Nginx 简介 Nginx 作为一款面向性能设计的HTTP服务器,相较于Apache、lighttpd具有占有内存少,稳定性高等优势。其流行度越来越高,应用也越来越广泛,常见的应用有:网页服务器、反向代理服务器以及电子邮件(IMAP/POP3)代理服务器,高并发大流量站点常用来做接入层的负载均衡,还有非常常见的用法是作为日志采集服务器等。 Nginx 整体采用模块化设计,有丰富的模块库和第三方模块库,配置灵活。其中模块化设计是nginx的一大卖点,甚至http服务器核心功能也是一个模块。要注意的是:n
用户1177713
2018/02/24
23.5K0
玩转 Nginx 之:使用 Lua 扩展 Nginx 功能
Nginx日志管理——了解Nginx日志选项配置以及自定义日志格式使用「建议收藏」
不管什么程序,一般都会有日志的。哪怕你在浏览器上网访问了一个网站,也会有记录保存的。在这个里互联网时代,想在网上不留下痕迹那是很难的。在我们开发一个程序,日志功能往往也是不可缺少的,今天我们就来讲讲这个Nginx的日志是怎么样来玩的。
全栈程序员站长
2022/09/07
1.9K0
Nginx日志管理——了解Nginx日志选项配置以及自定义日志格式使用「建议收藏」
Nginx(2)——通用配置
user 设置Nginx服务的系统用户 worker_processes 工作进程数 和硬件CPU核数一致 error_log nginx的错误日志 pid nginx服务启动时候pid woker_connections 每个进程允许最大连接数 use 内核模型select epoll
羊羽shine
2019/05/29
4970
nginx日志模块源码分析
请求在处理结束时,会按请求路径的配置上下文记访问日志。 如果在请求处理期间产生了内部跳转(参考另一篇nginx跳转讲述), 请求结束时的路径可能不同于原始的请求路径。
stan1ey
2021/06/07
1.6K0
nginx日志模块源码分析
Nginx配置中的log_format用法梳理(设置详细的日志格式)
nginx服务器日志相关指令主要有两条:一条是log_format,用来设置日志格式;另外一条是access_log,用来指定日志文件的存放路径、格式和缓存大小,可以参加ngx_http_log_module。一般在nginx的配置文件中日记配置(/usr/local/nginx/conf/nginx.conf)。 log_format指令用来设置日志的记录格式,它的语法如下: log_format name format {format ...} 其中name表示定义的格式名称,format表示定义的格式
洗尽了浮华
2018/01/22
4.4K0
Nginx的日志管理和用定时任务完成日志切割
#log_format main '$remote_addr(远程IP) - $remote_user(远程用户) [$time_local](访问时间) "$request"(请求方式) '
星哥玩云
2022/07/04
7050
Nginx的日志管理和用定时任务完成日志切割
初识nginx基础篇-日志管理和切割
Nginx日志主要分为两种,访问日志和错误日志。两种日志可以在http和server模块中配置,nginx有一个非常灵活的日志记录模式。每个级别的配置可以有各自独立的访问日志。日志格式通过log_format命令来定义
后端技术探索
2018/08/09
1.3K0
相关推荐
Nginx静态资源服务的配置
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验