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.