WebAssembly를 위한 Wasm-first 언어 Moonbit의 목표, 설계 철학, 성능 및 도구 체인을 소개합니다.

크로스 플랫폼 명령어 집합 아키텍처(ISA)인 WebAssembly (Wasm)는 효율성, 보안성, compact함, 개방형 표준이라는 특성 덕분에 클라우드 및 엣지 컴퓨팅에서 그 중요성이 점점 커지고 있습니다. 그러나 Wasm의 진정한 잠재력은 아직 충분히 발휘되지 못하고 있습니다. Rust, C/C++와 같은 저수준 Wasm 언어는 배우기가 어렵고, 컴파일 시간이 길어 개발자 생산성을 떨어뜨릴 수 있습니다. 반면 Golang과 같은 고수준 언어는 비효율적이고 부피가 큰 코드를 생성하여, Wasm의 핵심 장점인 속도와 compact함을 제대로 활용하지 못합니다.
Moonbit는 이러한 문제들을 해결하기 위한 Wasm-first 언어를 목표로 합니다. 빌드와 실행이 모두 빠르고, compact한 Wasm 결과물을 생성하며, 배우고 쓰기에는 Golang만큼 쉽고 기존 선택지들의 레거시 짐도 없습니다. Wasm이 본래 가지고 있는 효율성, 보안성, compact함과 결합될 때, Moonbit는 클라우드와 엣지 컴퓨팅 분야에서 Wasm이 오랫동안 약속해온 가치를 실현할 수 있는 위치에 서게 됩니다.
Moonbit는 Hongbo Zhang과 그의 경험 많은 팀이 이끌고 있습니다. 이들은 언어 설계와 개발 분야에서 10년이 넘는 전문 경험을 보유하고 있습니다. Zhang은 OCaml, ReScript (구 ReasonML/BuckleScript), Flow 등 여러 프로그래밍 언어에 기여해 왔습니다. 그는 ReScript 언어 툴체인의 핵심 구성 요소, 즉 매우 빠른 컴파일러, 표준 라이브러리, 빌드 시스템의 수석 아키텍트였습니다.
Moonbit는 Golang과 Rust의 영향도 받았습니다. 특히 패키지 시스템에서의 Golang의 단순함과, 강력한 패턴 매칭, 타입 추론, 제네릭, trait와 유사한 ad-hoc 다형성 등 Rust의 표현력을 통합합니다. Moonbit의 오류 회복형 타입 시스템은 속도, 병렬 처리, 점진적 검사에 최적화되어 있어 최상의 IDE 지원을 제공하도록 설계되었습니다.
Moonbit의 목표는 스택 전반 에 걸쳐 빠른 것입니다. 이는 개발 경험 측면의 성능과 런타임 성능을 모두 포함합니다.
Moonbit는 다단계 중간 표현(IR)에 기반한 전체 프로그램 최적화를 염두에 두고 설계되었습니다. 이 방식은 메모리 레이아웃을 개선해 캐시 미스를 최소화하고, 데이터 및 제어 흐름 분석에 더 우수한 문맥을 제공합니다. 이는 프로그램 구조에 대한 포괄적인 이해를 가능하게 함으로써 대부분의 기존 링크 타임 최적화(LTO) 구조를 능가하며, 보다 효과적인 최적화를 지원합니다. 여러 단계의 IR에서 최적화를 수행하면 저수준에서는 보이지 않는 고수준 중복을 식별하고 제거할 수 있다는 장점도 있습니다.
빠른 빌드 성능, 특히 IDE 기능은 개발자 경험에 필수적입니다. ReScript와 Rust와는 달리 Moonbit는 함수 단위 수준의 병렬 의미 분석을 허용합니다. 이 같은 세분성에서의 점진적 재분석 덕분에 Moonbit는 방대한 모노레포도 처리할 수 있으며, IDE 응답 시간을 밀리초 단위로 제공해 확장성을 크게 향상시킵니다.
Moonbit는 효율적인 dead code 제거를 위해 설계되었습니다. 이러한 분석을 방해하는 언어 기능은 배제하고, dead code를 쉽게 걷어낼 수 있도록 표준 라이브러리를 구조화했습니다. 전체 프로그램 최적화를 통해 Moonbit는 최종 코드 크기를 크게 줄여 보안을 강화하고 공격 가능성을 감소시킵니다. 또한 이는 서버리스 컴퓨팅 환경에서 빠른 시작 시간을 보장합니다.
Moonbit는 자동 메모리 관리를 제공해 Rust와 차별화되며, Golang과는 달리 포인터나 l-value와 같은 위험한 요소를 피합니다. 또한 패턴 매칭, 대수 데이터 타입, 데이터 지향 프로그래밍을 위한 ad-hoc 다형성 등 다양한 안전한 기능을 제공합니다.
Moonbit는 언어를 넘어 플랫폼이기도 합니다. 초기 단계부터 이미 폭넓은 도구 모음을 제공합니다. 여기에는 고속 빌드 도구, 패키지 매니저, 컴파일러, IDE, 그리고 컨테이너가 필요 없으며 오프라인 기능도 갖춘 독특한 클라우드 IDE가 포함됩니다. 이 클라우드 IDE는 단지 브라우저만 있으면 어디서든 접근 가능하며, 기존 클라우드 IDE와 차별화됩니다.
Moonbit의 장점은 간단한 피보나치 예제를 통해 살펴볼 수 있습니다. 아래는 fib 함수를 세 가지 언어(Moonbit, Go, Rust)로 구현한 예입니다.
moonbitfn fib(num : Int) -> Int { fn aux(n, acc1, acc2) { match n { 0 => acc1 1 => acc2 _ => aux(n - 1, acc2, acc1 + acc2) } } aux(num, 0, 1) }
아래는 github에서 확인할 수 있는 벤치마크 결과입니다.
계산 시간
Wasm 크기
컴파일 속도
177.9 ms
160.8 ms
6357.8 ms
fib(46)을 10,000,000번 계산하는 데 걸린 시간
253 bytes
498 bytes
1,447,712 bytes
출력 Wasm 파일 크기
1.06 s
9.01 s
2.56 s
626개 패키지 컴파일에 걸린 시간
🟥 MoonBit 🟨 Rust 🟦 Go
위 예시에서 MoonBit는 다음과 같은 장점을 보입니다.
aux의 타입을 추론합니다.Moonbit는 빠르게 발전하고 있는 프로젝트이지만, 이미 온라인 IDE에서 사용해 볼 수 있고, CLI 도구를 내려받아 사용할 수도 있습니다. 문서는 GitHub에 호스팅되어 있으며, VS Code 확장도 사용 가능합니다.
과거에는 전체 언어 툴체인 개발에 수년에서 10년 가까이 걸리기도 했지만, Moonbit는 우리가 쌓아 온 경험과, 프로젝트 시작 시점부터 구성한 전담 우수 팀 덕분에 그 과정을 크게 단축했습니다. 우리는 Moonbit가 2024년 2분기 말까지 베타 단계 에 도달할 것으로 예상하고 있습니다. 이는 비교적 안정적이고, 버그가 적으며, Wasm 호스트와 상호 작용하기 위한 견고한 FFI(Foreign Function Interface)를 갖춘 상태를 의미합니다. 베타 품질에 도달하면 소스 코드를 공개할 계획입니다. 또한 Wasm 제안에 발맞춰 Wasm 2.0을 위한 Wasm GC 통합과 Wasm 1.0을 위한 자체 GC 도입을 전략적 로드맵에 포함하고 있습니다.
질문이 있다면 포럼에 글을 남기거나, 디스코드에 참여하거나, 트위터 계정을 팔로우하여 소식을 받아보실 수 있습니다.