2GB 제한 극복: WebAssembly에서 대용량 파일의 비동기 I/O

2025-03-04
2GB 제한 극복: WebAssembly에서 대용량 파일의 비동기 I/O

저자는 이전에 WebAssembly에서 setjmp를 구현하여 WASI libc의 예외 처리 제안에 대한 의존성을 우회했습니다. 하지만 이 방법은 2GB 미만의 파일로 제한되었습니다. 이 글에서는 File API와 Blob 유형을 사용하여 더 큰 파일을 처리하기 위한 메모리 기반 파일 시스템을 만드는 방법을 설명합니다. 웹 I/O는 비동기식인 반면 시스템 언어는 일반적으로 동기식이므로 Asyncify를 사용하여 패러다임을 연결했습니다. wasm-opt 최적화 문제가 발생했지만 더미 wasm-opt를 만들어 해결했습니다. 마지막으로, volatile 함수 포인터를 영리하게 사용하여 `asyncjmp_rt_start` 함수에 대한 Asyncify의 잘못된 가정을 우회하여 대용량 파일의 비동기 처리를 달성했습니다.

더 보기
개발

Perl을 WebAssembly로 컴파일하기: 험난한 여정

2025-02-11
Perl을 WebAssembly로 컴파일하기: 험난한 여정

새로운 스타트업을 구축하는 과정에서 저자는 클라이언트 측에서 파일 메타데이터를 추출하는 문제에 직면했습니다. ExifTool은 강력한 도구이지만, Perl 기반이기 때문에 다양한 운영 체제에서 정적 컴파일 및 배포가 어려웠습니다. 정적 컴파일을 포함한 다양한 접근 방식을 시도한 결과, 최종적으로 WebAssembly를 사용하기로 결정했습니다. 이 과정은 Perl의 빌드 시스템, Emscripten, WASI와의 씨름, Perl 소스 코드 수정 등 많은 어려움으로 가득 차 있었습니다. 최종적으로 저자는 ExifTool을 실행할 수 있는 자체 포함형 WebAssembly 버전의 Perl을 구축하는 데 성공했지만, 이 과정에서 WebAssembly 런타임의 예외 처리 지원 부족이 드러났습니다.

더 보기
개발

WebAssembly 런타임 제한 돌파: ZeroPerl의 비동기 구현

2025-02-11
WebAssembly 런타임 제한 돌파: ZeroPerl의 비동기 구현

대부분의 WebAssembly 런타임에서 exnref 지원이 부족하여 ZeroPerl을 사용할 수 없었던 저자는 불평하는 대신 문제를 해결하기로 했습니다. Binaryen의 Asyncify 기능을 활용하여 setjmp의 대체물을 처음부터 구현하여 libsetjmp의 호환성 문제를 우회했습니다. 공식 라이브러리를 제거하고 어셈블리 코드를 작성하고 wasm-opt로 최적화한 후 ZeroPerl은 Wasmer, Wasmtime 및 기타 WebAssembly 런타임에서 성공적으로 실행됩니다. 이 돌파구는 완전히 샌드박스화되고 자체적으로 포함된 Perl WebAssembly 모듈을 제공합니다.

더 보기
개발