WebAssembly가 뭔가요?

WebAssembly(wasm)는 포괄적인 사양을 가지고 있는 간단한 기계 모델이자 실행 가능한 포맷입니다. 휴대 가능하고, 가벼우며 거의 네이티브 프로그램과 같은 속도로 실행될 수 있도록 설계됐습니다.

프로그래밍 언어로써, WebAssembly는 같은 구조를 나타내는데, 두 가지 다른 포맷으로 구성돼 있습니다.

  1. ("WebAssembly Text" 에서 이름이 유래된) .wat 텍스트 포맷은 S-expressions 구조를 사용하고 Scheme이나 Clojure와 같은 Lisp 계열 언어와 유사점들을 공유합니다.

  2. .wasm 바이너리 포맷은 더 저레벨이면서 WebAssembly 가상 머신에서 바로 사용되도록 의도됐습니다. 개념적으로 ELF 와 Mach-0와 비슷합니다.

참고 자료로, wat 언어로 작성된 팩토리얼 함수를 확인해 보세요.

(module
  (func $fac (param f64) (result f64)
    local.get 0
    f64.const 1
    f64.lt
    if (result f64)
      f64.const 1
    else
      local.get 0
      local.get 0
      f64.const 1
      f64.sub
      call $fac
      f64.mul
    end)
  (export "fac" (func $fac)))

위 예제가 .wasm 파일로는 어떻게 보일지 궁금하다면, wat2wasm 데모 웹사이트를 이용해 보세요.

선형 메모리 (Linear Memory)

WebAssembly 매우 간단한 메모리 모델을 가지고 있고, 한 wasm 모듈은 하나의 "선형 메모리" 에 접근할 수 있습니다.

이 메모리는 페이지 사이즈 (64K)의 곱만큼 커질 수 있으며 이 사이즈는 줄어들 수 없습니다.

웹에서만 WebAssembly를 사용할 수 있나요?

현재로는 JavaScript 웹 커뮤니티에서 주로 주목을 받고 있지만, wasm은 특정 실행 환경을 필요로 하지 않습니다. 그러므로, wasm이 미래에 다양한 맥락에서 사용할 수 있는 "휴대 가능한 실행할 수 있는" 포맷이라고 여겨질수도 있습니다. 하지만 오늘날 현재 시점에서는 wasm은 (웹과 Node.js을 포함한) 다양한 형태로 존재하는 JavaScript (JS)와 함께 주로 언급됩니다.