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 examplenn, 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