WebAssembly - Metin Biçimi

WebAssembly, WASM adlı ikili formatta koda sahiptir. Metin biçimini WebAssembly içinde de edinebilirsiniz ve buna WAT ​​(WebAssembly Metin formatı) denir. Bir geliştirici olarak WebAssembly ile kod yazmanız gerekmez, bunun yerine C, C ++ ve Rust gibi yüksek seviyeli dilleri WebAssembly için derlemeniz gerekir.

WAT Kodu

Adım adım WAT kodu yazalım.

Step 1 - Bir WAT'de başlangıç ​​noktası, modülü bildirmektir.

(module)

Step 2 - Şimdi ona işlev biçiminde bazı işlevler ekleyelim.

Fonksiyon aşağıda gösterildiği gibi ilan edilir -

(func <parameters/result> <local variables> <function body>)

İşlev, func anahtar sözcüğüyle başlar ve ardından parametreler veya sonuç gelir.

Parametreler / Sonuç

Sonuç olarak parametreler ve dönüş değeri.

Parametreler, wasm tarafından desteklenen aşağıdaki türe sahip olabilir -

  • i32: 32 bit tam sayı
  • i64: 64 bit tam sayı
  • f32: 32 bit kayan nokta
  • f64: 64 bit kayan

Fonksiyonların parametreleri aşağıda verildiği gibi yazılmıştır -

  • (param i32)
  • (param i64)
  • (param f32)
  • (param f64)

Sonuç aşağıdaki gibi yazılacaktır -

  • (sonuç i32)
  • (sonuç i64)
  • (sonuç f32)
  • (sonuç f64)

Parametreleri ve dönüş değeri olan fonksiyon aşağıdaki gibi tanımlanacaktır -

(func (param i32) (param i32) (result i64) <function body>)

Yerel Değişkenler

Yerel değişkenler, fonksiyonunuzda ihtiyaç duyduğunuz değişkenlerdir. İşlev için yerel bir değer aşağıdaki gibi tanımlanacaktır -

(func (param i32) (param i32) (local i32) (result i64) <function body>)

İşlev Gövdesi

İşlev gövdesi, gerçekleştirilecek mantıktır. Son program şöyle görünecek -

(module (func (param i32) (param i32) (local i32) (result i64) <function body>) )

Step 3 - Parametreleri ve yerel değişkenleri okumak ve ayarlamak için.

Parametreleri ve yerel değişkenleri okumak için şunlardan yararlanın: get_local ve set_local komut.

Example

(module 
   (func (param i32) (param i32) (local i32) (result i64) get_local 0 
      get_local 1 
      get_local 2 
   ) 
)

İşlev imzasına göre,

  • get_local 0 verecek param i32

  • get_local 1 sonraki parametreyi verecek param i32

  • get_local 2 verecek local value i32

0,1,2 gibi sayısal değerler kullanarak parametrelere ve yerellere atıfta bulunmak yerine, adın önüne dolar işareti koyarak adı parametrelerden önce de kullanabilirsiniz.

Aşağıdaki örnek, adın parametreler ve yerel değerlerle nasıl kullanılacağını gösterir.

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 - İşlev gövdesi ve uygulamada talimat.

Wasm'deki yürütme, yığın stratejisini izler. Yürütülen talimatlar yığın üzerinde birer birer gönderilir. Örneğin, get_local $ a talimatı değeri itecektir, yığın üzerinde okur.

Talimat gibi i32.add bu, ögeleri yığından çıkaracaktır.

(func (param $a i32) (param $b i32) 
   get_local $a 
   get_local $b 
   i32.add
)

İçin talimat i32.add dır-dir ($a+$b). İ32.add'nin son değeri yığın üzerine itilecek ve sonuca atanacaktır.

İşlev imzasının bildirilmiş bir sonucu varsa, yürütmenin sonunda yığında bir değer olmalıdır. Sonuç parametresi yoksa, yığının sonunda boş olması gerekir.

Dolayısıyla, fonksiyon gövdesi ile birlikte son kod aşağıdaki gibi olacaktır -

(module 
   (func (param $a i32) (param $b i32) (result i32) 
      get_local $a
      get_local $b 
      i32.add
   )
)

Step 5 - İşleve çağrı yapmak.

İşlev gövdesine sahip son kod 4. adımda gösterildiği gibidir. Şimdi, işlevi çağırmak için dışa aktarmamız gerekir.

Fonksiyonu dışa aktarmak için 0,1 gibi indeks değerleri ile yapılabilir ama isimler de verebiliriz. Adın önüne $ gelecek ve func anahtar sözcüğünden sonra eklenecektir.

Example

(module 
   (func $add (param $a i32) (param $b i32) (result i32) 
      get_local $a 
      get_local $b i32.add
   ) 
)

$ Add işlevi, aşağıda gösterildiği gibi dışa aktar anahtar sözcüğü kullanılarak dışa aktarılmalıdır -

(module 
   (func $add 
      (param $a i32) 
      (param $b i32) 
      (result i32) 
      get_local $a get_local $b i32.add
   ) 
   (export "add" (func $add))
)

Yukarıdaki kodu tarayıcıda test etmek için, onu ikili forma (.wasm) dönüştürmeniz gerekecektir. Nasıl dönüştürüleceğini gösteren sonraki bölüme bakın.WAT to .WASM.