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_local และ set_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 จะต้องถูกส่งออกโดยใช้คำสำคัญการส่งออกดังที่แสดงด้านล่าง -
(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.