The Golden Spike, and Resurrecting the Vale(n) Programming Language
골든 스파이크, 그리고 Vale(n) 프로그래밍 언어의 부활 — rustc와 직접 통신하는 Rust++ 언어를 향하여
Vale 언어의 저자 Evan Ovadia가 Rust 컴파일러와 직접 통신하는 새 언어 Valen의 첫 상호운용 성공 사례를 공개했습니다. C ABI를 우회하고 rustc를 라이브러리로 구동해 언어 경계를 넘는 제네릭 호출과 Rust 트레이트 구현을 실현했으며, 최종 목표는 경계를 넘나드는 메모리 안전성입니다.
- 주제
본문
1869년 미국 유타주 프로몬토리 서밋에서 동부와 서부 철도망이 연결되며 마지막 침목에 17.6캐럿 금못(golden spike)이 박혔습니다. 저자는 이 말을 '멀리 떨어진 두 시스템을 잇는 극도로 어려운 작업'의 은유로 쓰며, 자신의 새 언어 Valen의 컴파일러와 rustc를 직접 연결한 프로젝트를 골든 스파이크에 빗댑니다.
왜 'Rust++' 언어는 존재하지 않는가
다른 언어에서 Rust를 호출하는 일반적인 방법은 extern "C" 함수와 repr(C) 타입을 노출하는 것뿐입니다. Rust에는 아직 안정된 ABI가 없기 때문입니다. 문제는 C ABI에는 제네릭이 없다는 점입니다. Vec<T>::push 같은 제네릭 함수 호출이 불가능하고, 다른 언어의 타입이 Rust 트레이트를 구현할 수도 없습니다. HashMap::get조차 키 타입이 Hash와 Eq 트레이트를 구현해야 하므로 사용할 수 없습니다. 저자는 2024년에 pragma rsuse/rsfn 지시문으로 C에서 Rust 제네릭을 호출하는 '가장 저주받은 실험'을 성공시켰지만, 트레이트 구현 불가라는 근본 한계가 남았습니다.
rustc를 라이브러리로: 두 모노모파이저의 '춤'
Valen의 핵심 설계는, Rust 시그니처를 직접 해석하는 대신 Valen이 이해하는 Valen AST 형태의 함수 시그니처를 지연 생성하는 것입니다. rustc_driver의 run_compiler 함수로 rustc를 라이브러리처럼 실행하고 after_expansion 콜백을 활용합니다. Rust의 MIR은 Rust 전용으로 설계되어 Valen이 요구하는 기능을 표현할 수 없으므로, valenc는 자체 IR과 백엔드를 유지합니다. 그 결과 foo<T>를 foo<i32>로 구체화하는 모노모파이저가 rustc와 valenc 양쪽에 존재하며 서로를 호출해야 하는 '춤'이 발생합니다. 실제 구현에서는 valenc가 Valen 함수를 먼저 모노모파이즈한 뒤 모노모파이즈가 필요한 Rust 함수 목록을 rustc에 반환하는 방식으로 단순화했습니다. 이를 위해 rustc에 약 100줄의 패치를 적용했는데, 그중 하나는 LLVM 백엔드를 전제로 하는 해킹이라 업스트림이 불가능하다고 저자는 인정합니다.
첫 렌더링, 그리고 앞으로의 과제
원래 목표는 wgpu 기반 그래픽 라이브러리로 만든 게임 엔진을 Valen에서 구동하는 것이었습니다. 그런데 wgpu가 앱의 이벤트 루프 소유를 허용하지 않아, Rust가 Valen 코드를 역으로 호출하는 방향까지 범위를 넓혔습니다. '오픈 인터페이스 생성자'라는 기능으로 Valen 클로저가 Rust 트레이트 MainLoopCallback을 인라인으로 구현하며, 반년 이상의 작업 끝에 첫 렌더링에 성공했습니다. 다음 단계는 Nick Smith의 그룹 차용(group borrowing)에 기반한 경계를 넘는 차용 검사로, 잘 설계하면 Rust 차용 검사의 상위집합이 되어 언어 경계를 넘는 메모리 안전성이 가능하다고 주장합니다. 프로토타입이 이미 일부 경계 간 차용 검사를 수행하지만, 아직 검증 전이라고 단서를 답니다. Vale는 세대 참조와 리전 차용으로 Mojo의 선형 타입 도입에 영향을 준 언어였으나, Valen은 메모리 안전 모델이 근본적으로 달라 별도 이름을 붙였다고 설명합니다.
Lobsters 반응
- 커뮤니티 점수 12점을 기록했지만 아직 등록된 댓글은 없습니다.
원문: verdagon.dev / 번역·요약: Trawling