GN⁺: C로 작성된 WebAssembly VM 개발
(irreducible.io)WebAssembly란?
- WebAssembly는 웹 브라우저에서 신뢰할 수 없는 클라이언트 측 코드를 거의 네이티브 속도로 실행하기 위해 설계된 표준화된 명령어 집합 및 바이트코드 형식임.
- Emscripten C/C++에서 JavaScript로의 컴파일러에서 발전하였으며, 초기에는 LLVM IR을 JavaScript로 변환하여 웹에서 C와 C++ 코드를 실행할 수 있도록 함.
- 시간이 지나면서 브라우저 개발자들이 Emscripten 프로젝트와 협력하여 성능 최적화를 위한 JavaScript의 단순한 하위 집합을 만들었고, 이는 asm.js로 표준화됨.
- 이후 JavaScript의 오버헤드를 피하기 위해 독립적인 바이트코드 형식이 설계되었고, 이것이 Wasm임.
- 최근 WebAssembly는 브라우저 외부에서도 인기를 얻고 있으며, Fastly와 Shopify는 WebAssembly 엔진을 기반으로 Edge Compute 및 Functions 제품을 구축함.
- WebAssembly는 다양한 소스 언어에서 타겟팅할 수 있는 기능으로 인해 플러그인 생태계를 구축하는 매력적인 플랫폼임.
왜 WebAssembly 인터프리터인가?
- 많은 소프트웨어 엔지니어처럼 새로운 사이드 프로젝트를 시작하고 몇 주 후에 흥미를 잃는 패턴에 빠져 있었음.
- 지속적인 기간 동안 노력을 투자할 수 있는 큰 프로젝트가 필요했고, 이는 컴퓨팅 스택의 낮은 수준에 노출되도록 함.
- WebAssembly의 하이프에 관심을 가지게 되었고, 맞춤형 시스템 호출을 설계할 수 있는 플랫폼 엔지니어링 도구로 매력적으로 보였음.
Semblance
- WebAssembly Core Specification에 익숙해지기 위해 WebAssembly 인터프리터를 작성하기로 결정함.
- 프로젝트의 목표는 학습용이므로 모든 opcode를 구현하거나 핵심 테스트 스위트를 통과할 계획은 없었음.
- "Hello, World!"를 실행할 수 있다면 만족할 것임.
결과
- 프로젝트는 큰 성공으로 간주됨. opcode 커버리지는 완전하지 않지만 간단한 "Hello, World!" 프로그램을 실행할 수 있음.
- 코드가 지저분하고 느리며 메모리 누수가 있으며 악의적인 모듈에 취약할 수 있지만 작동함.
- WebAssembly의 핵심 사양에 대해 많은 것을 배웠고, 엔지니어로서의 편안한 영역에서 벗어날 수 있었음.
- 이제 Wasmtime과 같은 산업용 런타임에 기여할 수 있는 충분한 WebAssembly 지식을 얻었다고 느끼고 있음.
Hacker News 의견
-
Wasm 인터프리터를 Scheme으로 작성한 경험이 있어 다른 사람들이 직접 작성하는 것을 보니 기쁨. Wasm은 생각보다 덜 어렵고, 모든 명령어를 구현할 필요 없이 재미를 느낄 만큼만 시도해보기를 권장함
- 작성자에게 주는 팁: spec-test에는 복잡한 형태의 텍스트 wasm이 포함되어 있지만, wast2json 변환기를 사용하면 더 간단한 JSON 설명과 일반적인 바이너리 wasm 파일을 얻을 수 있음
-
초보자 질문:
- 인터프리터를 직접 코딩하지 않을 때 어떻게 디버깅하는지 궁금함
- 문자열의 opcode를 퍼징하는 것이 얼마나 효과적인지 궁금함
- 서버 측 WASM 엔진과 브라우저 기반 엔진의 실질적인 차이가 얼마나 있는지, 하나를 다른 것으로 변환하는 데 얼마나 많은 작업이 필요한지 궁금함
-
직접 WASM 해석에 관한 흥미로운 기사 발견
- 이를 바탕으로 https://github.com/peterseymour/winter를 제작했고, WASM이 생각보다 간단하지 않음을 배움
-
흥미로운 접근 방식이며, 훌륭한 작업임
- 핵심 내용은 주로 이 파일에 있음: https://github.com/irrio/semblance/blob/main/src/wrun.c
-
Wasm-C-API를 표준 인터페이스로 채택하는 것이 좋은 아이디어였을 것이라 생각함
- 대부분의 Wasm 런타임(Wasmmer, V8, wasmi 등)이 채택한 API로, C로 작성되어 있어 해당 API에 익숙한 개발자들이 쉽게 시도할 수 있음
- 작성자가 Wasm에 익숙하다면 Wasmer에 패치나 개선 사항을 기여하는 것도 환영함
-
논란의 여지가 있는 점:
- 초기 꼬리 호출 명령어를 추가하는 것에 관심이 있는지 궁금함
- WASM 스펙 담당자들은 이를 "고수준"이라 하여 거부했지만, C 위원회도 Dennis Ritchie의 제안을 거부했음. Rob Pike도 Ritchie의 방향을 지지하는 것 같음. 그렇지 않다면 왜 Golang을 만들었겠는가? 꼬리 호출은 호출이 고수준일 때만 고수준임
-
Orca를 살펴보기를 권장함. 기여할 수 있는 좋은 기회가 될 것임: https://orca-app.dev
-
WebAssembly를 깊이 탐구하며 인터프리터를 처음부터 구축하는 과정을 보는 것이 정말 멋짐
-
훌륭한 글이며, WASM 구현으로 돌아가고 싶은 동기를 부여함
-
정말 멋진 작업임