3년 전, Wasm 표준 2.0 버전이 (사실상) 완성되었고, 벡터 명령어, 대용량 메모리 연산, 다중 반환 값, 그리고 간단한 참조 타입과 같은 여러 새로운 기능들이 도입되었습니다.
그동안 Wasm W3C 커뮤니티 그룹과 워킹 그룹은 꾸준히 발전을 이어왔습니다. 오늘, 우리는 Wasm 3.0을 새로운 "라이브" 표준으로 출시하게 되었음을 기쁘게 발표합니다.
이번 업데이트는 상당히 규모가 큽니다. 몇몇 주요 기능들은 6년 또는 8년 동안 개발되어 왔으며, 드디어 완성되어 출시될 수 있게 되었습니다.
- 64비트 주소 공간: 이제 메모리와 테이블을 선언할 때 주소 타입으로 기존의 i32뿐만 아니라 i64를 사용할 수 있습니다. 이로써 Wasm 애플리케이션의 가용 주소 공간이 4GB에서 (이론적으로) 16 엑사바이트(EB)로 확장됩니다. 물론 물리적 하드웨어의 허용 범위 내에서 가능하겠죠. 웹 환경에서는 64비트 메모리가 16GB로 제한되는 등 특정 제약이 계속될 수 있지만, 이러한 새로운 유연성은 Wasm을 활용하는 비(非) 웹 생태계에 특히 흥미롭습니다. 훨씬 더 거대한 애플리케이션과 데이터 세트를 이제 지원할 수 있게 되었기 때문입니다.
- 다중 메모리: 일반적인 인식과는 달리, Wasm 애플리케이션은 항상 여러 메모리 객체, 즉 여러 주소 공간을 동시에 사용할 수 있었습니다. 하지만 이전에는 각 모듈에서 별도로 선언하고 접근해야만 했습니다. 이 제약이 해소되어, 이제 단일 모듈 내에서 여러 메모리를 선언(정의하거나 임포트)하고 직접 접근할 수 있으며, 메모리 간 데이터를 직접 복사하는 것도 가능해졌습니다. 이는 wasm-merge와 같이 다수의 Wasm 모듈을 하나로 병합하여 "정적 링킹"을 수행하는 도구들이 모든 Wasm 모듈에 대해 작동할 수 있도록 길을 열어줍니다. 또한, 보안(개인 데이터 분리), 버퍼링, 계측(instrumentation)과 같은 별도의 주소 공간 활용을 위한 새로운 방식도 가능하게 합니다.
- 가비지 컬렉션: 원시적인 선형 메모리의 기능을 확장하는 것 외에도, Wasm은 가비지 컬렉터(GC)를 통해 Wasm 런타임이 자동으로 관리하는 새로운 (그리고 별개의) 저장 방식에 대한 지원을 추가합니다. Wasm이 저수준 언어라는 본연의 정신을 유지하듯, Wasm GC 또한 저수준으로 설계되었습니다. Wasm을 타깃으로 하는 컴파일러는 런타임 데이터 구조의 메모리 레이아웃을 struct 및 array 타입, 그리고 언 박스드(unboxed) 태그드 정수(tagged integers) 형태로 선언할 수 있으며, 이들의 할당 및 수명 관리는 Wasm이 담당합니다. 하지만 딱 거기까지입니다. 메서드 테이블과 같은 세부 구현 사항을 포함하여, 소스 언어 값에 적합한 표현을 설계하는 것과 같은 모든 다른 작업은 Wasm을 타깃으로 하는 컴파일러의 책임으로 남아 있습니다. 내장된 객체 시스템이나 클로저, 또는 기타 고수준 구조는 없습니다. 이런 기능들은 특정 언어에 치우치기 때문입니다. 대신 Wasm은 그러한 구성 요소를 표현하기 위한 기본적인 빌딩 블록만을 제공하며, 순수하게 메모리 관리 측면에만 집중합니다.
- 타입 레퍼런스: GC 확장은 Wasm 타입 시스템의 상당한 확장을 기반으로 하며, 이제 훨씬 더 풍부한 형태의 참조(references)를 지원합니다. 참조 타입은 이제 참조되는 힙 값의 정확한 형태를 기술할 수 있으므로, 안전성을 보장하기 위해 필요했던 추가적인 런타임 검사를 피할 수 있습니다. 서브타이핑(subtyping) 및 타입 재귀(type recursion)를 포함하는 이 더욱 표현력이 풍부한 타이핑 메커니즘은 함수 참조에도 적용되어, 새로운 call_ref 명령어를 통해 런타임 타입 검사 또는 범위 검증 없이 안전한 간접 함수 호출을 수행할 수 있게 합니다.
- 테일 콜(Tail Calls): 테일 콜은 현재 함수를 즉시 종료하는 함수 호출의 한 형태로, 추가적인 스택 공간을 차지하는 것을 방지합니다. 테일 콜은 사용자에게 보이는 방식(예: 함수형 언어)과 내부 기술(예: 스텁 구현) 모두에서 다양한 언어 구현에 사용되는 중요한 메커니즘입니다. Wasm 테일 콜은 완전히 일반적이며, 정적으로 (함수 인덱스로) 선택되거나 동적으로 (참조 또는 테이블로) 선택된 호출 대상 모두에 대해 작동합니다.
- 예외 처리: 예외는 실행을 로컬 하게 중단하는 방법을 제공하며, 최신 프로그래밍 언어의 일반적인 기능입니다. 이전에는 예외 처리를 Wasm으로 효율적으로 컴파일하는 방법이 없었으며, 기존 컴파일러들은 일반적으로 호스트 언어(예: 자바스크립트)로 이스케이프 하는 복잡한 방식으로 예외를 구현했습니다. 이는 이식성도 효율성도 떨어졌습니다. 따라서 Wasm 3.0은 Wasm 내에서 네이티브 예외 처리를 제공합니다. 예외는 관련 페이로드 데이터를 가진 예외 태그를 선언함으로써 정의됩니다. 예상대로, 예외는 throw될 수 있으며, 태그를 기반으로 주변 핸들러에 의해 선택적으로 catch 될 수 있습니다. 예외 핸들러는 태그/레이블 쌍의 디스패치 목록이나 catch-all 레이블을 포함하여 예외 발생 시 어디로 점프할지 정의하는 새로운 형태의 블록 명령어입니다.
- 완화된 벡터 명령어: Wasm 2.0은 대규모 벡터(SIMD) 명령어 세트를 추가했지만, 하드웨어 차이로 인해 일부 플랫폼에서는 지정된 시맨틱스를 달성하기 위해 추가 작업을 수행해야 했습니다. 최대 성능을 끌어내기 위해 Wasm 3.0은 특정 엣지 케이스에서 구현에 따라 달라지는 동작을 허용하는 "완화된(relaxed)" 형태의 이 명령어들을 도입합니다. 이 동작은 미리 지정된 유효한 선택지 중에서 선택되어야 합니다.
- 확정적 프로파일: 완화된 벡터 명령어는 의미론적으로 모호한 부분이 생깁니다. 이를 보완하고 블록체인이나 재현 가능한 시스템처럼 결정론적 실행이 필요한 환경을 지원하기 위해, Wasm 표준은 비결정론적 결과를 낳을 수 있는 모든 명령어에 대해 결정론적 기본 동작을 명시합니다. 현재 이는 부동 소수점 연산자와 생성된 NaN 값, 그리고 앞서 언급한 완화된 벡터 명령어를 포함합니다. 이 확정적 실행 프로파일을 구현하도록 선택하는 플랫폼들 사이에서 Wasm은 완전히 확정적이고, 재현 가능하며, 이식 가능하게 됩니다.
- 커스텀 어노테이션 구문: 마지막으로, Wasm 텍스트 포맷에 소스 코드 어노테이션을 위한 범용 문법이 추가되었습니다. 바이너리 형식의 커스텀 섹션과 유사하게, 이러한 어노테이션은 Wasm 표준 자체에 의해 어떤 의미도 부여되지 않으며, 구현 시 무시되도록 선택될 수 있습니다. 그러나 이는 커스텀 섹션에 저장된 정보를 사람이 읽고 쓸 수 있는 형태로 표현하는 방법을 제공하며, 구체적인 어노테이션은 하위 표준에서 지정될 수 있습니다.
이러한 핵심 기능들 외에도, JavaScript에 Wasm을 임베딩할 때 JS API의 새로운 확장 기능을 활용할 수 있습니다.
- JS 문자열 빌트인: 자바스크립트 문자열 값은 이미 externref로 Wasm에 전달될 수 있습니다. 이 새로운 기본 라이브러리의 함수들은 Wasm 모듈로 임포트되어 Wasm 내부에서 그러한 외부 문자열 값을 직접 접근하고 조작할 수 있습니다.
이러한 새로운 기능들로 Wasm은 고수준 프로그래밍 언어를 컴파일하는 데 훨씬 적합한 환경이 되었습니다. 이에 힘입어 Java, OCaml, Scala, Kotlin, Scheme, Dart와 같이 Wasm을 타깃으로 하는 다양한 새로운 언어들이 등장했으며, 이들 모두 새로운 GC 기능을 사용합니다.
이 모든 장점들 외에도, Wasm 3.0은 새로운 SpecTec 툴체인으로 제작된 최초의 표준 버전입니다. 우리는 이것이 훨씬 더 신뢰할 수 있는 사양을 만들어낸다고 믿습니다.
Wasm 3.0은 이미 대부분의 주요 웹 브라우저에 탑재되어 있으며, Wasmtime과 같은 독립 실행형 엔진에서도 지원이 완료 단계에 있습니다. Wasm 기능 상태 페이지에서 엔진별 지원 현황을 확인할 수 있습니다.
'Web Frontend Developer' 카테고리의 다른 글
2024년 자바스크립트 트렌드 돌아보기 (4) | 2025.01.31 |
---|---|
패스트캠퍼스 컨퍼런스인 캠프콘을 준비하며 (2) | 2024.03.30 |
Apollo Client와 Relay 비교해보기 (0) | 2024.03.15 |
가상 DOM(Virtual DOM) 과 재조정(Reconciliation) 톺아보기 (2) | 2024.01.25 |
[FE] 도서 <우아한 타입 스크립트 with 리액트> 솔직 리뷰 (2) | 2023.11.25 |