WebAssembly-텍스트 형식

WebAssembly에는 WASM이라는 바이너리 형식의 코드가 있습니다. WebAssembly에서 텍스트 형식을 가져올 수도 있으며 WAT (WebAssembly Text 형식)라고합니다. 개발자는 WebAssembly에서 코드를 작성해서는 안되며, 대신 C, C ++ 및 Rust와 같은 고급 언어를 WebAssembly로 컴파일해야합니다.

WAT 코드

WAT 코드를 단계적으로 작성해 보겠습니다.

Step 1 − WAT의 시작점은 모듈을 선언하는 것입니다.

(module)

Step 2 − 이제 함수 형태로 몇 가지 기능을 추가해 보겠습니다.

함수는 아래와 같이 선언됩니다.

(func <parameters/result> <local variables> <function body>)

함수는 매개 변수 또는 결과가 뒤에 오는 func 키워드로 시작합니다.

매개 변수 / 결과

결과로서의 매개 변수 및 반환 값.

매개 변수는 wasm에 의해 지원되는 다음 유형을 가질 수 있습니다-

  • i32 : 32 비트 정수
  • i64 : 64 비트 정수
  • f32 : 32 비트 부동 소수점
  • f64 : 64 비트 부동 소수점

함수에 대한 매개 변수는 다음과 같이 작성됩니다.

  • (매개 변수 i32)
  • (매개 변수 i64)
  • (매개 변수 f32)
  • (매개 변수 f64)

결과는 다음과 같이 작성됩니다.

  • (결과 i32)
  • (결과 i64)
  • (결과 f32)
  • (결과 f64)

매개 변수와 반환 값이있는 함수는 다음과 같이 정의됩니다.

(func (param i32) (param i32) (result i64) <function body>)

지역 변수

지역 변수는 함수에 필요한 변수입니다. 함수에 대한 로컬 값은 다음과 같이 정의됩니다.

(func (param i32) (param i32) (local i32) (result i64) <function body>)

기능 본체

함수 본문은 수행 할 논리입니다. 최종 프로그램은 다음과 같습니다.

(module (func (param i32) (param i32) (local i32) (result i64) <function body>) )

Step 3 − 매개 변수 및 지역 변수를 읽고 설정합니다.

매개 변수와 지역 변수를 읽으려면 다음을 사용하십시오. get_localset_local 명령.

Example

(module 
   (func (param i32) (param i32) (local i32) (result i64) get_local 0 
      get_local 1 
      get_local 2 
   ) 
)

함수 서명에 따라

  • get_local 0 줄 것이다 param i32

  • get_local 1 다음 매개 변수를 제공합니다 param i32

  • get_local 2 줄게 local value i32

0,1,2와 같은 숫자 값을 사용하여 매개 변수 및 지역을 참조하는 대신, 이름 앞에 달러 기호를 붙여 매개 변수 앞에 이름을 사용할 수도 있습니다.

다음 예제는 매개 변수 및 지역과 함께 이름을 사용하는 방법을 보여줍니다.

Example

(module 
   (func 
      (param $a i32) 
      (param $b i32) 
      (local $c i32) 
      (result i64) get_local $a get_local $b get_local $c 
   ) 
)

Step 4 − 함수 본문 및 실행 명령.

wasm에서의 실행은 스택 전략을 따릅니다. 실행 된 명령어는 스택에서 하나씩 전송됩니다. 예를 들어, get_local $ a 명령어는 값을 푸시하고 스택에서 읽습니다.

같은 지시 i32.add 그러면 스택에서 요소가 팝업됩니다.

(func (param $a i32) (param $b i32) 
   get_local $a 
   get_local $b 
   i32.add
)

에 대한 지침 i32.add 이다 ($a+$b). i32.add의 최종 값이 스택에 푸시되고 결과에 할당됩니다.

함수 시그니처에 선언 된 결과가있는 경우 실행이 끝날 때 스택에 하나의 값이 있어야합니다. 결과 매개 변수가없는 경우 스택은 끝에 비어 있어야합니다.

따라서 함수 본문과 함께 최종 코드는 다음과 같습니다.

(module 
   (func (param $a i32) (param $b i32) (result i32) 
      get_local $a
      get_local $b 
      i32.add
   )
)

Step 5 − 함수를 호출합니다.

함수 본문이있는 최종 코드는 4 단계에 나와 있습니다. 이제 함수를 호출하려면 함수를 내 보내야합니다.

함수를 내보내려면 0,1과 같은 색인 값으로 수행 할 수 있지만 이름을 지정할 수도 있습니다. 이름 앞에 $가 붙고 func 키워드 뒤에 추가됩니다.

Example

(module 
   (func $add (param $a i32) (param $b i32) (result i32) 
      get_local $a 
      get_local $b i32.add
   ) 
)

$ add 함수는 아래와 같이 export 키워드를 사용하여 내 보내야합니다.

(module 
   (func $add 
      (param $a i32) 
      (param $b i32) 
      (result i32) 
      get_local $a get_local $b i32.add
   ) 
   (export "add" (func $add))
)

브라우저에서 위의 코드를 테스트하려면 바이너리 형식 (.wasm)으로 변환해야합니다. 변환 방법을 보여주는 다음 장을 참조하십시오..WAT to .WASM.