MiniJinja:从在 Rust 中构建模板引擎的经验教训

主要观点:作者介绍了自己创建的 MiniJinja 模板引擎,包括其背景、特点、运行时值、枚举器与对象行为、构建虚拟机以及一些有趣的 API 等方面。

关键信息

  • 2024 年作者创建 MiniJinja,原本用于生成带 JavaScript 的 HTML,现在用于生成 YAML 等格式,近期用于 LLM 提示生成。
  • MiniJinja 不用代码生成,有基于栈的 VM 和 AST 字节码编译器,核心对象模型是Value类型枚举。
  • 枚举器用于描述对象内部内容,不同枚举类型决定迭代方式,ObjectRepr决定对象的显示和交互方式。
  • 构建虚拟机时,AST 设计采用大型枚举加Spanned<T>,指令枚举种类多但参数少,VM 通过State对象维护运行时状态。
  • 宏在虚拟机中是有挑战的,通过 ID 动态查找指令,且要处理闭包导致的循环问题。
  • 介绍了一些魔法般的 API,如通过 trait hackery 实现不同签名函数的注册和类型转换。

重要细节

  • MiniJinja 游乐场、API 文档、GitHub 项目及 crates.io 上的相关资源。
  • Value类型中各种变体的作用及内存管理方式,如Arc用于引用计数,SmallStr用于存储短字符串。
  • 不同类型对象(如BTreeMapVec)作为Object的实现细节。
  • 函数注册和类型转换背后的 trait 体系,包括FunctionArgsArgTypeFilterFunctionResult
阅读 12
0 条评论