# WebAssembly
WebAssembly (bazen Wasm olarak da kısaltılır), yürütülebilir programlar için taşınabilir bir ikili kod biçimine karşılık gelen bir metin biçimidir. Bunun yanı sıra bu tür programlar ve bunların ana bilgisayar ortamı arasındaki etkileşimleri kolaylaştırmak için yazılım arabirimlerini de ifade eder.
WebAssembly'nin temel amacı, web sayfalarında yüksek performanslı uygulamaları mümkün hale getirmektir. Ancak bunun sadece Web'de kullanılacağına dair bir varsayımda bulunmaz veya Web'e özgü özellikler sağlamaz. Bu nedenle diğer ortamlarda da kullanılabilir. Açık bir standarttır ve herhangi bir işletim sistemindeki herhangi bir dili desteklemeyi amaçlar. Pratikte zaten popüler dillerin tümü WebAssembly'yi az da olsa desteklemektedir.
WebAssembly ilk olarak yılında açıklandı ve ilk olarak yayınlandı. 5 Aralık 2019'da World Wide Web Konsorsiyumu önerisi oldu. 2021'de ACM SIGPLAN'dan "Programlama Dilleri Yazılım Ödülü'nü" aldı. World Wide Web Konsorsiyumu (W3C), Mozilla, Microsoft, Google, Apple, Fastly, Intel ve Red Hat'in desteğiyle standartlarını korumaktadır.


## Tarihçe.
WebAssembly ilk olarak 2015'te duyuruldu. Unity'nin "Angry" Bots'unun Firefox, Google Chrome ve Microsoft Edge'de yürütülmesiyle de ilk gösterimi yapıldı. WebAssembly'nin öncü teknolojiler Mozilla'dan asm.js ve Google Native Client idi ve ilk uygulama asm.js özellik kümesine dayanıyordu. asm.js teknolojisi zaten yerel kod yürütme hızlarına yakın bir hız sağlar ve WebAssembly'yi desteklemeyen veya güvenlik nedeniyle devre dışı bırakılmış tarayıcılar için uygun bir alternatif olarak kabul edilebilir.
Mart 2017'de minimum uygulanabilir ürün (MVP) tasarımının bittiği ilan edildi ve önizleme aşaması sona erdi. Eylül 2017'nin sonlarında Safari 11, piyasaya WebAssembly desteğiyle sürüldü. WebAssembly Çalışma Grubu, Şubat 2018'de Temel Spesifikasyon, JavaScript Arayüzü ve Web API için üç genel çalışma taslağı yayınladı.
Chrome 75 Haziran 2019'da, WebAssembly iş parçacıkları varsayılan olarak etkinleştirilmiş olarak piyasaya sürüldü.
Nisan 2022'den bu yana, WebAssembly 2.0 taslak durumundadır. Bu bir özellik değişikliği değildir. Bazı uzantıları ana sürüme entegre etmek içindir.


## Uygulamalar.
WebAssembly amacı başlangıçta web tarayıcısında yerel kod yürütme hızına yakın bir hız sağlamak olsa da, bunun dışında başka alanlarda da önemli hale gelmiştir. WebAssembly'nin çalışma zamanı ortamları (RE), ana bilgisayar uygulamalarına yerleştirilebilen düşük seviyeli sanal yığın makineleri (JVM veya Flash VM'ye benzer) olduğundan, bazıları Wasmtime ve Wasmer gibi bağımsız çalışma zamanı ortamlarının bir yolunu buldu.


### İnternet tarayıcıları.
Mozilla, Kasım 2017'de WebAssembly Edge 16'da varsayılan olarak etkinleştirildikten sonra "tüm büyük tarayıcılarda" desteği açıkladı. Bu desteğe, iOS ve Android için mobil web tarayıcıları da dâhildir. , yüklü tarayıcıların %96'sı WebAssembly'yi (sürüm 1.0) destekler. Daha eski tarayıcılar için Wasm, bir JavaScript polyfill tarafından asm.js'ye de derlenebilir.


