
























Roto(一个面向 Rust 的编译型脚本语言)试图让 Rust 程序能像接 Lua 一样嵌入小段逻辑,但保留更强的类型和编译期检查。讨论围绕它是否真的比直接写 Rust、用 YAML 配置、或嵌 Lua 更有价值展开,尤其是在“配置里需要少量逻辑”的场景下。它的一个典型应用是 BGP collector(处理路由更新的采集程序),要对持续流入的数据做过滤、转换和自定义规则处理,因此热重载、性能和可扩展性都很关键。评论还暴露了这个项目的设计取舍:是否要保留自定义字面量、如何处理状态和序列化、以及无状态 Runtime 对并行执行的帮助与限制。
不少人认为 Roto 的意义不在于替代 Rust,而在于把“配置里夹逻辑”的部分从核心业务中拆出来。像可插拔 task source、规则过滤、以及原本会被塞进 YAML 的复杂行为,更适合交给嵌入式脚本语言处理。支持者强调 hot reloading 的价值:改逻辑后不用重编译和重启,迭代速度会快很多。这类思路和长期把 Lua 接进宿主程序的做法很像,核心诉求是 extensibility 和快速试错。
有评论者担心 IP、IP prefix、AS number 这类 domain-specific literals 会让语言变得过度特化。问题不只是“看起来聪明”,还包括 scoping 不清、边界情况多,最后容易出现类似 YAML 那种奇怪的特殊错误。作者回应说,这些 literals 计划被移除,未来更倾向于让应用自行扩展需要的 literals。这个回应总体上被认为是更稳妥的设计方向。
性能讨论集中在 Roto 的真实目标场景:一个 BGP collector(路由更新采集程序)里用脚本做过滤和转换。现有测试显示,它在简单数值计算上能快过 Lua,在字符串密集型基准上大致接近 Lua,在 Iocaine 那类偏简单类型检查的脚本里也表现不错。反过来,List 访问的 benchmark 明显慢很多,原因被解释为每次取元素都要跨 Rust 边界,而且 List 内部还带着 mutex。作者也承认目前缺少正式 benchmark suite,优化空间还很大。
有人关心 Roto 的 runtime 能否像游戏引擎里的 Lua 那样被 serde 化,用来 snapshot 整个运行时状态。作者澄清,Roto 里的 Runtime 只是函数、类型和常量的集合,不是程序状态本身,所以脚本目前基本不能保留状态。这个设计的好处是脚本可以并行运行,不必额外处理状态同步。代价则是状态化、可序列化的使用场景还需要继续设计。
也有评论者直接质疑 Roto 的语法是否真的足够吸引人,认为 Rust 风格的写法并没有带来决定性的优势。有人把 `AddrRange` 和 `IpAddr` 的比较写法称为“难看”,并反问为什么用户不会直接选 Python。这个观点的潜台词是:如果一门新语言需要额外堆字面量、DSL 和特化语法才能成立,那它未必比成熟生态更有说服力。它代表的是对新语言 adoption 的现实怀疑。
Lua: 一种经典的嵌入式脚本语言,常被集成到宿主程序里做扩展逻辑和热重载。
YAML: 常用于配置的标记语言,适合简单结构,但表达复杂逻辑时容易变得笨重。
hot reloading: 无需重启宿主程序即可更新脚本或逻辑,能显著缩短开发迭代时间。
BGP: Border Gateway Protocol,互联网路由协议;这里指处理路由更新的采集和过滤场景。
Runtime: Roto 中暴露给脚本的函数、类型和常量集合,不等于脚本的运行状态本身。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。