Roto发布一周年:Rust编译脚本语言的探索之路
速览
Roto是一个专为Rust设计的编译型脚本语言。文章回顾了该语言发布一年来的发展历程与技术特性。作为Rust生态的补充,Roto旨在提供脚本语言的灵活性与编译语言的性能优势。
AI 深度解读
一年回顾:Roto,Rust 的编译型脚本语言
来源:Hacker News 作者:Terts Diepraam
背景
一年前,我们宣布发布了 Roto,一种专为 Rust 应用程序设计的 JIT 编译嵌入式脚本语言。自那时起,Roto 发生了许多变化,我们希望通过这篇回顾文章分享这一年的进展。
Roto 是一种与 Rust 紧密集成的脚本语言。与其他脚本语言不同,Roto 是静态类型且经过 JIT 编译的。这使得它在许多场景下比其他脚本语言更快。虽然我们开发 Roto 主要是为了我们的 Rotonda 项目,但它足够灵活,可以被其他应用程序使用。
过去一年中,Roto 取得了显著进展:发布了 6 个新版本,增加了许多新功能、修复了错误;在 EuroRust 和 FOSDEM 等会议上进行了演讲;拥有了专属 Logo;在技术作家的帮助下大幅完善了手册;一些外部项目开始采用 Roto 作为其脚本语言;并将开发迁移到了 Codeberg。
关键要点
- 语言特性大幅完善:新增了
while和for循环、f-strings(字符串格式化)、更多运算符(如%)、枚举(enum)、复合赋值运算符(如+=)、全局常量绑定以及类型泛型参数。 - List 类型突破:实现了
List类型,支持创建任意 Roto 类型的列表,并支持连接、迭代等操作。最大的挑战在于实现了 Roto 与 Rust 之间高效且低开销的列表数据传递。 - 语法向 Rust 靠拢:为了降低 Rust 开发者的学习曲线,Roto 语法进行了调整,使用
fn替代function,使用//替代#作为注释符号。尽管语法相似,但 Roto 永远不会成为 Rust 的完整子集,因为它包含一些 Rust 没有的特性(如字符串格式化与过滤器)。 - 注册机制革新:引入了
library!宏,允许批量注册类型和函数。新的注册方式支持impl块、文档字符串(docstrings)和self参数,使得注册过程更像编写普通 Rust 代码,并支持构建模块树。 - 外部项目采纳:脚本化代理 Iocaine 采用了 Roto 作为默认脚本语言,因其性能优于 Lua 和 Fennel。Iocaine 作者的反馈对 Roto 的测试和改进起到了关键作用。
- 未来规划:尽管 Roto 已趋于成熟,但仍缺少哈希表、用户自定义状态、泛型函数等关键功能。团队计划继续开发格式化器和 LSP(语言服务器协议)等工具。
核心内容
语言变更:从基础到高级
Roto 在过去一年中增加了大量新功能,使其比最初发布时更加完整。除了上述提到的循环、字符串格式化、运算符和枚举外,最重大的 additions 之一是 List 类型。
现在,用户可以创建包含任何 Roto 类型的列表,并对其进行连接、迭代或其他操作。实现这一功能最具挑战性的部分在于如何在 Rust 和 Roto 之间传递这些列表。目前,这一功能已得到完全支持,且开销相对较低。
此外,Roto 的语法进行了现代化改造,使其更接近 Rust。例如,函数定义使用 fn 关键字,注释使用 //。这种变化旨在让熟悉 Rust 的开发者感到更自然、更容易上手。需要注意的是,Roto 的设计目标并非成为 Rust 的子集,而是保留一些独特的特性,如字符串格式化和过滤器。
注册机制:Revamped Registration
Roto 的价值很大程度上取决于其与 Rust 的集成能力,其中最关键的是将 Rust 类型、函数和常量注册到 Roto 脚本中的能力。这使得脚本能够访问应用程序所需的任何功能。
过去的注册方式较为繁琐,需要为函数添加属性宏,手动注册类型,并到处传递 runtime 参数。新的版本引入了 library! 宏,极大地简化了这一过程。
新的注册方式允许开发者使用 impl 块、文档字符串和 self 参数,使得代码结构更加清晰,更像标准的 Rust 代码。此外,新机制还支持构建注册函数的模块树,提高了代码的组织性和可维护性。
品牌与社区:Logo 与演讲
Roto 现在拥有了由 Richard de Ruijter 设计的专属 Logo,旨在传达 Roto 有趣且富有活力的设计理念。该 Logo 将广泛应用于手册、幻灯片和周边产品(如贴纸)中。
在推广方面,团队在 EuroRust 2025 和 FOSDEM 2026 上进行了演讲。EuroRust 的演讲侧重于 Roto 的通用介绍和使用入门,适合初学者;而 FOSDEM 的演讲则深入探讨了 Roto 的内部工作原理,特别是 List 类型的实现细节,适合对底层技术感兴趣的开发者。
外部采纳:Iocaine 项目
过去一年中,Roto 在 NLnet Labs 之外获得了首个重要采纳者:Iocaine。Iocaine 是一个可脚本化的代理,用于防御 Web 服务器免受 AI 爬虫的攻击,并向其返回垃圾数据。
Iocaine 目前支持 Roto、Lua 和 Fennel 三种脚本语言,但默认脚本使用 Roto。作者 Algernon 表示,选择 Roto 是因为其在三种语言中提供了最佳性能。这一采纳不仅验证了 Roto 的性能承诺,还通过大规模测试帮助改进了语言。Algernon 在提交 bug 和功能请求方面付出了巨大努力,对 Roto 的成熟起到了关键作用。
意义与影响
Roto 的过去一年证明了 JIT 编译脚本语言在 Rust 生态中的可行性和优势。通过与 Rust 的紧密集成和静态类型检查,Roto 在保持脚本语言灵活性的同时,提供了接近原生代码的性能。
Iocaine 项目的采纳表明,Roto 不仅在内部项目(如 Rotonda)中有效,也能在外部高性能需求的场景中发挥作用。其性能优势使其成为替代 Lua 等传统脚本语言的有力竞争者。
未来,Roto 团队将继续完善语言功能,如添加哈希表、泛型函数和用户自定义状态,并加强工具链支持,如格式化器和 LSP。这些改进将进一步降低开发者的使用门槛,提升开发体验。
Roto 的发展轨迹显示,一个精心设计的嵌入式脚本语言可以显著增强 Rust 应用程序的可扩展性和可维护性。对于需要高性能脚本能力的 Rust 项目而言,Roto 提供了一个值得关注的选项。