## Derleyiciler.
WebAssembly uygulamaları genellikle önceden (AOT) veya tam zamanında (JIT) derleme kullanır. Ama bir yorumlayıcı da kullanabilir. İlk uygulamalar web tarayıcılarına yönelik geliştirilmiş olsa da, Wasmer, Wasmtime veya WAMR, wasm3, WAVM ve diğerleri dahil olmak üzere genel amaçlı kullanım için tarayıcı olmayan uygulamalar da vardır.
WebAssembly yürütülebilir dosyaları önceden derlendiğinden, geliştirme yapmak için çeşitli programlama dilleri kullanmak mümkündür. Bu, ya doğrudan Wasm'a derleme yoluyla ya da Wasm'da karşılık gelen sanal makinelerin uygulanması yoluyla elde edilir. Wasm'ı bir derleme hedefi olarak desteklediği bildirilen yaklaşık 40 programlama dili vardır.
Emscripten, Binaryen ve LLVM'yi arka uç olarak kullanarak C ve C++'ı Wasm'a derler. Emscripten SDK, herhangi bir LLVM destekli dilin (diğerlerinin yanı sıra C, C++ veya Rust gibi) kaynak kodunu JavaScript koduyla aynı sanal alanda çalışan bir ikili dosyada derleyebilir. Emscripten, WebGL gibi yaygın olarak kullanılan birkaç ortam arabirimi için bağlamalar sağlar.
Clang derleyicisi, sürüm 8'den itibaren, C ve C++ 'ı kodlarını Wasm'a derleyebilir.
İlk amacı, Rust, gibi diğer kaynak dilleri desteklemekle birlikte, C ve C++ 'den derlemeyi desteklemektir. NET dilleri ve AssemblyScript (TypeScript benzeri) de ortaya çıkıyor. MVP sürümünden sonra, WebAssembly'ı C# (Blazor tarafından desteklenir), F# (Bolero ile desteklenir) gibi çöpten toplanan programlama dilleri için bir derleme hedefi yapacak çoklu iş parçacığı ve çöp toplamayı destekleme planları vardır. Blazor'un yardımı), Python ve hatta tarayıcının tam zamanında derleme hızının çok yavaş olduğu düşünülen JavaScript . Python, Julia, ve Ruby dahil olmak üzere bir dizi başka dilin desteği vardır.


## Sınırlamalar.
  - Genel olarak, WebAssembly, DOM ile doğrudan etkileşime izin vermez. Tüm etkileşim, JavaScript birlikte çalışması yoluyla akmalıdır.
  - Çöp toplamanın olmaması (bununla ilgili planlar vardır)
  - Güvenlik endişeleri (aşağıda tartışılmıştır)
WebAssembly, masaüstlerinde ve mobil cihazlarda desteklenir. Ama ikincisinde, pratikte (Unity oyun motoru gibi küçük olmayan bellek tahsisleri için) "birçok uygulamanın mobil tarayıcılarda "güvenilir" bir şekilde dağıtılmasını imkansız kılan ciddi sınırlamalar vardır. Şu anda yaklaşık 300 MB'den fazla bellek ayırma, Chrome'a özgü geçici çözümlere başvurmadan Android'de Chrome'da veya iOS'ta Safari'de güvenilir değildir." 
Webassebly'nin doğrudan Belge Nesne Modeli (DOM) erişimi yoktur. Bununla birlikte, örneğin Rust dilini kullanırken stdweb veya web_sys aracılığıyla bunun için proxy işlevleri oluşturmak mümkündür.
Tüm büyük web tarayıcıları, İçerik-Güvenlik-Politikası belirtilmemişse veya "güvenli olmayan değerlendirme" kullanılıyorsa WebAssembly'ye izin verir, ancak bunun dışında büyük web tarayıcıları farklı davranır. Uygulamada WebAssembly, bir çalışan iş parçacığı geçici çözümü mevcutken "güvenli olmayan değerlendirme" olmadan Chrome'da kullanılamaz.


