#tcl #script #scripting #language

molt-wasm

Rust 应用程序的嵌入式 TCL 解释器(个人分支)

4 个版本

0.4.5 2024 年 6 月 26 日
0.4.4 2024 年 6 月 25 日
0.4.3 2024 年 6 月 25 日
0.4.2 2024 年 6 月 25 日

WebAssembly 中排名 #343

每月下载量 47

MIT 许可证

450KB
8K SLoC

Molt-forked

Crates.io

这是 molt 的分支版本,一个嵌入 Rust 应用的 TCL 解释器。原始仓库已不再维护,这个版本旨在继续其开发,修复错误,并添加新功能。支持 WASM 运行时。请参阅 演示

待办事项

  • 完全支持 tcl 8.6.14
  • 更新 molt-app 到最新的 rustyline 版本

Molt-forked 0.4.1 中的新功能

  • 子命令现在是静态的,我们可以使用 gen_subcommand! 宏来初始化 SubCommand。

Molt-forked 0.4.0 中的新功能

  • 支持 WASM 运行时。请参阅 演示,您会发现编译的 WASM 二进制文件大小仅为 ~600k。

  • 删除 ContextMap 以及解释器中的相关属性/函数参数。现在解释器的定义是 Interp<Ctx>(带有用户定义的泛型 Ctx),我们可以直接通过 interp.context 访问解释器的 Context。

  • 原生命令现在是静态的,我们可以使用 gen_command! 宏来初始化 Command。

    好处是 molt-fork 可以使用 match 块来实现标记匹配,而不是 HashMap

  • 新文档(Molt 书籍,代码描述)尚未实现。

基准测试结果

  • 命令: cd molt-app && cargo run --release bench ../benchmarks/basic.tcl

  • 平台: Intel Xeon 6348 CPU

多分支 0.4.0 (时间单位:纳秒) 0.3.2 加速(×) 基准测试
89 208 2.34 ok-1.1 ok,无参数
90 207 2.3 ok-1.2 ok,一个参数
97 219 2.26 ok-1.3 ok,两个参数
119 209 1.76 ident-1.1 ident,简单参数
209 402 1.92 incr-1.1 incr a
158 311 1.97 set-1.1 set var value
201 348 1.73 list-1.1 六个元素的列表

===================== 以下为原始文档 =====================


Molt -- 更多或更少 TCL

MoltLogo.png

Molt 是一个用于嵌入 Rust 应用和脚本 Rust 库的最小化 TCL 语言实现。有关详细信息和使用文档,请参阅《Molt 书籍》,有关 Rust API,请参阅docs.rs/molt

Mazegen:一个示例

请参阅Mazegen,了解如何使用 Molt 为真实 Rust API 提供一个 TCL 接口。Mazegen 是一个迷宫生成代码和相关基础设施的集合,Molt 接口作为调试和实验的辅助工具。Mazegen 包括以下内容:

  • 对(部分)rand::thread_rng 包的简单绑定
  • image 包的绑定开始(更多功能即将推出)

Molt 0.3.1 新增功能

  • molt_throw!
  • 新的 Exception 方法
  • 通过 env() 变量访问环境变量
  • 额外的 TCL 命令

有关每个版本的新功能的完整列表,请参阅 Molt 书籍中的标注的变更日志

即将推出

目前,Molt 已足够强大和健壮,可以用于实际工作,尽管 Rust 级 API 尚未完全稳定。标准 Rust 0.y.z 语义版本控制适用:".y" 更改可能会破坏 Rust 级 API,而 ".z" 更改则不会。

  • 额外的 TCL 命令
  • 测试改进
  • 文档改进
  • 功能:Molt 命令的正则表达式和 glob 模式匹配

Molt 存在的原因

使用 Molt,您可以:

  • 为您的 Rust 包创建一个 shell 解释器,以便进行脚本编写和交互式测试。
  • 为您的 Rust 应用提供交互式 REPL,以便进行调试和管理。
  • 在编译时或运行时使用脚本扩展您的 Rust 应用。
  • 允许用户对您的应用程序和库进行脚本编写。

有关 Molt 客户端骨架的示例,请参阅molt-sample 存储库

Molt 和标准 TCL

Molt 旨在轻量级且依赖性最小,以便它可以添加到任何项目中而不会大幅增加其大小。(目前,核心语言是一个无依赖项的库!)因此,它不提供所有标准 TCL 的功能(例如,TCL 8.6)。

同时,Molt 对 TCL 的实现应与 TCL 8.6 保持一致,只要可能。省略了一些过时的命令和命令功能;进行了一些更改,以便 Molt 在 Rust 生态系统中的表现更佳。(例如,Molt 的空白概念与 Rust 的相同。)所有与标准 TCL 的链接均在《Molt 书籍》中进行了文档化。

为了扩展Molt在Rust中的API,并没有努力使其看起来像标准TCL的C API;相反,目标是使Rust级别的API尽可能简单和易用。注意:这项工作的很大一部分是定义和改进用于与解释器交互和扩展的解释器的Rust API。如果您有任何评论或改进建议,请与我联系或提交一个issue!

构建和安装

最简单的方法是使用crates.io获取最新的Molt。查找moltmolt-shellmolt-app包,或者将它们添加到您的cargo.toml依赖列表中。

构建Molt

  • 安装Rust的最新稳定版本(撰写本文时为1.38.0)
  • 克隆此仓库
  • 构建
$ cd .../molt
$ cargo build
  • 运行交互式shell
$ cargo run shell
  • 仅运行语言测试套件
$ cargo run test molt/tests/all.tcl

从Molt 0.2.0开始,语言测试也由cargo test运行;然而,使用上述命令查看单个测试的输出要容易得多。

依赖项

目前,Molt核心所需的唯一依赖项是indexmap

致谢

我在这项工作中得到了许多人的帮助;以下是一个(不可避免地不完整的)列表。

  • Mary Duquette,为Molt标志
  • Jonathan Castello,提供一般的Rust信息
  • Kevin Kenny,在TCL数值和一般鼓励方面提供帮助
  • Don Porter,在TCL解析方面提供帮助
  • rfdonnelly,为crates.io徽章等提供帮助
  • Coleman McFarland,改进了molt_shell::repl
  • dbohdan,为TCL命令实现和建议。
  • 来自users.rust-lang.org的各个用户,他们回答了我的问题
    • Krishna Sannasi,帮助将Value与任意用户数据类型一起使用
    • Yandros,指出OnceCellUnsafeCell
    • jethrogb,关于如何使用Ref::map从函数中返回一个深藏于RefCell<S>中的Ref<T>的建议。(请注意,一旦我实现了它并试了一下,我又把它移除了,因为BorrowMutError引发了panic。但我不得不试试。)

依赖项

~38MB
~322K SLoC