WebAssembly - Định dạng văn bản

WebAssembly có mã ở định dạng nhị phân gọi là WASM. Bạn cũng có thể lấy định dạng văn bản trong WebAssembly và nó được gọi là WAT (WebAssembly văn bản). Là một nhà phát triển, bạn không được phép viết mã trong WebAssembly, thay vào đó, bạn phải biên dịch các ngôn ngữ cấp cao như C, C ++ và Rust sang WebAssembly.

Mã WAT

Hãy để chúng tôi viết mã WAT theo từng bước.

Step 1 - Điểm bắt đầu trong một WAT là khai báo mô-đun.

(module)

Step 2 - Bây giờ chúng ta hãy thêm một số chức năng vào nó dưới dạng hàm.

Hàm được khai báo như hình dưới đây:

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

Hàm bắt đầu bằng từ khóa func, theo sau là các tham số hoặc kết quả.

Tham số / Kết quả

Kết quả là các tham số và giá trị trả về.

Các tham số có thể có kiểu sau được hỗ trợ bởi wasm:

  • i32: số nguyên 32 bit
  • i64: số nguyên 64 bit
  • f32: 32-bit float
  • f64: 64-bit float

Các tham số cho các hàm được viết như dưới đây:

  • (param i32)
  • (tham số i64)
  • (thông số f32)
  • (thông số f64)

Kết quả sẽ được viết như sau:

  • (kết quả i32)
  • (kết quả i64)
  • (kết quả f32)
  • (kết quả f64)

Hàm với các tham số và giá trị trả về sẽ được định nghĩa như sau:

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

Biến cục bộ

Các biến cục bộ là những biến bạn cần trong hàm của mình. Giá trị cục bộ của hàm sẽ được định nghĩa như sau:

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

Cơ quan chức năng

Phần thân hàm là logic được thực hiện. Chương trình cuối cùng sẽ như thế này -

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

Step 3 - Để đọc và thiết lập các tham số và biến cục bộ.

Để đọc các tham số và biến cục bộ, hãy sử dụng get_localset_local chỉ huy.

Example

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

Theo chữ ký hàm,

  • get_local 0 sẽ cung cấp cho param i32

  • get_local 1 sẽ đưa ra thông số tiếp theo param i32

  • get_local 2 sẽ cho local value i32

Thay vì đề cập đến các tham số và địa phương bằng cách sử dụng các giá trị số như 0,1,2, bạn cũng có thể sử dụng tên trước các tham số, đặt trước tên bằng một ký hiệu đô la.

Ví dụ sau đây cho thấy, cách sử dụng tên với các tham số và địa phương.

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 - Lệnh trong phần thân Chức năng và thực thi.

Việc thực thi trong wasm tuân theo chiến lược ngăn xếp. Các lệnh được thực thi được gửi lần lượt trên ngăn xếp. Ví dụ, lệnh get_local $ a sẽ đẩy giá trị, nó đọc trên ngăn xếp.

Hướng dẫn như i32.add điều đó sẽ thêm ý chí bật các phần tử từ ngăn xếp.

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

Hướng dẫn cho i32.add($a+$b). Giá trị cuối cùng của i32.add, sẽ được đẩy lên ngăn xếp và giá trị đó sẽ được gán cho kết quả.

Nếu chữ ký hàm có kết quả được khai báo, thì phải có một giá trị trong ngăn xếp ở cuối quá trình thực thi. Nếu không có tham số kết quả, ngăn xếp phải trống ở cuối.

Vì vậy, mã cuối cùng cùng với phần thân hàm sẽ như sau:

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

Step 5 - Thực hiện cuộc gọi đến chức năng.

Đoạn mã cuối cùng với phần thân hàm như được hiển thị trong bước 4. Bây giờ, để gọi hàm, chúng ta cần xuất nó.

Để xuất hàm, nó có thể được thực hiện với các giá trị chỉ mục như 0,1, nhưng chúng ta cũng có thể đặt tên. Tên sẽ có tiền tố là $ và nó sẽ được thêm vào sau từ khóa func.

Example

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

Hàm $ add phải được xuất, sử dụng từ khóa export như hình dưới đây -

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

Để kiểm tra đoạn mã trên trong trình duyệt, bạn sẽ phải chuyển nó thành dạng nhị phân (.wasm). Tham khảo chương tiếp theo hướng dẫn cách chuyển đổi.WAT to .WASM.