## Güvenlik endişeleri.
Haziran 2018'de bir güvenlik araştırmacısı, paylaşılan belleğe sahip iş parçacıkları için destek eklendikten sonra Spectre ve Meltdown güvenlik açıklarına yönelik tarayıcı azaltmalarını atlatmak için WebAssembly kullanma olasılığını sundu. Bu endişe nedeniyle, WebAssembly geliştiricileri özelliği beklemeye aldı. Ancak, gelecekteki bu dil uzantılarını keşfetmek için Google Chrome, Ekim 2018'de WebAssembly iş parçacığı teklifi için deneysel destek ekledi.
WebAssembly, kötü amaçlı yazılım yazarları, dolandırıcılar ve kimlik avı saldırganları için kanıtları gizlemeyi daha kolay sağladığı için eleştirilmiştir; WebAssembly, kullanıcının makinesinde yalnızca "[kötü amaçlı yazılım] tespitini zorlaştıran" derlenmiş biçiminde bulunur. WebAssembly'nin hızı ve gizlenebilirliği, web sitesi ziyaretçisinin cihazında gizli kripto madenciliğinde kullanılmasına yol açmıştır. Web sitesi ziyaretçilerinin tarayıcılarında kripto para madenciliğini kolaylaştıran, artık feshedilmiş bir hizmet olan Coinhive, "madencilerinin WebAssembly kullandığını ve yerel bir Madencinin performansının yaklaşık %65'i ile çalıştığını" iddia ediyor. Technische Universität Braunschweig'in Haziran 2019'da yaptığı bir araştırma, Alexa ilk 1'de WebAssembly kullanımını analiz etti Milyonlarca web sitesi ve yaygın kullanımın kötü amaçlı kripto madenciliği için olduğunu ve bu kötü amaçlı yazılımın incelenen WebAssembly kullanan web sitelerinin yarısından fazlasını oluşturduğunu tespit etti. Universität Stuttgart'tan Nisan 2021'de yapılan bir araştırma, o zamandan beri kripto madenciliğinin marjinalleştirildiğini ve Alexa'nın en iyi 1 milyon web sitesi de dahil olmak üzere çok çeşitli kaynaklardan toplanan tüm WebAssembly modüllerinin %1'inin altına düştüğünü buldu.
Büyük miktarda kodu etkili bir şekilde gizleme yeteneği, Privacy Badger gibi web izlemeyi engelleyen reklam engelleme ve gizlilik araçlarını devre dışı bırakmak için de kullanılabilir.
WebAssembly yalnızca yapılandırılmış kontrol akışını desteklediğinden, sembolik yürütme dahil güvenlik doğrulama tekniklerine uygundur. Bu yöndeki mevcut çabalar, Manticore sembolik yürütme motorunu içerir.


## WASI.
WebAssembly Sistem Arayüzü (WASI), Mozilla tarafından herhangi bir platforma taşınabilir olması amaçlanan basit bir arayüzdür (ABI ve API ). Yetenek tabanlı güvenlik tarafından kısıtlanmış dosya G/Ç gibi POSIX benzeri özellikler sağlar. Ayrıca önerilen birkaç ABI/API daha vardır.
WASI geliştirilirken, CloudABI ve Capsicum'dan esinlenilmiştir.
Docker'ın kurucularından Solomon Hykes, 2019'da WASI hakkında şunları yazmıştır: "Eğer WASM+WASI 2008'de olsaydı, Docker'ı yaratmamız gerekmezdi. İşte bu kadar önemli. Sunucudaki WebAssembly, bilgi işlemin geleceğidir." 1.0 sürümündeki Wasmer, "yazılım kapsayıcılığı sağlar; Linux, macOS, Windows ve web tarayıcıları gibi işletim sistemleri de dahil olmak üzere herhangi bir yerde değişiklik yapılmadan çalışan evrensel ikili dosyalar oluştururuz. Wasm, güvenli yürütme için varsayılan olarak uygulamaları otomatik olarak sandbox'lar".


## Şartname.
### Ana bilgisayar ortamı.
Genel standart, JavaScript API için temel özellikleri ve gömmeyle ilgili ayrıntıları sağlar.


### Sanal makine.
Wasm kodu (ikili kod, yani bayt kodu), taşınabilir bir sanal yığın makinesinde (VM) çalıştırılmak üzere tasarlanmıştır. VM, JavaScript'ten daha hızlı ayrıştırmak ve yürütmek ve kompakt bir kod temsiline sahip olacak şekilde tasarlanmıştır. Wasm ikili kodu tarafından beklenebilecek harici bir işlevsellik (syscalls gibi) standart tarafından şart koşulmamıştır. Bunun yerine, VM uygulamasının içinde çalıştığı ana bilgisayar ortamı tarafından modüller aracılığıyla arabirim sağlamanın bir yolunu sağlar.


### Wasm programı.
Bir Wasm programı, çeşitli Wasm tanımlı değerlerin ve program tipi tanımlarının koleksiyonlarını içeren ayrı bir modül olacak şekilde tasarlanmıştır. Bunlar, her ikisi de ortak bir yapıya sahip olan ikili veya metin biçiminde (aşağıya bakınız) ifade edilir.


