liminfo

WebAssembly Reference

WebAssembly 레퍼런스

25개 결과

WebAssembly Reference 소개

이 WebAssembly 레퍼런스는 기본개념, 모듈, 메모리, 테이블, 타입, WASI의 6개 카테고리로 구성된 Wasm 개발을 위한 체계적이고 검색 가능한 가이드입니다. 기본개념 섹션은 Wasm 모듈 로딩 및 실행을 위한 필수 JavaScript API를 다루며, ArrayBuffer에서 컴파일 및 인스턴스화하는 WebAssembly.instantiate(), 사전 컴파일을 위한 WebAssembly.compile(), 호스트 함수와 메모리를 Wasm에 전달하는 importObject 구성, 사람이 읽을 수 있는 모듈 정의를 위한 WAT(WebAssembly Text Format) 표현을 포함합니다.

이 레퍼런스는 (func)를 사용한 함수 정의, (export)를 사용한 내보내기, (import)를 사용한 가져오기, (global)을 사용한 전역 가변 변수 등 Wasm 모듈 내부를 상세히 설명합니다. 메모리 섹션은 각 페이지가 64KB인 선형 메모리 모델을 설명하며, WebAssembly.Memory 생성, 동적 확장을 위한 memory.grow, memory.buffer를 통한 ArrayBuffer 기반 접근, 다중 타입 읽기/쓰기를 위한 DataView, TextEncoder/TextDecoder를 사용한 JavaScript와 Wasm 간 문자열 전달을 다룹니다.

타입 시스템은 네 가지 값 타입(i32, i64, f32, f64), 메모리 로드/저장 연산(i32.load, i32.store), 타입 변환 명령어(wrap, extend, convert, trunc)를 포함합니다. WASI 섹션은 브라우저 외부에서 Wasm 실행을 위한 WebAssembly System Interface를 소개하며, 파일 디스크립터 I/O를 위한 fd_read/fd_write, 명령줄 인자 접근을 위한 args_get, wasi_snapshot_preview1 임포트 네임스페이스를 다룹니다. 시스템 프로그래머, 성능 엔지니어, C/C++/Rust를 Wasm으로 컴파일하는 개발자에게 유용합니다.

주요 기능

  • JavaScript Wasm API: WebAssembly.instantiate(), compile(), importObject 구성, instance.exports 함수 호출
  • 완전한 모듈 구조를 갖춘 WAT 텍스트 형식 구문: (module), params/results가 있는 (func), (export), (import), (global)
  • 선형 메모리 모델: 페이지 크기 지정 WebAssembly.Memory 생성, memory.grow, ArrayBuffer 뷰, DataView 타입별 접근
  • TextEncoder/TextDecoder와 메모리 오프셋 관리를 사용한 JavaScript와 Wasm 간 문자열 전달
  • 함수 포인터 테이블과 동적 디스패치 패턴을 위한 WebAssembly.Table과 call_indirect
  • 완전한 타입 시스템: i32/i64 정수, f32/f64 부동소수점, 로드/저장 메모리 연산, 타입 변환 명령어
  • WASI 시스템 인터페이스: fd_read/fd_write 파일 I/O, args_get 인자 접근, wasi_snapshot_preview1 임포트 네임스페이스
  • 각 API와 명령어에 대한 실용적 코드 예제와 함께 카테고리별 검색 및 필터링 가능

자주 묻는 질문

WebAssembly.instantiate()와 WebAssembly.compile()의 차이는?

WebAssembly.instantiate()는 한 단계에서 컴파일과 인스턴스 생성을 모두 수행하여 {module, instance} 쌍을 반환합니다. WebAssembly.compile()은 인스턴스화 없이 바이트만 Module 객체로 컴파일하며, 같은 모듈에서 다른 import 객체로 여러 인스턴스를 만들 때 유용합니다. fetch 응답에서 스트리밍 컴파일을 위해서는 다운로드 중에 컴파일하는 더 효율적인 WebAssembly.instantiateStreaming()을 사용하세요.

WebAssembly 선형 메모리는 어떻게 작동하며 왜 64KB 페이지인가요?

Wasm 선형 메모리는 JavaScript와 Wasm 코드 모두가 읽고 쓸 수 있는 연속적이고 확장 가능한 ArrayBuffer입니다. 64KB(65,536바이트) 페이지 단위로 할당됩니다. new WebAssembly.Memory({ initial: 1, maximum: 10 })는 64KB로 시작하여 640KB까지 확장 가능합니다. 페이지 기반 모델은 경계 검사를 단순화하고 결정적 메모리 레이아웃을 제공합니다. JS에서는 memory.buffer를 Uint8Array, Int32Array, DataView로 접근합니다.

