원문 캡처 · samyeyo.github.io
원문 캡처 · samyeyo.github.io

clx는 Lua 5.5 코드를 C++로 변환해 네이티브 실행 파일과 라이브러리로 컴파일하는 도구다. 일반 실행에서는 Lua 가상 머신(VM) 없이 동작하지만, 실행 중 Lua 코드를 불러와야 할 때는 --dynamic 모드로 VM을 포함할 수 있다.

개발자는 기존에 LuaRT의 rtc 컴파일러로 Windows에서 Lua 애플리케이션을 독립 실행 파일로 배포해 왔다. clx는 여기서 더 나아가 Lua 프로그램을 네이티브 코드로 컴파일하는 방식을 택했다. 별도의 Lua 설치나 lua55.dll, liblua55.so는 필요하지 않지만, 테이블·문자열·가비지 컬렉션·코루틴 등 Lua의 실행 의미를 지원하는 clx 런타임은 실행 파일에 포함된다.

컴파일과 네이티브 코드 연동

clx는 Lua 5.5 소스 코드를 분석해 C++ 코드를 생성하고, Clang·GCC·MSVC 같은 네이티브 컴파일러로 빌드한다. Lua 코드를 C++로 내보내거나 오브젝트 파일과 정적 라이브러리로 만들 수도 있다. 여러 Lua 파일을 함께 컴파일하면 require()로 불러오는 모듈도 실행 파일에 포함할 수 있다.

간단한 프로그램은 다음처럼 컴파일한다.

lua
print("Hello clx!")
bash
clx hello.lua

C++ 소스 생성, 오브젝트 파일 및 정적 라이브러리 빌드 명령은 다음과 같다.

bash
clx hello.lua --cpp
bash
clx hello.lua --object
clx hello.lua --static

여러 파일을 한 번에 빌드할 수도 있다.

text
main.lua
greet.lua
utils.lua
bash
clx main.lua greet.lua utils.lua --output app

C++로 작성한 네이티브 모듈은 clx API를 통해 Lua에 연결한다. 예를 들어 인수로 받은 숫자를 더하는 함수는 다음과 같다.

cpp
static clx::MultiValue add(clx::LState* L, const clx::LValue* args, size_t n)
{
 double sum = 0;
 for (size_t i = 0; i < n; i++)
 sum += clx::check_number(L, args[i]);
 return {clx::number(sum)};
}

모듈을 애플리케이션과 함께 빌드한 뒤 Lua에서 불러온다.

bash
clx main.lua --modules fastmath
lua
local fastmath = require("fastmath")

반대로 Lua 모듈을 정적 라이브러리로 빌드해 C++ 애플리케이션에 제공할 수도 있다.

bash
clx mylib.lua --static --output mylib

VM이 필요한 경우와 제약

컴파일 시점에 알 수 없는 Lua 코드, 예를 들어 플러그인이나 사용자 스크립트를 실행해야 한다면 --dynamic 모드를 사용할 수 있다. 이 모드는 Lua 5.5 VM을 포함해 load() 같은 기능을 제공하면서, 나머지 프로그램은 AOT 컴파일 방식으로 실행한다.

개발자는 네이티브 컴파일이 LuaJIT을 비롯한 모든 Lua 구현보다 항상 빠르다고 주장하지 않는다. 성능은 프로그램과 컴파일러가 최적화할 수 있는 정도에 따라 달라진다. 작은 실행 파일을 만들 수 있고 필요하지 않은 런타임 기능은 제외할 수 있다고 설명하지만, 구체적인 성능 수치나 비교 조건은 제시하지 않았다.

개발 과정에서는 Lua 테이블, 다중 반환값, 코루틴, 가비지 컬렉션을 비롯해 환경, 메타테이블, 오류 처리 등 언어 의미를 네이티브 코드에서도 유지하는 일이 어려웠다고 밝혔다. C++를 생성 대상으로 선택해 기존 네이티브 컴파일러와 라이브러리를 활용할 수 있지만, 생성된 C++ 코드가 커지거나 큰 번역 단위의 컴파일에 시간이 오래 걸릴 수 있다는 점은 남은 과제다.

clx는 Lua 5.5 문법, 여러 파일로 구성된 프로젝트, 네이티브 모듈, 독립 실행 파일과 라이브러리 빌드를 지원한다. 다만 아직 개발 중이며, 구현되거나 최적화되지 않은 Lua 프로그램과 기능이 있을 수 있다.