WebAssembly - Program Yapısı
WASM olarak da adlandırılan WebAssembly, tarayıcılarda en verimli şekilde çalıştırılmak üzere geliştirilmiş ikili formatlı düşük seviyeli koddur. WebAssembly kodu aşağıdaki kavramlarla yapılandırılmıştır -
- Values
- Types
- Instructions
Şimdi onları detaylı olarak öğrenelim.
Değerler
WebAssembly içindeki değerler metin, dizeler ve vektörler gibi karmaşık verileri depolamak içindir. WebAssembly aşağıdakileri destekler -
- Bytes
- Integers
- Kayan nokta
- Names
Bayt
Bayt, WebAssembly içinde desteklenen en basit değer biçimidir. Değer onaltılık formattadır.
For exampleB olarak temsil edilen baytlar , n <256 olduğu durumda n doğal sayıları da alabilir.
byte ::= 0x00| .... |0xFF
Tamsayılar
WebAssembly'de desteklenen tam sayılar aşağıda verildiği gibidir -
- i32: 32 bit tam sayı
- i64: 64 bit tam sayı
Kayan nokta
WebAssembly içinde desteklenen kayan nokta sayıları aşağıdaki gibidir -
- f32: 32 bit kayan nokta
- f64: 64 bit kayan nokta
İsimler
İsimler, bağlantıda bulunan Unicode tarafından tanımlanan skaler değerlere sahip karakter dizisidir. http://www.unicode.org/versions/Unicode12.1.0/ burada verilmiştir.
Türler
WebAssembly içindeki varlıklar türler olarak sınıflandırılır. Desteklenen türler aşağıda belirtildiği gibidir -
- Değer Türleri
- Sonuç Türleri
- Fonksiyon Tipleri
- Limits
- Bellek Türleri
- Masa Tipleri
- Global Tipler
- Dış Tipler
Onları tek tek inceleyelim.
Değer Türleri
WebAssembly tarafından desteklenen değer türleri aşağıda belirtildiği gibidir -
- i32: 32 bit tam sayı
- i64: 64 bit tam sayı
- f32: 32 bit kayan nokta
- f64: 64 bit kayan nokta
valtype ::= i32|i64|f32|f64
Sonuç Türleri
Parantez içinde yazılan değerler çalıştırılır ve sonuç türleri içinde saklanır. Sonuç türü, değerlerden oluşan bir kod bloğunun yürütülmesinin çıktısıdır.
resulttype::=[valtype?]
Fonksiyon Tipleri
Parametrelerin vektörünü alacak bir işlev türü, sonuçların bir vektörünü döndürür.
functype::=[vec(valtype)]--> [vec(valtype)]
Limitler
Sınırlar, bellek ve tablo türleriyle bağlantılı depolama aralığıdır.
limits ::= {min u32, max u32}
Bellek Türleri
Bellek türleri doğrusal bellekler ve boyut aralığı ile ilgilidir.
memtype ::= limits
Masa Tipleri
Tablo Türleri, kendisine atanan öğe türüne göre sınıflandırılır.
tabletype ::= limits elemtype
elemtype ::= funcref
Tablo türü, kendisine atanan minimum ve maksimum boyut sınırına bağlıdır.
Global Tipler
Global Tip, değere sahip olan, değişebilen veya aynı kalabilen global değişkenleri tutar.
globaltype ::= mut valtype
mut ::= const|var
Dış Tipler
Dış Tipler, ithalatlar ve harici değerlerle ilgilenir.
externtype ::= func functype | table tabletype | mem memtype | global globaltype
Talimatlar
WebAssembly kodu, bir yığın makine modelini izleyen bir talimatlar dizisidir. WebAssembly bir yığın makine modelini takip ettiğinden, talimatlar yığına itilir.
Örneğin, bir işlev için bağımsız değişken değerleri yığından çıkarılır ve sonuç yığına geri gönderilir. Sonunda, yığında yalnızca bir değer olacaktır ve sonuç budur.
Yaygın olarak kullanılan talimatlardan bazıları aşağıdaki gibidir -
- Sayısal Talimatlar
- Değişken Talimatlar
Sayısal Talimatlar
Sayısal Komutlar, sayısal değer üzerinde gerçekleştirilen işlemlerdir.
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
Değişken Talimatlar
Değişken talimatlar, yerel ve global değişkenlere erişimle ilgilidir.
For example
Yerel değişkenlere erişmek için -
get_local $a
get_local $b
İçin set yerel değişkenler -
set_local $a
set_local $b
İçin access genel değişkenler -
get_global $a
get_global $b
İçin set genel değişkenler -
set_global $a
set_global $b