Node.js/Node.js 공식문서

WebAssembly 와 Node.js

코딩크리처 2024. 9. 20. 01:26

제목 : WebAssembly 와 Node.js


WebAssembly 는 높은 성능을 가진 어셈블리와 비슷한 언어이며,

C, C++, Rust, AssemblyScript 를 포함하는 다양한 언어들로부터 컴파일 될 수 있습니다.

현재, 이는 크롬, 파이어폭스, 사파리, 엣지, 그리고 Node.js 에서 지원되고 있습니다.

 

실제 적용된 WebAssembly 와 Node.js 환경은 여기서 볼 수 있습니다.

https://codecreature.tistory.com/202

 

WebAssembly 와 Node.js

제목 : 웹 어셈블리와 Node.jsNode.js 에서 싱글스레드 기반으로 운용되는 Node.js 환경을 멀티스레딩 환경으로 만들어,CPU 집약 비즈니스를 나눌 수 있는 방식을 탐색 했다.이후, 더 최적화 할 수 있는

codecreature.tistory.com

 

 

웹어셈블리(WebAssembly) 의 세부 사양은 두 가지 파일 형태이며,

.wasm 확장자를 가진 웹 어셈블리 모듈로 불리는 이진 형태,

그리고 .wat 확장자를 가진 텍스트 형식의 웹 어셈블리로 불리는 텍스트 표현 형식 이 있습니다.

 

핵심 개념

  • Module - 이진 웹어셈블리로 컴파일되는데, 즉, .wasm 파일입니다.
  • Memory - 재조정 가능한 ArrayBuffer 입니다.
  • Table - 크기 조정 가능한 참조 배열이며, Memory 에 저장되지는 않습니다. - Cache?
  • Instance - 이것의 Memory, Table, 변수들을 가진 모듈을 인스턴스화합니다.

무슨 얘기인가 했더니, 앞으로 나올 이러한 단어들은 위의 단어를 의미하며,

웹어셈블리 모듈을 JS 로 불러 올 시, Memory, Table, Variables 를 불러온다는 의미이다.

 

WebAssembly 를 사용하기 위해서, 당신은 .wasm 이진 파일이 필요하며,

웹어셈블리와 소통하기 위한 API 들을 설정해야 합니다.

Node.js 는, 전역 객체인 WebAssembly 를 통해서 중요한 API 들을 제공합니다.

 

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

 

WebAssembly 모듈을 생성하기

웹어셈블리 이진 파일들을 생성할 수 있는 여러개의 방법론이 있습니다 :

  • 손으로 직접 WebAssembly(.wat) 를 작성하고, 이를 이진 형식으로 변환하려면, wabt 와 같은 도구를 사용하세요
  • emscripten 로 C / C++ 어플리케이션을 사용할 수 있습니다.
  • wasm-pack 로 Rust 어플리케이션을 사용할 수 있습니다.
  • AssemblyScript 로 Typescript 처럼 사용할 수 있습니다.

 

이러한 도구들 중 몇몇은 이진 파일을 생성할 뿐만 아니라, JS "glue" 코드를 생성하며,

알맞는 HTML 파일로 브라우저에서 실행할 수 있습니다.

 

어떻게 사용하나요

한 번 WebAssembly** 모듈을 가지고 나면,

Node.js 의WebAssembly 객체를 사용하여 인스턴스화 할 수 있습니다.

// add.wasm 파일이란 것이 존재하고, 2 개의 인자를 더하는 단 하나의 function을 담고 있다고 가정합니다.
const fs = require("node:fs");

const wasmBuffer = fs.readFileSync("/path/to/add.wasm");
WebAssembly.instantiate(wasmBuffer).then(wasmModule => {
    // 송출된 function - add 는 instance.exports 밑에 살아있습니다.
    const {add} = wasmModule.instance.exports;
    const sum = add(4, 5);
    console.log(sum); // 결과 : 9
})

 

운영체제와 상호작용하기

웹어셈블리 모듈은 고유의 OS 기능과 직접적으로 제어할 수 없습니다.

써드 파티 도구인 Wasmtime 가 해당 운영체제 기능에 접근하는 데 사용 될 수 있습니다.

Wasmtime 도구는 WASI API 를 운영체제 기능에 접근하는 데 사용합니다.