Show HN: Clx – 通过C++20将Lua编译为本地可执行文件
摘要
Clx是一个跨平台的提前编译Lua编译器,通过C++20工具链生成独立的本地可执行文件,提供有竞争力的性能、小巧的二进制文件,并支持Lua 5.5。
查看缓存全文
缓存时间: 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 应用,但兼容性工作和优化改进仍在进行中。
环境要求
- Linux:
g++(推荐用于 TCO)或clang++ - macOS:
clang++(Xcode)或通过 Homebrew 安装的g++(用于 TCO) - Windows:
g++(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.5 | LuaJIT | clx --fast |
|---|---|---|---|
| fib.lua | 0.311s (1.00x) | 0.045s (6.91x) | 0.005s (62.20x) |
| arraysum.lua | 0.128s (1.00x) | 0.052s (2.46x) | 0.031s (4.13x) |
| spectralnorm.lua | 0.310s (1.00x) | 0.018s (17.22x) | 0.029s (10.69x) |
| canada.lua | 0.372s (1.00x) | 0.142s (2.62x) | 0.286s (1.30x) |
| warmup.lua | 0.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
相似文章
Show HN: Clawk – 为编程代理提供一次性Linux虚拟机,而非你的笔记本电脑
Clawk是一个开源工具,为Claude Code等编程代理提供一次性Linux虚拟机,使其能自由运行而不危及宿主机。它通过网络白名单和文件隔离来保护密钥和系统文件安全。
编译Go程序为Nintendo Switch原生二进制文件(2022)
一种通过将系统调用替换为C函数调用来将Go程序编译为Nintendo Switch原生二进制文件的技术,性能优于之前基于WebAssembly的方法。
Show HN:OpenClawMachines – 将OpenClaw扩展到企业级
OpenClawMachines是一个开源平台,用于在您自己的基础设施上,通过硬件隔离的Firecracker微虚拟机运行OpenClaw AI代理,并配备控制平面、主机代理和LLM代理。
Show HN:Lucen —— 一个通过注释指令并行化 for 循环的 Python 编译器
Lucen 是一个源到源的 Python 编译器,通过注释指令并行化 for 循环,保证产生位一致的结果,并在无法证明并行安全时安全地回退到顺序执行。
Hax – 一个用 C 编写的极简、终端原生编码代理
Hax 是一个用 C 编写的极简、终端原生编码代理,设计轻量、内存高效,对本地 LLM 使用友好,并支持多种提供商。