WebAssembly - โครงสร้างโปรแกรม

WebAssembly หรือที่เรียกว่า WASM เป็นรูปแบบไบนารีโค้ดระดับต่ำที่พัฒนาขึ้นเพื่อเรียกใช้งานภายในเบราว์เซอร์ด้วยวิธีที่มีประสิทธิภาพสูงสุด รหัส WebAssembly มีโครงสร้างตามแนวคิดต่อไปนี้ -

  • Values
  • Types
  • Instructions

ให้เราเรียนรู้โดยละเอียดตอนนี้

ค่า

ค่าใน WebAssembly มีขึ้นเพื่อจัดเก็บข้อมูลที่ซับซ้อนเช่นข้อความสตริงและเวกเตอร์ WebAssembly รองรับสิ่งต่อไปนี้ -

  • Bytes
  • Integers
  • จุดลอยตัว
  • Names

ไบต์

ไบต์เป็นรูปแบบที่ง่ายที่สุดของค่าที่รองรับใน WebAssembly ค่าอยู่ในรูปแบบเลขฐานสิบหก

For example

ไบต์แสดงเป็นbสามารถรับจำนวนธรรมชาติ n โดยที่ n <256

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

จำนวนเต็ม

ใน WebAssembly จำนวนเต็มที่รองรับมีดังต่อไปนี้ -

  • i32: จำนวนเต็ม 32 บิต
  • i64: จำนวนเต็ม 64 บิต

จุดลอยน้ำ

ใน WebAssembly หมายเลขลอยตัวที่รองรับมีดังต่อไปนี้ -

  • f32: จุดลอยตัว 32 บิต
  • f64: จุดลอยตัว 64 บิต

ชื่อ

ชื่อเป็นลำดับของอักขระโดยมีค่าสเกลาร์ที่กำหนดโดย Unicode ซึ่งมีอยู่ที่ลิงก์ http://www.unicode.org/versions/Unicode12.1.0/ ให้ไว้ ณ ที่นี้

ประเภท

เอนทิตีใน WebAssembly ถูกจัดประเภทเป็นประเภท ประเภทที่รองรับมีดังที่ระบุไว้ด้านล่าง -

  • ประเภทมูลค่า
  • ประเภทผลลัพธ์
  • ประเภทฟังก์ชัน
  • Limits
  • ประเภทหน่วยความจำ
  • ประเภทตาราง
  • ประเภททั่วโลก
  • ประเภทภายนอก

ให้เราศึกษาทีละคน

ประเภทมูลค่า

ประเภทค่าที่ WebAssembly รองรับมีดังต่อไปนี้ -

  • i32: จำนวนเต็ม 32 บิต
  • i64: จำนวนเต็ม 64 บิต
  • f32: จุดลอยตัว 32 บิต
  • f64: จุดลอยตัว 64 บิต
valtype ::= i32|i64|f32|f64

ประเภทผลลัพธ์

ค่าที่เขียนไว้ในวงเล็บจะถูกเรียกใช้และเก็บไว้ในประเภทผลลัพธ์ ประเภทผลลัพธ์คือผลลัพธ์ของการเรียกใช้บล็อกโค้ดที่ประกอบด้วยค่า

resulttype::=[valtype?]

ประเภทฟังก์ชัน

ประเภทฟังก์ชันจะใช้เวกเตอร์ของพารามิเตอร์ส่งกลับเวกเตอร์ของผลลัพธ์

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

ขีด จำกัด

ขีด จำกัด คือช่วงการจัดเก็บที่เชื่อมโยงกับหน่วยความจำและประเภทตาราง

limits ::= {min u32, max u32}

ประเภทหน่วยความจำ

ประเภทหน่วยความจำจัดการกับความทรงจำเชิงเส้นและช่วงขนาด

memtype ::= limits

ประเภทตาราง

ประเภทตารางแบ่งตามประเภทองค์ประกอบที่กำหนดให้

tabletype ::= limits elemtype
elemtype ::= funcref

ประเภทตารางขึ้นอยู่กับขีด จำกัด ของขนาดต่ำสุดและสูงสุดที่กำหนดให้

ประเภททั่วโลก

Global Type เก็บตัวแปรส่วนกลางที่มีค่าซึ่งสามารถเปลี่ยนแปลงหรือคงเดิมได้

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

ประเภทภายนอก

ประเภทภายนอกเกี่ยวข้องกับการนำเข้าและค่าภายนอก

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

คำแนะนำ

รหัส WebAssembly คือลำดับของคำสั่งที่เป็นไปตามรูปแบบเครื่องสแต็ก เนื่องจาก WebAssembly เป็นไปตามรุ่นของเครื่องสแต็กคำแนะนำจะถูกผลักลงบนสแต็ก

ตัวอย่างเช่นค่าอาร์กิวเมนต์สำหรับฟังก์ชันถูกดึงออกมาจากสแต็กและผลลัพธ์จะถูกผลักกลับไปที่สแต็ก ในท้ายที่สุดจะมีเพียงค่าเดียวในสแตกและนั่นคือผลลัพธ์

คำแนะนำที่ใช้กันทั่วไปมีดังนี้ -

  • คำแนะนำเกี่ยวกับตัวเลข
  • คำแนะนำตัวแปร

คำแนะนำเกี่ยวกับตัวเลข

คำสั่งตัวเลขคือการดำเนินการซึ่งดำเนินการกับค่าตัวเลข

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

คำแนะนำตัวแปร

คำแนะนำตัวแปรเกี่ยวกับการเข้าถึงตัวแปรภายในและทั่วโลก

For example

ในการเข้าถึงตัวแปรท้องถิ่น -

get_local $a
get_local $b

ถึง set ตัวแปรท้องถิ่น -

set_local $a
set_local $b

ถึง access ตัวแปรทั่วโลก -

get_global $a
get_global $b

ถึง set ตัวแปรทั่วโลก -

set_global $a
set_global $b