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 example

B 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 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

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