Turbo Haskell(THC)是一种编译器,在 GHC 完成解析、类型检查、去糖化和 Core 优化之后接管工作,通过其在 Truffle 和 GraalVM 上的运行时编译并执行 GHC Core。它实现了 GHC 9.14.1 的所有原语操作(prim-op),并通过 Native Image 提供即时(JIT)和提前(AOT)编译,使 Haskell 程序能够被编译为独立可执行文件。该设计复用了 GHC 复杂的前端,同时将 JVM 作为后端目标。
THC 为 Python、Ruby、R 和 JavaScript 提供了多语言外部函数接口(FFI),实现 Haskell 的 Data.Text 与 Truffle 字符串之间的零拷贝 UTF-8 编码数据转换,使 Haskell 程序能够调用这些语言的库,并将其输出直接带入 JIT 编译的代码中。对于数值工作负载,THC 通过利用 GHC 有限的 SIMD 原语操作集合,并借助正在孵化的 JDK Vector API(jdk.incubator.vector),可以在运行时选择 SIMD ‘物种’ 宽度,并 JIT 编译使用向量指令的循环,为 JIT 在适合的硬件上获得性能提升提供了一条途径。
THC 通过将热尾调用转换为带有侧出口的紧凑基本块风格循环,并使用 64 位 Bloom 过滤器在追踪模式下检测可能的递归尾调用,来避免传统的 trampoline 尾调用优化。当发现可能的匹配时,慢路径异常会触发自定义 Truffle 节点,指示 Graal 将跨函数体的尾调用循环重塑为单个紧凑循环;误报仅会增加额外的慢路径工作而不会改变结果。运行时还同时支持传统的 Java 线程和 Project Loom,提供一种带有 HEC 风格执行器的轻量级 GHC 风格绿色线程,使类似 MVar 的原语变得廉价。在早期基准测试中,THC 处理 Data.Map 的性能在预热后介于 3× 倍速至 3× 倍慢之间,大多徘徊在比 GHC 慢 10%–20% 左右,尽管最近的开发发现了性能退化,但问题正在被解决。
