Wasm 3.0 완료됨 | WebAssembly


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 코드와의 호환성 유지

1개의 좋아요