루비로 구현된 WebAssembly 런타임, Roite 개발 여정

[EN] Running ruby.wasm on Pure Ruby Wasm Runtime / Uchio KONDO @udzura

작성자
RubyKaigi
발행일
2025년 05월 27일

핵심 요약

  • 1 Roite는 순수 루비로 작성된 WebAssembly 런타임으로, 루비와 WebAssembly의 통합을 목표로 합니다.
  • 2 Wasm 핵심 스펙 및 WASI 구현, 파일 시스템 접근을 위한 pre-opens 메커니즘 개발 과정을 상세히 다룹니다.
  • 3 블록 점프 및 인스턴스 생성 최적화를 통해 성능 향상을 이루었으며, 향후 WebAssembly 컴포넌트 모델 지원을 계획하고 있습니다.

도입

본 발표는 순수 루비로 구현된 WebAssembly 런타임인 'Roite'의 개발 여정과 주요 특징을 소개합니다. Roite는 루비 생태계 내에서 WebAssembly의 잠재력을 최대한 활용하고, 높은 이식성을 확보하며, 언어 불가지론적인 WebAssembly의 강점을 루비에 접목하고자 하는 목표 아래 개발되었습니다. 기존의 WebAssembly 솔루션들이 네이티브 라이브러리 빌드나 사전 컴파일된 아티팩트를 요구하여 운영 오버헤드를 증가시킬 수 있는 반면, Roite는 외부 C 의존성이나 Gem 없이 순수 루비만으로 작동하여 뛰어난 유지보수성과 호환성을 제공합니다.

Roite 개발은 여러 중요한 단계를 거쳤습니다. 첫 번째 이정표는 Rust로 작성된 WebAssembly 기본 구현 학습서인 “Gora Book”을 루비 버전으로 재구현하는 것이었습니다. 이 과정에서 Wasm 바이너리 파싱 및 VM 실행 루프의 기본 원리를 이해했습니다. 다음으로, WebAssembly 코어 스펙의 기본 명령어 192개를 구현하는 데 집중했습니다. 특히 i32, i64, f32, f64와 같은 4가지 숫자 타입에 대한 유사한 명령어들을 효과적으로 처리하기 위해 코드 생성기를 활용했습니다.

이후 실제 프로그램을 실행하기 위한 시도로 Rust로 작성된 그레이스케일 변환 프로그램을 Roite에서 구동하려 했으나, 메모리 할당 문제와 Rust의 panicunreachable로 번역되는 문제에 직면했습니다. 이러한 디버깅 과정에서 llvm-test-suite의 Wasm 테스트 스위트를 활용하여 숫자 명령어의 정확성을 검증하고, 마침내 그레이스케일 프로그램 실행에 성공했습니다.

가장 도전적인 단계는 Roite 위에서 루비를 실행하는 것이었습니다. 이를 위해 37개의 WASI(WebAssembly System Interface) 함수, 특히 wasi_snapshot_preview1 버전을 구현해야 했습니다. 초기에는 ruby --version 명령어가 작동했지만, require와 같은 파일 시스템 관련 기능은 작동하지 않았습니다. 이 문제는 pre-opens 메커니즘을 정확히 이해하고 구현함으로써 해결되었습니다. pre-opens는 보안상의 이유로 Wasm 런타임이 호스트 파일 시스템에 직접 접근할 수 없으므로, VM 시작 시 미리 등록된 파일 디스크립터를 통해 접근 권한을 부여하는 핵심 메커니즘입니다. 이를 구현한 후, 표준 루비 명령어도 경고 없이 정상적으로 실행될 수 있었습니다.

성능 최적화 또한 중요한 부분이었습니다. 블록 점프 명령어의 타겟 종점 위치를 동적으로 계산하는 대신 미리 계산하여 캐싱함으로써 실행 시간을 43% 단축했습니다. 또한, 내부 객체 인스턴스 생성이 병목 현상을 일으키는 것을 확인하고, 자주 사용되는 정수(0~64, -1) 인스턴스를 메모이제이션하여 속도를 1초가량 향상시켰습니다. WASI의 적용은 벤치마크에서 Ruby 7.1의 경우 52%, 3.4의 경우 57%의 실행 시간 단축 효과를 보여주며 매우 효과적임을 입증했습니다.

결론

Roite는 순수 루비로 WebAssembly 런타임을 구현하여 루비와 WebAssembly 간의 강력한 통합 가능성을 제시했습니다. WASI 지원 및 `pre-opens` 메커니즘 구현을 통해 복잡한 애플리케이션 실행 능력을 확보했으며, 지속적인 성능 최적화를 통해 실용성을 높이고 있습니다. 향후 WebAssembly 컴포넌트 모델 지원을 목표로 하며, 이는 Roite의 언어 불가지론적 특성을 더욱 강화할 것으로 기대됩니다. 순수 루비로 WebAssembly 런타임을 구축하는 것은 여전히 도전적인 과제이지만, 그 잠재력은 매우 크며, 루비 생태계에 새로운 가능성을 열어줄 것입니다.

댓글 0

댓글 작성

0/1000
정중하고 건설적인 댓글을 작성해 주세요.

아직 댓글이 없습니다

첫 번째 댓글을 작성해보세요!