오랜만에 C 라이브러리를 만들어 봤습니다. 말 그대로 C 헤더 파일 하나에 모든 것이 들어 있는 WebAssembly 인터프리터입니다. 물론 그냥 인터프리터만 달랑 있는 건 아니고,
- WebAssembly 3.0 명세를 100% 지원합니다. 네 GC니 뭐니 하는 것들 다 들어 있습니다.
- WebAssembly에는 결정론적 프로파일(deterministic profile)이라고 해서 어떤 환경에서도 똑같은 결과가 나오도록 하는 옵션이 있는데 이 옵션을 구현합니다. 따라서 재현 가능한 결과를 내는 데 유용합니다.
- x86-64와 AArch64 NEON을 위한 아키텍처별 최적화가 적용되어 있습니다.
- 신뢰할 수 없는 코드를 샌드박싱하는데 필요한 기능들이 들어 있습니다. Fuel metering이라고 해서 명령 실행에 연료(fuel)를 태워가면서 실행하다가 연료가 다하면 멈추거나, 실행에 일정 시간 후 인터럽트를 걸거나, 메모리 사용량을 제어할 수 있는 기능이 지원됩니다.
- 이렇게 실행 도중에 멈추거나 해도 다시 실행을 재개할 수 있도록 API가 되어 있습니다.
- WebAssembly 모듈을 코드만으로 생성하거나 한 모듈에 여러 모듈을 링크할 수 있습니다.
- 컴파일 시간에도 기능을 제한할 수 있고(컴파일되는 코드가 줄어듭니다), 실행 시간에도 기능을 제한할 수 있습니다.
- 처음부터 ABI를 고정하는 걸 목표로 하고 설계되었습니다. 자료구조를 C 스택에 할당 가능하지만 미리 레이아웃을 고정시켜 놓아서 버전이 올라가도 ABI가 깨지지 않습니다.
- 여기에 더해 지나치다 싶을 정도로 테스트가 넘쳐 나고 퍼즈 테스팅도 열심히 했습니다. (사실은 fuzzer가 지금도 돌아가고 있습니다...)
원래 다른 프로젝트의 일부가 될 예정이라서 이 정도로 빡세게 만들 생각은 없었는데, WebAssembly 참조 구현의 테스트(spectest라고 합니다)를 돌리려면 결국 전부 다 구현을 해야 해서... 어쩌다 보니까 100% 구현하게 되었습니다. 어쩌다 이렇게 되었을까요.
요즘 추세에 맞춰서 코드는 초기에는 Gemini CLI, 중반 이후로는 Claude Code와 종종 Codex로 작성했고 계획은 Codex를 주로 활용했습니다. 개인적으로는 코딩 에이전트가 하드코어한 시스템 프로그래밍도 스티어링만 잘 하면 꽤 잘 할 수 있다는 걸 증명하는 프로젝트이기도 했네요. 바이브 코딩 하면 뭔가 그럴듯한 게 나오긴 하는데 세부적으로는 엉망이라는 평가의 반례가 되고 싶은 마음도 좀 있었습니다.

3 hours ago
1








English (US) ·