Truffle AOT 教程

许多静态编译语言,例如 C 语言,在设计时就考虑了无需预先执行即可编译。默认情况下,Truffle 会先解释代码,然后再进行编译。为了提高静态语言的预热速度,可以支持 AOT(预先)编译。以下教程将介绍如何在您的语言中支持 Truffle AOT,以及如何触发和测试它。

语言支持 #

为了使语言支持 AOT 编译,该语言需要实现 RootNode.prepareForAOT() 方法。语言实现可以通过在此方法中返回非 null 值来表示支持 AOT。为 AOT 实现根节点的目的是准备所有 AST 节点,使其在未经预先执行编译时不再去优化。

此方法的典型实现操作包括:

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

触发 AOT 编译 #

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

使用示例 #

请参考以下有文档记录且可执行的 Truffle 语言,作为 AOT 支持的灵感来源:AOT Tutorial

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

联系我们