Web Assmebly (Wasm) ve Blazor
Yayın Tarihi : 16 Mart 2020
Bu bölümümüzde WebAssembly (Wasm) ve Microsoft’un, göreceli yeni denilebilecek, Blazor teknolojilerini ele alıyoruz. WebAssembly, Mozilla’nın başını çektiği Microsoft, Apple ve Google gibi tarayıcı geliştiren şirketlerin yer aldığı bir çalışma grubu tarafından açık bir web standardı (W3C bünyesinde) olarak geliştiriliyor. WebAssembly ile C/C++, Rust ve diğer programlama dilleri ile geliştirilen programlar herhangi bir eklentiye ihtiyaç duymadan tarayıcılar tarafından yüksek performanslı olarak çalıştırılabiliyor.
Blazor ise Microsoft’un JavaScript’e ihtiyaç duymadan sadece C# programlama dili ile Angular, React ve Vue ile geliştirilen SPA ve PWA konsepti kapsamında web uygulaması geliştirmek için oluşturduğu yeni bir framework veya aslında bir programlama modeli. Blazor .NET ekosistemi içindeki geliştiricilerin React,Angular veya Vue’ya ihtiyaç duymdan client side uygulama geliştirmelerini sağlıyor. Microsoft, Blazor ile hem server side hem de WebAssembly vasıtasıyla client-side rendering imlanları sunarak rakiplerine alternatif sunmaya çalışıyor.
Dinle
Kaynakça ve Notlar
WASM
- Binary instruction format for stack based virtual machine
- Low level assembly like language with compact binary format
- Near native performance
- Portable target for high level languages
- A web technology and open web standard (W3C)
- JavaScript ile yan yana ve birlikte çalışabiliyor. JavaScript içinden WASM modülleri kullanılabiliyor. Bu sayede performansın önemli olduğu durumlarda JavaScript içinden client side’da native performansta çalışan WASM kullanılabiliyor.
- Legacy asm.js C/C++ to JavaScript
- Use cases
- Doom 3 (game)
- Figma
- AutoCad
- Serverless
- Quality analysis for DNA sequencing
- Oyunların içindeki Scripting ortamlarının yerini alabilir
- Js numbers are 64 bit floating point but we can represent only 53 bit integers
- Adının WebAssembly olması bir şanssızlık aslında. WASM dediğimiz bu zımbırtı sadece browser’ların içindeki VM’lerde değil farklı amaçlarla oluşturulan VM’lerde de çalışabilir.
- Emscripten LLVLM to JavaScript compiler. C/C++ kodu önce LLVM byte code’a çevriliyor sonra da bu byte code’dan JavaScript üretiliyor
- WASM’ın en büyük özelliklerinden birisi modül içeriğinin segmentler şeklinde üretilmesi ve bu sayede de module’un tarayıcı tarafıdnan download edilirken download işlemi bitmeden eş zamanlı olarak segmentleri native machine code’a derleyebilmesi
- Spectre ve meltdown CPU açıkları nedeni ile tarayıcılarda Shared Linear Memory özelliğini disable edilmiş durumda şu anda bu nedenle WASM’da multithread kod çalışmıyor.
- WASM’da performans açısından şu anda en sıkıntılı konu JavaScript ile entegrasyonu. Çünkü WASM içinden doprudan JavaScript API’lar çağırılamıyor, bunun yerine JavaScript içinden WASM modülleri import edilirken WASM modüle hangi JavaScript API’ları kullanacağını söylemek gerekiyor.
- Farklı programlama dillerini WASM’a derleyen compiler’lar şu anda doğrudan optimizasyon yapıyor. Çünkü WASM platform independen bir instructon set ile çalışıyor, ancak native CPU’larda performans için çok farklı instruction’lar olabiliyor ve derleyici de WASM’ın çalışacağı native processor’u bilmediği için ona göre optimizasyon yapamıyor.
- Debugging araçları henüz eksik. Ancak şu anda DWARF fırmatındaki bilgiler ve llvm’in sunduğu bir utility ile sourcemap üretilip url’den bu map fetch edilerek debug mümkün
Blazor
- Use C# on the client instead of JavaScript
- Blazor is a client side view framework like React or Vue
- Calculate UI changes then apply those changes to the UI (renderer)
- You can implement platform specific renderers which is not possible with Angular/Vue or React (only web based UI). But components should be rewritten
- Blazor WebAssembly release around May 2020
LLVM / Emscripten
- Your Language (C/C++ …) => LLVM IR (Internal representation/byte code) => Native Machine Code
- LLVM ve PostgreSQL => Query’leri native koda compile etme konusu var. Denemelerde 5 kata kadar performans artışı gözlemlemişler
- Garbage collector’u olan diller için şimdilik LLVM doğrudan destek vermiyor. Ancak LLVM toolchaininde ile garbage collector’u implemente etmeniz için bir takım araçlar var.
Stack Based Virtual Machine
- Stack pointer (SP) ve Instruction pointer (IP)
- Stack = FIFO
- 2 sayısı ekleyen bir fonksiyon olduğunu varsayalım. Önce parametre değerleri stack’e konulur sonra da IP add fonksiyonuna işaret eder. Add fonksiyonu da stack’den 2 değeri pop edip sonucu yine stack’e yazar ve SP de sonucun olduğu bellek alanını işaret eder.
- Stack based VM’ler benzeyen diğer bir VM türü ise Register Based VM’ler. Bu VM’ler stack kullanmak yerine CPU’nun belirli registerlarını kullanırlar. Bu nedenle genelde daha yüksek performans ile çalışırlar
- JVM ve CLR ikisi de stack based VM
- LUA ‘nın VM ise register based bir VM