Watgo – Bộ công cụ WebAssugging dành cho Go
Watgo – A WebAssembly Toolkit for Go
Tôi vui mừng thông báo về việc cung cấp rộng rãi watgo - Bộ công cụ WebAssembly dành cho Go. Dự án này tương tự như wabt (C++) hoặc wasm-tools (Rust), nhưng ở dạng Go thuần túy, không phụ thuộc. watgo đi kèm với CLI...
Tôi vui mừng thông báo về tính khả dụng rộng rãi của watgo - WebAhội Toolkit dành cho Go. Dự án này tương tự như wabt (C++) hoặc wasm-tools (Rust), nhưng ở thuần túy, không phụ thuộc.
watgo đi kèm với CLI và API Go để phân tích cú pháp WAT (Văn bản WebAssembly), xác thực nó và mã hóa nó thành các nhị phân WASM; nó cũng hỗ trợ giải mã WASM từ định dạng nhị phân.
Trung tâm của tất cả là wasmir - một ngữ nghĩa đại diện của mô-đun WebAssembly mà người dùng có thể kiểm tra (và thao tác). Sơ đồ này hiển thị các chức năng do watgo cung cấp:

- Phân tích cú pháp: trình phân tích cú pháp từ WAT đến wasmir
- Xác thực: sử dụng ngữ nghĩa xác thực WebAssembly chính thức để kiểm tra xem mô-đun được định dạng tốt và an toàn
- Mã hóa: phát ra wasmir thành biểu diễn nhị phân WASM
- Giải mã: đọc nhị phân WASM biểu diễn bằng wasmir
Trường hợp sử dụng CLI
watgo đi kèm với CLI mà bạn có thể cài đặt bằng cách ra lệnh này:
đi cài đặt github.com/eliben/watgo/cmd/watgo@latest
CLI nhằm mục đích tương thích với các công cụ wasm [1] và tôi đã chuyển đổi mẫu wasm-wat- dự án để sử dụng nó; ví dụ. lệnh phân tích tệp WAT, xác thực và mã hóa nó thành định dạng nhị phân:
watgo phân tích cú pháp stack.wat -o stack.wasm
trường hợp sử dụng API
wasmir về mặt ngữ nghĩa biểu thị một mô-đun WASM có API dễ hoạt động với. Đây là một ví dụ về việc sử dụng watgo để phân tích một WAT đơn giản lập trình và thực hiện một số phân tích:
gói chính nhập ( "fmt" "github.com/eliben/watgo" "github.com/eliben/watgo/wasmir" ) const wasmText = ` (mô-đun (func (xuất "add") (param i32 i32) (kết quả i32) local.get 0 local.get 1 i32.add ) (func (param f32 i32) (kết quả i32) local.get 1 i32.const 1 i32.add thả i32.const 0 ) )` func main() { m, err := watgo.ParseWAT([][[TA G_190]]byte(wasmText)) if err != không { hoảng loạn(err) i32Params := 0 localGets := 0 i32Thêm := 0 // Mô-đun được xác định các hàm mang chỉ mục loại vào m.Types. Hàm // bản thân phần thân là một chuỗi phẳng gồm các wasmir.Các giá trị lệnh. cho _, fn := phạm vi m.Funcs { sig := m.Loại[[[TAG_3 48]]fn.TypeIdx] cho _, thông số := phạm vi sig.Thông số { if param.Loại == wasmir.ValueKindI32 { i32Params++ cho _, instr := phạm vi fn.Cơ thể { chuyển instr.Loại { trường hợp wasmir.InstrLocalGet: localGets++ trường hợp wasmir.InstrI32Add: i32Thêm++ fmt.Printf("các chức năng do mô-đun xác định: %d\n", len(m[[TAG_5 86]].Funcs)) fmt.Printf("i32 thông số: %d\n", i32Params) fmt.Printf("local.get hướng dẫn: %d\n", localGets) fmt.Printf("i32.thêm hướng dẫn: %d\n", i32Thêm)
Một lưu ý quan trọng: định dạng WAT hỗ trợ một số chi tiết về cú pháp bị san phẳng / được chuẩn hóa khi hạ xuống wasmir. Ví dụ, tất cả gấp hướng dẫn được hạ xuống thành các hướng dẫn được mở ra (dạng tuyến tính), loại hàm & tên được phân giải thành chỉ số số, v.v. Điều này phù hợp với việc xác nhận và ngữ nghĩa thực thi của WASM và biểu diễn nhị phân của nó.
Các chi tiết cú pháp này có trong watgo trong gói định dạng văn bản (phân tích WAT thành AST) và bị xóa khi giá trị này được hạ xuống wasmir. Gói định dạng văn bản được giữ nội bộ tại thời điểm này, nhưng trong tương lai tôi có thể cân nhắc việc công khai nó - nếu có sự quan tâm.
Thử nghiệm chiến lược
Mặc dù vẫn còn là những ngày đầu cho watgo nhưng tôi khá tin tưởng vào khả năng của nó tính chính xác nhờ chiến lược kiểm tra rất khắt khe ngay từ đầu.
WebAssugging đi kèm với bộ thử nghiệm chính thức lớn, hoàn hảo cho việc thử nghiệm toàn diện các triển khai mới. Bộ thử nghiệm cốt lõi bao gồm gần 200 nghìn dòng tệp WAT mang một số mô-đun với dự kiến ngữ nghĩa thực thi và nhiều tình huống lỗi khác nhau tập thể dục. Những tệp này nằm trong .tệp rác thải và tận dụng trình thông dịch thông số kỹ thuật tùy chỉnh.
watgo lợi dụng phương pháp này bằng cách sử dụng bộ thử nghiệm chính thức cho riêng mình thử nghiệm. Bộ khai thác tùy chỉnh phân tích các tệp .wast và sử dụng watgo để chuyển đổi WAT trong chúng thành WASM nhị phân, sau đó được thực thi bởi Node.js [2]; dây nịt này là bản thân nó là một nỗ lực đáng kể nhưng nó rất đáng giá - kết quả là bảo hiểm thử nghiệm tuyệt vời. watgo vượt qua toàn bộ bộ kiểm tra cốt lõi thông số WASM.
Tương tự như vậy, chúng tôi tận dụng bộ thử nghiệm interp của wabt bao gồm các thử nghiệm từ đầu đến cuối, sử dụng khai thác dựa trên Nút đơn giản hơn để kiểm tra chúng chống lại watgo.
Cuối cùng, tôi duy trì một bộ sưu tập các mẫu chương trình thực tế được viết bằng WAT trong kho lưu trữ mẫu wasm-wat-samp; những thứ này cũng được watgo sử dụng để kiểm tra chính nó.
| [1] | Mặc dù chưa hỗ trợ tất cả chức năng của wasm-tools. |
| [2] | Để tuân theo cách tiếp cận thuần túy cờ vây cũng như cho thử nghiệm, ban đầu tôi đã thử sử dụng wazero cho việc này nhưng phải từ bỏ vì wazero không hỗ trợ một số đề xuất WASM gần đây đã được đưa vào tiêu chuẩn (đáng chú ý nhất là Thu gom rác). |
Tác giả: ibobev