언어 독립적 도구
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로 생성하는 방법입니다.
-
Wasm 모듈과 컴포넌트를 저수준에서 조작하기 위한 도구인
wasm-tools를 설치하십시오. -
add함수는 다음 월드 안에 정의되어 있습니다. 다음과 같은 내용으로adder.wit라는 파일을 생성하십시오:
package docs:adder@0.1.0;
interface add {
add: func(x: u32, y: u32) -> u32;
}
world adder {
export add;
}
- 두 매개변수를 더하는
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))
)
-
wasm-tools를 사용하여 컴포넌트 메타데이터가 내장된 바이너리 코어 모듈을 생성하십시오:wasm-tools component embed adder.wit add.wat -o add.wasm -
방금 만든 바이너리 코어 모듈로부터 새 컴포넌트
.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 런타임에서도 이 컴포넌트를 실행할 수 있습니다.