WebAssembly 3.0 릴리스
개요
WebAssembly 3.0이 2025년 9월 17일에 공식 릴리스되었습니다. 이는 WebAssembly 2.0이 완성된 지 3년 만의 대규모 업데이트로, 수년간 개발된 여러 주요 기능들이 포함되었습니다.
주요 변화점
-
6-8년간 개발된 대형 기능들의 완성
-
상당히 큰 규모의 업데이트
-
새로운 “live” 표준으로 지정
주요 신기능 상세 분석
1. 64비트 주소 공간 (Memory64)
핵심 변화
-
메모리와 테이블이 i64 주소 타입 사용 가능
-
이전: i32만 사용 가능
-
현재: i32 또는 i64 선택 가능
성능 향상
-
주소 공간 확장: 4GB → 16 엑사바이트(이론적)
-
웹 환경 제한: 64비트 메모리는 16GB로 제한
-
비웹 환경: 훨씬 더 큰 애플리케이션과 데이터셋 지원
브라우저 지원 현황
-
Chrome: 133, Firefox: 134, Safari: 24.0
-
Node.js: 2.2, Deno: Flag 지원
2. 다중 메모리 (Multiple Memories)
기존 한계와 해결책
-
기존: 여러 메모리 객체 사용 시 별도 모듈에서만 선언/접근 가능
-
개선: 단일 모듈에서 여러 메모리 직접 선언 및 접근 가능
실용적 이점
-
메모리 간 직접 데이터 복사 지원
-
wasm-merge 같은 정적 링킹 도구의 완전한 작동
-
새로운 주소 공간 활용 방안:
-
보안 (개인 데이터 분리)
-
버퍼링
-
계측(instrumentation)
브라우저 지원 현황
-
Chrome: 120, Firefox: 125, Safari: 22.0
-
Node.js: 1.38, Wasmtime: 15
3. 가비지 컬렉션 (Garbage Collection)
혁신적 메모리 관리
-
자동 메모리 관리를 위한 새로운 저장소 형태 추가
-
기존 선형 메모리와 분리된 별도 시스템
저수준 접근 방식
-
Wasm의 저수준 언어 철학 유지
-
컴파일러가 런타임 데이터 구조의 메모리 레이아웃 선언:
-
struct 타입
-
array 타입
-
unboxed tagged integers
설계 원칙
-
언어별 편향 방지: 내장 객체 시스템, 클로저 등 고수준 구조 미포함
-
기본 빌딩 블록만 제공: 메모리 관리 측면에만 집중
-
컴파일러 책임: 소스 언어 값 표현, 메서드 테이블 등 구현 세부사항
브라우저 지원 현황
-
Chrome: 119, Firefox: 120, Safari: 18.2
-
Node.js: 22.0, Deno: 1.38
4. 타입화된 참조 (Typed References)
타입 시스템 대폭 확장
-
참조 타입이 힙 값의 정확한 형태 기술 가능
-
런타임 타입 검사 제거: 안전성 보장을 위한 추가 검사 불필요
고급 타입 기능
-
서브타이핑(subtyping) 지원
-
타입 재귀(type recursion) 지원
-
함수 참조에도 적용
성능 최적화
- 새로운 call_ref 명령어를 통한 런타임 타입/경계 검사 없는 안전한 간접 함수 호출
브라우저 지원 현황
-
Chrome: 119, Firefox: 120, Safari: 18
-
Node.js: 22.0, Deno: 1.38, GraalWasm: 1.4.0
5. 꼬리 호출 (Tail Calls)
메모리 효율적 함수 호출
-
현재 함수를 즉시 종료하는 함수 호출 변형
-
추가 스택 공간 사용 방지
다양한 활용 분야
-
사용자 가시적 용도: 함수형 언어에서 활용
-
내부 기술: 스텁(stub) 구현 등
완전한 범용성
-
정적 선택: 함수 인덱스로
-
동적 선택: 참조 또는 테이블로
브라우저 지원 현황
-
Chrome: 112, Firefox: 121, Safari: 18.2
-
Node.js: 20.0, Deno: 1.32, GraalWasm: 1.0.0
6. 예외 처리 (Exception Handling)
기존 문제점과 해결
-
기존: 비효율적인 호스트 언어(예: JavaScript) 우회 방식
-
해결: Wasm 내 네이티브 예외 처리 제공
예외 시스템 구조
-
예외 태그 선언: 관련 페이로드 데이터와 함께
-
예외 던지기와 선택적 포착: 태그 기반
-
새로운 블록 명령어 형태: 예외 핸들러
디스패치 시스템
-
태그/라벨 쌍의 디스패치 목록
-
catch-all 라벨: 모든 예외 포착
브라우저 지원 현황
-
Chrome: 137, Firefox: 131, Safari: 18.4
-
Deno: 2.3.2, GraalWasm: 1.5.0
7. 완화된 벡터 명령어 (Relaxed Vector Instructions)
성능 최적화를 위한 유연성
-
Wasm 2.0의 벡터(SIMD) 명령어 기반
-
하드웨어 차이로 인한 추가 작업 부담 해결
구현 종속적 동작 허용
-
특정 엣지 케이스에서 구현별 동작 허용
-
사전 지정된 합법적 선택지 세트에서 선택
브라우저 지원 현황
-
Chrome: 114, Node.js: 21.0, Deno: 1.33
-
Wasmtime: 15
8. 결정론적 프로필 (Deterministic Profile)
완화된 명령어의 보완책
-
완화된 벡터 명령어의 의미적 모호성 보완
-
결정론적 실행이 필요한 환경 지원:
-
블록체인
-
재생 가능한 시스템
결정론적 동작 보장
-
비결정론적 결과를 가진 모든 명령어에 대한 기본 동작 지정
-
부동소수점 연산자와 NaN 값
-
완화된 벡터 명령어
플랫폼 간 일관성
- 완전히 결정론적, 재현 가능, 이식 가능한 Wasm 실행
9. 사용자 정의 주석 구문 (Custom Annotation Syntax)
텍스트 형식 개선
-
Wasm 소스 코드에 주석 배치를 위한 범용 구문
-
바이너리 형식의 사용자 정의 섹션과 유사
표준의 유연성
-
Wasm 표준 자체는 의미 할당하지 않음
-
구현체가 무시할 수 있음
-
사람이 읽고 쓸 수 있는 형태로 정보 표현
JavaScript API 확장
JS 문자열 내장 함수 (JS String Builtins)
기능 개요
-
JavaScript 문자열 값을 externref로 Wasm에 전달 가능
-
새로운 원시 라이브러리 함수를 Wasm 모듈로 가져오기
-
Wasm 내에서 외부 문자열 값 직접 접근 및 조작
브라우저 지원 현황
- Chrome: 130, Firefox: 134, Node.js: 2.1
언어 지원 확대
새로운 대상 언어들
GC 기능을 활용하여 다양한 고수준 프로그래밍 언어가 Wasm을 대상으로 하기 시작:
-
Java
-
OCaml
-
Scala
-
Kotlin
-
Scheme
-
Dart
기술적 개선사항
SpecTec 도구 체인
-
Wasm 3.0은 새로운 SpecTec 도구 체인으로 제작된 첫 번째 버전
-
더욱 신뢰할 수 있는 명세서 제작
지원 현황 및 배포
브라우저 지원
-
대부분의 주요 웹 브라우저에서 이미 제공
-
Wasmtime 등 독립 실행형 엔진에서도 완성 단계
기능 추적
- Wasm 기능 상태 페이지에서 엔진별 지원 현황 추적 가능
실용적 고려사항
웹 환경 제한사항
-
64비트 메모리는 16GB로 제한
-
브라우저별 기능 지원 상태 확인 필요
비웹 환경의 이점
-
훨씬 더 큰 애플리케이션과 데이터셋 처리 가능
-
네이티브 성능에 가까운 실행 환경
개발자 고려사항
-
각 기능의 브라우저 지원 상태 사전 확인
-
대상 환경에 따른 기능 선택적 사용
-
기존 Wasm 2.0 코드와의 호환성 유지