Truffle AOT 教程

许多静态编译语言(例如 C)被设计为可以在没有执行之前进行编译。默认情况下,Truffle 会先解释代码,然后再进行编译。为了提高静态语言的预热速度,可以支持 AOT 编译。以下教程描述了如何在语言中支持 Truffle AOT,以及如何触发和测试它。

语言支持 #

为了使语言支持 AOT 编译,语言需要实现 RootNode.prepareForAOT() 方法。语言实现可以通过在该方法中返回一个非 null 值来指示对 AOT 的支持。实现面向 AOT 的根节点的目标是准备所有 AST 节点,使它们在没有执行之前进行编译时不再进行反优化。

此方法实现中通常执行的操作包括

  • 在根节点的 FrameDescriptor 中初始化局部变量类型。如果语言使用局部变量,并且它们的类型已知,则必须将这些信息提供给 FrameDescriptor。此步骤通常可以在解析过程中完成。
  • 计算根节点的预期执行签名并返回它。此步骤需要解析器推断参数和返回值的预期类型。
  • 使用不会在首次执行时失效的配置文件准备专业化节点。Truffle DSL 支持为 AOT 准备专业化节点。有关详细信息,请参阅 AOT 语言示例。

触发 AOT 编译 #

可以使用 --engine.CompileAOTOnCreate=true 选项触发和测试 AOT 编译。这将为每个创建的调用目标触发 AOT 编译,前提是该调用目标的根节点支持 AOT 编译。如果根节点在 RootNode.prepareForAOT() 中返回一个非空值,则表示它支持 AOT 编译。请注意,启用此标志也会禁用后台编译,这使其不适合生产环境使用。

示例用法 #

将以下已记录且可执行的 Truffle 语言用作 AOT 支持的灵感:AOT 教程

该示例可以用 mx unittest AOTTutorial 作为 mx 单元测试执行。

与我们联系