Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

언어 독립적 도구

wasm-tools는 WebAssembly 모듈과 컴포넌트를 다루기 위한 일련의 하위 명령을 제공합니다.

WAT (WebAssembly 텍스트 형식)

WAT(WebAssembly 텍스트 형식)는 wasm-tools 및 기타 도구를 사용하여 WebAssembly 바이너리 형식으로 컴파일할 수 있는 텍스트 기반 언어입니다. 테스트와 실험을 위한 작은 예제를 작성할 때 유용합니다.

다음은 WAT로 표현한 모듈의 예입니다:

(module
   (func $add (param $lhs i32) (param $rhs i32) (result i32)
       local.get $lhs
       local.get $rhs
       i32.add)
   (export "docs:adder/add@0.1.0#add" (func $add))
)

이 모듈에는 함수와 익스포트라는 두 개의 최상위 선언이 있습니다.

이 함수 선언은 $lhs와 $rhs라는 두 개의 인수를 받는 $add라는 이름의 함수를 선언합니다. (WAT에서 변수 이름은 항상 $로 시작합니다.) 인수 타입과 결과 타입은 명시적으로 지정해야 합니다. 이 경우 두 인수와 결과의 타입은 모두 i32(32비트 정수)입니다. 함수 본문은 WebAssembly 명령어의 목록입니다. 두 개의 local.get 명령어는 $lhs와 $rhs의 값을 스택에 푸시합니다. i32.add 명령어는 스택 맨 위의 두 값을 팝하여 더한 다음, 그 결과를 스택에 남깁니다.

export 선언은 방금 선언한 함수를 외부에서 호출할 때 사용할 이름에 연결합니다. 이 WAT 코드를 사용하여 WIT 파일에 지정된 인터페이스를 구현하려 하므로, 외부 이름은 특정 규칙을 따라야 합니다. "docs:adder/add@0.1.0#add"라는 이름은 다음과 같이 나누어 볼 수 있습니다:

  • docs는 패키지 이름입니다.
  • adder는 docs 패키지 안에 있는 월드의 이름입니다.
  • add는 해당 월드에 정의된 인터페이스의 이름입니다.
  • 0.1.0은 버전 번호입니다.
  • 이와 별개로, add는 add 인터페이스에 정의된 함수의 이름입니다. 이 모든 요소는 사용 중인 특정 .wit 파일에서 비롯됩니다(아래 참조).

WAT로 할 수 있는 일은 이보다 훨씬 많습니다. 자세한 내용은 Mozilla Developer Network의 WAT 상세 가이드를 참조하십시오.

wat2wasm 도구는 WAT를 바이너리 .wasm 형식으로 변환하지만, 컴포넌트를 생성하지는 않습니다.

wasm-tools를 사용하여 WAT로 컴포넌트 빌드하기

wasm-tools를 사용하면 WAT로 컴포넌트를 생성할 수 있습니다. 다음은 adder 월드를 구현하고 단순히 두 수를 더하는 컴포넌트를 WAT로 생성하는 방법입니다.

  1. Wasm 모듈과 컴포넌트를 저수준에서 조작하기 위한 도구인 wasm-tools를 설치하십시오.

  2. add 함수는 다음 월드 안에 정의되어 있습니다. 다음과 같은 내용으로 adder.wit라는 파일을 생성하십시오:

package docs:adder@0.1.0;

interface add {
  add: func(x: u32, y: u32) -> u32;
}

world adder {
  export add;
}
  1. 두 매개변수를 더하는 add 함수를 익스포트하는 add 코어 모듈을 WAT로 정의하십시오. 다음과 같은 내용으로 add.wat라는 파일을 생성하십시오(WAT 섹션의 예제와 동일합니다):
(module
   (func $add (param $lhs i32) (param $rhs i32) (result i32)
       local.get $lhs
       local.get $rhs
       i32.add)
   (export "docs:adder/add@0.1.0#add" (func $add))
)
  1. wasm-tools를 사용하여 컴포넌트 메타데이터가 내장된 바이너리 코어 모듈을 생성하십시오:

    wasm-tools component embed adder.wit add.wat -o add.wasm
    
  2. 방금 만든 바이너리 코어 모듈로부터 새 컴포넌트 .wasm 파일을 생성하려면 wasm-tools를 사용하십시오:

    wasm-tools component new add.wasm -o add.component.wasm
    

    .component.wasm 접미사는 관례일 뿐입니다. 출력 파일 이름을 add_component.wasm으로 지정하거나 .wasm 접미사가 붙은 다른 이름으로 지정할 수도 있습니다.

Wasmtime으로 컴포넌트 실행하기

컴포넌트의 익스포트 중 하나를 호출하여 컴포넌트를 “실행“할 수 있습니다. 호스트와 런타임은 특정 익스포트가 있는 컴포넌트의 실행만 지원하는 경우가 많습니다.

wasmtime CLI를 사용하면 방금 빌드한 컴포넌트의 add 함수에 인수를 전달하여 실행할 수 있습니다:

wasmtime run --invoke 'add(1, 2)' add.component.wasm

출력은 3입니다. 괄호 안의 인수를 변경하여 add()에 다른 인수를 전달해 볼 수 있습니다.

이 예제는 wasmtime 34.0.1에서 테스트되었습니다. 이전 버전의 wasmtime은 --invoke 옵션을 지원하지 않을 수 있습니다. 컴포넌트를 지원하고 표준을 준수하는 다른 WebAssembly 런타임에서도 이 컴포넌트를 실행할 수 있습니다.


원문 © 2023 The Bytecode Alliance Contributors · WebAssembly Components Documentation · CC BY 4.0
Yeokja 한국어 번역·편집 · Anthropic 사의 claude-sonnet-5 모델을 활용하여 번역되었으며 학습을 모두 비허용한 상태로 작업하였습니다 · 이 번역은 원문을 수정한 문서이며 CC BY 4.0으로 제공합니다.