Clx: 将 Lua 提前编译为原生可执行文件

Clx: 将 Lua 提前编译为原生可执行文件

Clx 是一个跨平台的提前编译 (AOT) 编译器和运行时,可将 Lua 5.5 代码转换为独立的原生可执行文件。通过利用 C++20 后端和现代原生工具链 (Clang, GCC, 和 MSVC),Clx 消除了字节码解释器的开销,从而实现可预测的运行时性能和快速启动时间。

核心目标与性能

Clx 的设计目标是可部署性和可预测性,而不是针对每种工作负载实现绝对最快。其主要目标包括生成独立的执行文件、提供快速启动,并通过原生编译器实现强大的优化机会。

在 Intel® Core™ i5 Ultra 125U CPU (Linux, GCC 13.3.0) 上的性能基准测试显示,与标准 Lua 5.5 解释器相比有显著的速度提升:

Script Lua 5.5 LuaJIT Clx --fast
fib.lua 1.00x 6.91x 62.20x
arraysum.lua 1.00x 2.46x 4.13x
spectralnorm.lua 1.00x LuaJIT 17.22x 10.69x
canada.lua 1.00x 2.62x 1.30x
warmup.lua 1.00x 1.20x 1.20x

技术实现与优化

Clx 实现了多种底层优化以减少内存分配并提高执行速度:

  • 16-byte Tagged Values: 使用 8 字节负载和独立的类型标签。
  • Inline String Optimization: 长度为 6 字节或更短的字符串直接存储在值中,从而消除了堆分配的需要。
  • Fast-path Table Access: 实现缓存以加速表查找。
  • C++20 Backend: 生成可由后端编译器 (GCC, Clang, 或 MSVC) 进一步优化的原生代码。

功能与兼容性

Clx 旨在与 Lua 5.5 兼容,核心语言、表、元表、协程以及大多数标准库已实现。

关键能力

  • Small Binaries: 使用 --minimal 标志,Lua 程序可以被编译成小于 100 KB 的可执行文件。
  • Flexible Output: 编译器可以生成原生可执行文件、对象文件 (.o/.obj)、静态模块 (.a/.lib) 或原始 C++ 源代码。
  • C++ API: 为开发可移植的原生模块提供面向值的 API。

已知限制

由于 Clx 是纯 AOT 模型,某些 Lua 的动态特性不受支持:

  • Dynamic Code Loading: load(), dofile(), 和 loadfile() 等函数不受支持,因为它们需要运行时解释器。
  • Debug Module: 由于在 AOT 环境中实现其复杂性,debug 模块不受支持。
  • C API: 传统的 Lua C API 不受支持;开发者必须使用 clx C++ API 来开发原生模块。

入门指南与构建要求

Clx 目前处于 beta 阶段。要构建并安装它,用户需要 CMake 3.15+ 和兼容的 C++ 编译器:

  • Linux: g++ (推荐用于尾调用优化) 或 clang++
  • macOS: clang++ (Xcode) 或 g++ (Homebrew)。
  • Windows: g++ (LLVM) 或 MSVC。

快速开始命令

git clone https://github.com/samyeyo/clx
cd clx
./build.sh install
clx examples/hello/hello.lua
./hello

项目状态与许可

Clx 根据 MIT License 发布,目前处于 beta 阶段,正在持续进行兼容性和优化改进工作。

Sources