Show HN: Clx – 通过C++20将Lua编译为本地可执行文件

Hacker News Top 工具

摘要

Clx是一个跨平台的提前编译Lua编译器,通过C++20工具链生成独立的本地可执行文件,提供有竞争力的性能、小巧的二进制文件,并支持Lua 5.5。

大家好,HN。<p>clx是一个面向标准Lua的提前编译器,它生成C++20代码,并通过GCC、Clang或MSVC生成独立的本地可执行文件。<p>该项目最初是一个实验,旨在探究现代C++是否可以用作可移植的编译器后端,替代LLVM或直接机器码生成。生成的代码随后由宿主工具链编译并优化。<p>最新版本用新的影子类型实现取代了之前的NaN标记值表示,增加了完整的int64支持,改进了本地算术代码生成,并添加了ARM64 macOS协程支持。<p>性能通常比Lua解释器快得多,并且在某些计算密集型工作负载上可以超越LuaJIT,同时保持完全提前编译。<p>该仓库还包含用Lua编写的图形示例,包括一个Pong游戏和一个使用Sokol二进制模块(通过clx C++ API)的Mandelbrot探索器。<p>我非常期待大家对clx的反馈 :)
查看原文
查看缓存全文

缓存时间: 2026/07/17 01:54

samyeyo/clx 源码: https://github.com/samyeyo/clx

跨平台提前编译 Lua 编译器
Lua 5.5 C++20
协议: MIT
ko-fi (https://ko-fi.com/samirtine)

clx 是一个跨平台的提前编译 Lua 编译器与运行时,能够通过现代 C++ 工具链生成独立的原生可执行文件。
clx 并非追求在所有工作负载下成为最快的 Lua 实现,其目标在于提供:

  • 提前编译原生代码
  • 可部署的独立可执行文件
  • 可预测的运行时性能
  • 快速启动时间
  • 与现有 C++ 工具链的集成
  • 借助现代原生编译器实现强大的优化机会

快速开始

git clone https://github.com/samyeyo/clx.git
cd clx
./build.sh install    # Windows 下使用 build.bat install
clx examples/hello/hello.lua
./hello
Hello clx !

特性

  • 具有竞争力的性能:在多种适合 AOT 的工作负载上表现优异
  • 无字节码解释器开销:直接编译为独立原生可执行文件
  • 激进优化:利用 Clang/GCC/MSVC 的现代优化能力
  • 小型二进制:面向体积的构建可以生成非常紧凑的可执行文件(Lua 程序可使用 --minimal 选项压缩至 100 KB 以下)
  • 兼容 Lua 5.5:支持协程、元方法、表等
  • 16 字节标记值:8 字节有效负载 + 独立类型标记
  • 内联字符串优化(长度 ≤ 6 字节的字符串直接存储于值中,无需分配)
  • 快速路径表访问缓存
  • 轻量级面向 AOT 的运行时
  • clx C++ API:使用面向值的 API 开发可移植原生模块

使用 clx 构建的示例

clx 附带示例,这些示例使用 Sokol 的 clx 二进制模块实现图形功能,并演示了使用标准 Lua 代码进行原生桌面应用开发。

乒乓球游戏 (Pong)

pong:一个完整的游戏,使用 Lua 编写并编译成独立原生可执行文件。

曼德勃罗集查看器 (Mandelbrot)

Mandelbrot:一个曼德勃罗集查看器,使用 Lua 编写并编译成独立原生可执行文件。

项目状态

clx 目前处于 beta 阶段。编译器已能够编译非平凡的 Lua 应用,但兼容性工作和优化改进仍在进行中。

环境要求

  • Linuxg++(推荐用于 TCO)或 clang++
  • macOSclang++(Xcode)或通过 Homebrew 安装的 g++(用于 TCO)
  • Windowsg++(LLVM)或 MSVC
  • CMake 3.15+(用于构建)

注意: 用于构建 clx 的编译器在构建时通过 CMake 固定,并用于所有 Lua 脚本的编译。这确保了运行时库与生成的代码之间的 ABI 兼容性。如果需要不同的后端,请使用其他编译器重新构建 clx。

构建

POSIX

./build.sh           # 发布版(默认)
./build.sh debug     # 调试版
./build.sh clean     # 移除 build/ 和 /usr/local 安装
./build.sh install   # 发布版并安装到 /usr/local
./build.sh uninstall # 移除 /usr/local 中的已安装文件

Windows

./build.bat          # 发布版(默认)
./build.bat debug    # 调试版
./build.bat clean    # 移除 build/、./bin 和 ./lib
./build.bat install  # 发布版并安装到 ./bin 和 ./lib
./build.bat uninstall # 移除先前安装的 clx

也可直接使用 CMake:

mkdir -p build && cmake -S . -B build && cmake --build build

编译完成后,您将得到:

  • build/clx — 编译器可执行文件
  • build/libclx.a — 静态运行时库
  • build/libclx_size.a — 面向体积优化的静态运行时库

使用方法

./build/clx file.lua                # 编译为可执行文件(默认标志)
./build/clx --object file.lua       # 目标文件 (.o/.obj)
./build/clx --static file.lua       # 静态 clx 模块 (.a/.lib)
./build/clx --cpp file.lua          # 生成 C++ 源码,不编译
./build/clx file.lua -O2            # 将未知的 clx 标志传递给后端编译器
./build/clx file.lua --output f.exe # 自定义输出名称
./build/clx file.lua --debug        # 无优化,带调试符号
./build/clx file.lua --minimal      # 仅包含 base + package 模块
./build/clx file.lua --fast         # 为速度优化
./build/clx file.lua --size         # 为体积优化(默认)
./build/clx --version               # 打印版本
./build/clx --help                  # 显示帮助

兼容性

clx 旨在兼容 Lua 5.5。当前状态:

  • 核心语言:基本实现
  • 表和元表:已实现
  • 协程:已实现
  • 模块:已实现
  • 大多数标准库:已实现

详细状态请参阅 compatibility.md

已知限制

  • load() / dofile() / loadfile() / string.dump() — 动态代码加载需要运行时解释器
  • debug 模块 — 在纯 AOT 模型下非常复杂
  • 不支持传统的 Lua C API。
  • 二进制模块应使用 clx C++ API 编写。

测试套件

./tests/run.sh    # POSIX
./tests/run.bat   # Windows

tests/ 中的每个 .lua 文件会被编译为二进制并执行。测试会为每个断言打印 [OK][FAIL]

基准测试

结果以相对于标准 Lua 5.5 解释器的加速倍数表示:

脚本lua 5.5LuaJITclx --fast
fib.lua0.311s (1.00x)0.045s (6.91x)0.005s (62.20x)
arraysum.lua0.128s (1.00x)0.052s (2.46x)0.031s (4.13x)
spectralnorm.lua0.310s (1.00x)0.018s (17.22x)0.029s (10.69x)
canada.lua0.372s (1.00x)0.142s (2.62x)0.286s (1.30x)
warmup.lua0.006s (1.00x)0.005s (1.20x)0.005s (1.20x)

测试环境:Intel® Core™ i5 Ultra 125U CPU @ 4.30GHz · Linux · GCC 13.3.0 · 10 次平均结果
完整基准测试请参见 clx benchmarks

文档

doc/ 目录下包含文档,包括:

  • 快速入门
  • CLI 参考
  • 兼容性状态
  • 模块与迁移指南
  • C++ API 参考
  • 运行时内部
  • 架构概览
  • 优化
  • 基准测试

详见 文档索引

协议

clx 采用 MIT 协议授权 — 版权所有 © 2026 Tine Samir

相似文章