QR 코드에 들어가는 Wasm 인터프리터, 0.006% Wasmtime!

by DD
1개월 전
조회수 8

QR 코드에 담길 정도로 작은 Wasm 인터프리터 구현

x86-64 어셈블리와 링커 스크립트, 압축 기술을 활용하여 코드 크기 최소화

성능보다 코드 사이즈 최적화에 집중, 다양한 트릭 사용

Wasm 3.0 지원 가능성에 대한 커뮤니티의 질문

코드 사이즈 최적화를 위한 다양한 기술

저자는 x86-64 어셈블리(Assembly)를 사용하여 코드 크기를 최소화하고, 링커 스크립트를 통해 불필요한 섹션을 제거했다. 특히, 함수 호출(Function Call) 대신 점프 테이블(Jump Table)을 활용하여 코드 사이즈를 줄이는 방법을 제시했다. 또한, 압축 기술(Compression)을 통해 최종적으로 코드 크기를 40% 줄였다고 언급하며, 코드 사이즈 최적화를 위한 다양한 기술적 시도를 보여준다.

Wasm 인터프리터 구현의 기술적 난관

저자는 Wasm 인터프리터 구현 과정에서 겪는 기술적 난관을 설명한다. Wasm의 다양한 섹션(Type, Import, Function 등)을 파싱하는 데 많은 바이트가 소모되며, 싱글 패스 실행(Single-pass Execution)을 통해 코드 사이즈를 줄이는 방법을 제시한다. 또한, 레지스터(Register)를 활용하여 전역 변수 접근에 따른 오버헤드를 줄이고, Funclet코드 패칭(Code Patching)을 통해 성능을 개선하는 방법을 소개한다.

x86 아키텍처의 활용

저자는 x86 아키텍처의 특징을 활용하여 코드 사이즈를 최적화한다. 특히, 레거시 CISC 명령어(Legacy CISC Instructions)를 활용하여 memcpy, memset, strlen과 같은 함수를 구현하고, 패리티 플래그(Parity Flag)를 활용하여 min/max 연산을 최적화한다. 또한, FPU(Floating-Point Unit)를 활용하여 float-to-int 변환을 효율적으로 처리하는 방법을 제시하며, x86 아키텍처의 다양한 기능을 활용하여 코드 사이즈를 줄이는 전략을 보여준다.

WASI 인터페이스 구현과 시스템 콜

저자는 WASI 인터페이스를 구현하기 위해 필요한 시스템 콜(Syscall) 구현에 대해 설명한다. 특히, fd_read 시스템 콜 구현 과정에서 스트림 읽기/쓰기 명령어(Stream Reading/Writing Instructions)를 활용하여 코드 사이즈를 줄이는 방법을 제시한다. 또한, wasi_iovec 구조체와 iovec 구조체 간의 데이터 변환 과정을 보여주며, 시스템 콜 구현에 대한 기술적 세부 사항을 설명한다.

This Wasm interpreter fits in a QR code