Skip to content

Node.js와 WebAssembly

WebAssembly는 C/C++, Rust, AssemblyScript를 포함한 다양한 언어에서 컴파일할 수 있는 고성능 어셈블리 유사 언어입니다. 현재 Chrome, Firefox, Safari, Edge 및 Node.js에서 지원됩니다!

WebAssembly 사양은 .wasm 확장자를 가진 WebAssembly 모듈이라는 이진 형식과 .wat 확장자를 가진 WebAssembly Text 형식이라는 해당 텍스트 표현의 두 가지 파일 형식을 자세히 설명합니다.

핵심 개념

  • 모듈 - 컴파일된 WebAssembly 이진 파일, 즉 .wasm 파일입니다.
  • 메모리 - 크기 조정이 가능한 ArrayBuffer입니다.
  • 테이블 - 메모리에 저장되지 않은 크기 조정이 가능한 참조 유형 배열입니다.
  • 인스턴스 - 메모리, 테이블 및 변수를 포함하는 모듈의 인스턴스화입니다.

WebAssembly를 사용하려면 .wasm 이진 파일과 WebAssembly와 통신하기 위한 API 세트가 필요합니다. Node.js는 전역 WebAssembly 객체를 통해 필요한 API를 제공합니다.

javascript
console.log(WebAssembly)
/*
Object [WebAssembly] {
  compile: [Function: compile],
  validate: [Function: validate],
  instantiate: [Function: instantiate]
}
*/

WebAssembly 모듈 생성

다음과 같은 WebAssembly 이진 파일을 생성하는 데 사용할 수 있는 여러 가지 방법이 있습니다.

  • WebAssembly(.wat)를 직접 작성하고 wabt와 같은 도구를 사용하여 이진 형식으로 변환합니다.
  • C/C++ 응용 프로그램과 함께 emscripten을 사용합니다.
  • Rust 응용 프로그램과 함께 wasm-pack을 사용합니다.
  • TypeScript와 유사한 경험을 선호하는 경우 AssemblyScript를 사용합니다.

TIP

이러한 도구 중 일부는 이진 파일뿐만 아니라 브라우저에서 실행할 JavaScript "접착" 코드와 해당 HTML 파일도 생성합니다.

사용 방법

WebAssembly 모듈이 있으면 Node.js WebAssembly 객체를 사용하여 인스턴스화할 수 있습니다.

javascript
const fs = require('node:fs')
const wasmBuffer = fs.readFileSync('/path/to/add.wasm')
WebAssembly.instantiate(wasmBuffer).then(wasmModule => {
  // 내보낸 함수는 instance.exports 아래에 있습니다.
  const { add } = wasmModule.instance.exports
  const sum = add(5, 6)
  console.log(sum) // 출력: 11
})

OS와 상호 작용

WebAssembly 모듈은 자체적으로 OS 기능에 직접 액세스할 수 없습니다. 타사 도구인 Wasmtime을 사용하여 이 기능에 액세스할 수 있습니다. Wasmtime은 OS 기능에 액세스하기 위해 WASI API를 활용합니다.

참고 자료