WebAssembly - Cấu trúc chương trình

WebAssembly, còn được gọi là WASM, là mã cấp thấp định dạng nhị phân được phát triển để thực thi bên trong các trình duyệt theo cách hiệu quả nhất. Mã WebAssembly được cấu trúc với các khái niệm sau:

  • Values
  • Types
  • Instructions

Hãy cùng chúng tôi tìm hiểu chi tiết chúng ngay bây giờ.

Giá trị

Giá trị trong WebAssembly có nghĩa là để lưu trữ dữ liệu phức tạp như văn bản, chuỗi và vectơ. WebAssembly hỗ trợ những điều sau:

  • Bytes
  • Integers
  • Dấu chấm động
  • Names

Byte

Byte là dạng giá trị đơn giản nhất được hỗ trợ trong WebAssembly. Giá trị ở định dạng thập lục phân.

For example

Các byte được biểu diễn dưới dạng b , cũng có thể nhận số tự nhiên n, trong đó n <256.

byte ::= 0x00| .... |0xFF

Số nguyên

Trong WebAssembly, các số nguyên được hỗ trợ như dưới đây:

  • i32: số nguyên 32 bit
  • i64: số nguyên 64 bit

Dấu chấm động

Trong WebAssembly, số dấu phẩy động được hỗ trợ như sau:

  • f32: 32-bit dấu chấm động
  • f64: 64-bit dấu phẩy động

Tên

Tên là một chuỗi ký tự, với các giá trị vô hướng được xác định bởi Unicode, có sẵn tại liên kết http://www.unicode.org/versions/Unicode12.1.0/ đưa ra kèm theo đây.

Các loại

Các thực thể trong WebAssembly được phân loại thành các loại. Các loại được hỗ trợ như được nêu bên dưới -

  • Các loại giá trị
  • Các loại kết quả
  • Các loại chức năng
  • Limits
  • Các loại bộ nhớ
  • Các loại bảng
  • Các loại toàn cầu
  • Các loại bên ngoài

Hãy để chúng tôi nghiên cứu chúng từng cái một.

Các loại giá trị

Loại giá trị được hỗ trợ bởi WebAssembly như được đề cập bên dưới:

  • i32: số nguyên 32 bit
  • i64: số nguyên 64 bit
  • f32: 32-bit dấu chấm động
  • f64: 64-bit dấu phẩy động
valtype ::= i32|i64|f32|f64

Các loại kết quả

Các giá trị ghi bên trong dấu ngoặc được thực thi và lưu trữ bên trong các kiểu kết quả. Kiểu kết quả là đầu ra của việc thực thi một khối mã được tạo thành từ các giá trị.

resulttype::=[valtype?]

Các loại chức năng

Một kiểu hàm sẽ nhận vectơ tham số trả về một vectơ kết quả.

functype::=[vec(valtype)]--> [vec(valtype)]

Hạn mức

Giới hạn là phạm vi lưu trữ được liên kết với bộ nhớ và loại bảng.

limits ::= {min u32, max u32}

Các loại bộ nhớ

Các loại bộ nhớ xử lý các bộ nhớ tuyến tính và phạm vi kích thước.

memtype ::= limits

Các loại bảng

Các loại bảng được phân loại theo loại phần tử được gán cho nó.

tabletype ::= limits elemtype
elemtype ::= funcref

Loại bảng phụ thuộc vào giới hạn cho kích thước tối thiểu và tối đa được gán cho nó.

Các loại toàn cầu

Global Type giữ các biến toàn cục có giá trị, có thể thay đổi hoặc giữ nguyên.

globaltype ::= mut valtype
mut ::= const|var

Các loại bên ngoài

Loại bên ngoài liên quan đến nhập khẩu và giá trị bên ngoài.

externtype ::= func functype | table tabletype | mem memtype | global globaltype

Hướng dẫn

Mã WebAssembly là một chuỗi hướng dẫn tuân theo mô hình máy xếp. Vì WebAssembly theo mô hình máy ngăn xếp nên các hướng dẫn được đẩy lên ngăn xếp.

Ví dụ, các giá trị đối số cho một hàm được bật ra từ ngăn xếp và kết quả được đẩy trở lại ngăn xếp. Cuối cùng, sẽ chỉ có một giá trị trong ngăn xếp và đó là kết quả.

Một số Hướng dẫn thường được sử dụng như sau:

  • Hướng dẫn số
  • Hướng dẫn biến

Hướng dẫn số

Hướng dẫn số là các hoạt động được thực hiện trên giá trị số.

For example
nn, mm ::= 32|64
ibinop ::= add|sub|mul|div_sx|rem_sx|and|or|xor
irelop ::= eq | ne | lt_sx | gt_sx | le_sx | ge_sx
frelop ::= eq | ne | lt | gt | le | ge

Hướng dẫn biến

Các hướng dẫn về biến là cách truy cập các biến cục bộ và toàn cục.

For example

Để truy cập các biến cục bộ -

get_local $a
get_local $b

Đến set biến cục bộ -

set_local $a
set_local $b

Đến access biến toàn cục -

get_global $a
get_global $b

Đến set biến toàn cục -

set_global $a
set_global $b