JavaScript와 WebAssembly 간에 문자열을 전달하려면?

Wasm에는 네이티브 문자열 타입이 없으므로 선형 메모리에 인코딩해야 합니다. JS에서 Wasm으로: TextEncoder로 UTF-8 바이트로 변환 후 알려진 오프셋의 Wasm 메모리 버퍼에 복사합니다. Wasm에서 읽을 때: Wasm 함수가 포인터(오프셋)와 길이를 반환하면 JS가 memory.buffer의 Uint8Array 슬라이스에 TextDecoder를 사용합니다. 이 수동 메모리 관리는 Emscripten이나 wasm-bindgen 같은 상위 레벨 툴체인이 추상화하는 핵심 Wasm 개념입니다.

WebAssembly의 네 가지 값 타입과 각각의 용도는?

i32(32비트 정수)는 가장 일반적인 타입으로 배열 인덱스, 불리언 값, 범용 정수 연산에 사용됩니다. i64(64비트 정수)는 큰 정수 값과 타임스탬프용입니다. f32(32비트 부동소수점)는 그래픽에서 흔한 단정밀도용이고, f64(64비트 부동소수점)는 과학 계산에 사용되는 배정밀도용입니다. Wasm은 엄격한 타입 시스템이므로 타입 간 이동에 명시적 변환 명령어(i32.wrap_i64, f64.convert_i32_s 등)를 사용해야 합니다.

importObject란 무엇이며 무엇을 전달할 수 있나요?

importObject는 Wasm 모듈의 (import) 선언과 구조가 일치하는 JavaScript 객체입니다. 호스트 제공 함수, Memory 인스턴스, Table 인스턴스, 전역 값을 Wasm에 전달합니다. 예를 들어 모듈이 (import "env" "log" (func (param i32)))를 선언하면 importObject에 { env: { log: (x) => console.log(x) } }가 있어야 합니다. Wasm이 호스트 환경(DOM, 콘솔, 네트워크 등)과 상호작용하는 주요 메커니즘입니다.

WebAssembly.Table이란 무엇이며 call_indirect가 왜 필요한가요?

WebAssembly.Table은 런타임에 간접적으로 호출할 수 있는 함수 참조를 저장합니다. Wasm은 보안상 직접 함수 포인터를 지원하지 않으므로 Table이 안전한 대안을 제공합니다. call_indirect는 테이블을 인덱싱하여 호출을 디스패치하며, 가상 메서드 테이블, 콜백, 동적 디스패치 같은 패턴을 가능하게 합니다. 테이블은 funcref 타입이며 런타임에 경계 검사되어 범위 밖 함수 호출을 방지합니다.

WASI란 무엇이며 브라우저 WebAssembly API와 어떻게 다른가요?

WASI(WebAssembly System Interface)는 Wasm 모듈에 파일 시스템, 환경 변수, 시계, 난수 생성기 같은 운영체제 리소스 접근을 제공하는 표준화된 API입니다. 브라우저 Wasm API가 샌드박스된 웹 컨텍스트에서 실행되는 반면, WASI는 Wasmtime이나 Wasmer 같은 런타임을 사용하여 브라우저 외부에서 Wasm을 실행할 수 있게 합니다. 능력 기반 보안 모델을 따라 모듈은 명시적으로 부여된 리소스만 접근할 수 있습니다.

WebAssembly로 컴파일할 수 있는 언어와 사용되는 툴체인은?

C와 C++는 완전한 POSIX 유사 환경을 제공하는 Emscripten(emcc)을 사용합니다. Rust는 원활한 JS 상호운용을 위해 wasm-pack과 wasm-bindgen을 사용합니다. Go는 GOOS=js GOARCH=wasm으로 내장 Wasm 지원을 합니다. AssemblyScript는 Wasm을 위해 특별히 설계된 TypeScript 유사 언어입니다. Zig, Swift, Kotlin/Native, Blazor를 통한 C# 등도 Wasm 타겟을 가지고 있습니다. 이 레퍼런스의 WAT 텍스트 형식은 저수준 제어와 교육 목적으로도 직접 작성할 수 있습니다.