#### Komut seti.
Bir Wasm programının ikili formatı için temel standart, VM tarafından yürütülen işlem türlerinin (tam olarak nasıl yürütülmeleri gerektiğini belirtmeden) belirli ikili kodlamalarından oluşan bir talimat seti mimarisini (ISA) tanımlar. Talimat listesi, standart bellek yükleme/depolama talimatlarını, sayısal, parametrik, akış talimatı türlerinin kontrolünü ve Wasm'e özgü değişken talimatları içerir.
Orijinal standartta (MVP) kullanılan işlem kodu sayısı, 256 olası işlem kodunun 200'ünden biraz daha azdı. WebAssembly'nin sonraki sürümleri, işlem kodlarının sayısını 200'ün biraz üzerine çıkardı. WebAssembly SIMD önerisi (paralel işleme için), 128 bit SIMD için alternatif bir işlem kodu öneki (0xfd) sunar. SIMD önekinin sıralanması ve SIMD önekinden sonra geçerli olan bir işlem kodu, bir SIMD işlem kodu oluşturur. SIMD işlem kodları, "minimum geçerli ürün" (MVP) SIMD özelliği için ek 236 talimat getirir (toplam yaklaşık 436 talimat için). Bu talimatlar, "sonlandırılmış işlem kodları" Google'ın V8'inde (Google Chrome'da) ve Mozilla Firefox'taki ilgili motorda (ancak web tarayıcılarının kararlı sürümlerinde etkinleştirilmemiştir), uygulanır ve ayrıca bazıları vardır. daha sonra "SIMD MVP sonrası" için talimatlar için ek teklif ve ayrıca masada ayrı bir "rahat-simd" teklifi var.
Bu SIMD işlem kodları ayrıca taşınabilirdir ve x64 ve ARM gibi yerel komut setlerine çevrilir. Buna karşılık, ne Java'nın JVM'si (ne de CIL ) "opcode düzeyinde", yani standartta SIMD'yi desteklemez; her ikisi de SIMD hızlandırma sağlayan bazı paralel API'lere sahiptir. Java için, taşınabilir olmayan, yani ARM veya akıllı telefonlarda kullanılamayan x64 SIMD, için gerçekler ekleyen bir uzantı vardır. Akıllı telefonlar, SIMD ile montaj kodunu çağırarak SIMD'yi destekleyebilir ve C# da benzer bir desteğe sahiptir.


#### Kod gösterimi.
Mart 2017'de WebAssembly Topluluk Grubu, ilk (MVP) ikili biçim, JavaScript API ve referans yorumlayıcı üzerinde fikir birliğine vardı. İnsanlar tarafından kullanılmak üzere tasarlanmayan bir WebAssembly ikili biçimini ( ) ve S-ifadeleri ile geleneksel derleme dilleri arasında bir çapraza benzeyen, insan tarafından okunabilen bir WebAssembly metin biçimini ( ) tanımlar.
Aşağıdaki tablo, C ile yazılmış bir faktöriyel fonksiyonun bir örneğini ve derlemeden sonra karşılık gelen WebAssembly kodunu göstermektedir. metin biçimi (WebAssembly'nin insan tarafından okunabilir bir metin gösterimi) veWeb tarayıcısı veya WebAssembly'ı destekleyen çalışma zamanı ortamı tarafından yürütülen ikili biçimi (aşağıda onaltılık olarak ifade edilen ham bayt kodu ).
Tüm tam sayı sabitleri, alan açısından verimli, değişken uzunluklu bir LEB128 kodlaması kullanılarak kodlanır.
WebAssembly metin biçimi, S-ifadeleri kullanılarak katlanmış bir biçimde daha kurallı olarak yazılır. Talimatlar ve ifadeler için bu format tamamen sözdizimsel şekerdir ve doğrusal formatla davranışsal farklılıkları yoktur. aracılığıyla, yukarıdaki kod şu şekilde derlenir:
(module
 (type $t0 (func (param i64) (result i64)))
 (func $f0 (type $t0) (param $p0 i64) (result i64)
 (if $I0 (result i64) ;; $I0 is an unused label name
 (i64.eqz
 (local.get $p0)) ;; the name $p0 is the same as 0 here
 (then
 (i64.const 1))
 (else
 (i64.mul
 (local.get $p0)
 (call $f0 ;; the name $f0 is the same as 0 here
 (i64.sub
 (local.get $p0)
 (i64.const 1))))))))
Bir modülün derleyici tarafından örtük olarak oluşturulduğunu unutmayın. İşleve aslında ikili dosyadaki tür tablosunun bir girişi tarafından başvurulur, dolayısıyla bir tür bölümü ve kod çözücü tarafından yayılan . Derleyici ve kod çözücüye çevrimiçi olarak erişilebilir.