İçeriğe atla

WebAssembly

WebAssembly Tarayıcı Yeteneklerini Nasıl Değiştiriyor

8 dk okuma

Tarayıcılar yazılım çalıştırmak için değil, belge görüntülemek için tasarlandı. Web'in ilk yirmi yılında gerçek bir hesaplama gücü istiyorsanız — video dönüştürme, PDF işleme, ciddi sıkıştırma — işi bir sunucuya göndermek zorundaydınız. 2017'de olgunlaşan açık bir standart olan WebAssembly bu kuralı sessizce yeniden yazdı. Bugün C++ ve Rust kodu tarayıcı sekmenizin içinde neredeyse yerel hızda çalışıyor ve 'web uygulaması' ile 'masaüstü uygulaması' arasındaki sınır neredeyse ortadan kalktı.

Bu makale; WebAssembly'in (Wasm) gerçekte ne olduğunu, neden hızlı olduğunu, bugün nerelerde kullanıldığını ve Convrs gibi gerçekten istemci tarafı gizlilik araçlarını nasıl mümkün kıldığını anlatıyor.

Tarayıcının özgün performans tavanı

Web, JavaScript üzerine kuruldu. JavaScript son derece yetenekli bir dil ama yorumlanma (veya tam zamanında derlenme) biçimi, öngörülebilir ve yerel hıza yakın performansı zorlaştırır. Saniyede bir milyon piksel işleyen bir JavaScript döngüsü, aynı döngü C++'ta zar zor fark edilecek bir duvara çarpar.

Yıllarca projeler bu duvara akıllı hilelerle direndi: asm.js adı verilen JavaScript'in katı bir alt kümesi, öngörülebilir tür kalıplarını kullanarak C/C++ kodunu Firefox'ta şaşırtıcı derecede hızlı çalıştırabiliyordu. Ama asm.js gerçek bedelleri olan bir geçici çözümdü: şişkin dosyalar, hantal araçlar ve yerelin altında performans.

WebAssembly nedir — ve hızını nasıl kazanır

WebAssembly, yeni sözdizimiyle JavaScript değildir. C, C++, Rust, Go ve giderek Swift ile Kotlin gibi diller için bir derleme hedefi olacak şekilde tasarlanmış, bağımsız, düşük seviyeli bir bayt kod biçimidir. Bir araç zinciri (genellikle Emscripten veya wasm-bindgen) yerel kaynağınızı kompakt bir .wasm modülüne derler; tarayıcı da bunu kendi yalıtımında (sandbox) yükler ve çalıştırır.

Üç tasarım tercihi Wasm'e hızını kazandırır:

  • Ayrıştırma aşaması yok. JavaScript çalışmadan önce ayrıştırılmalıdır; Wasm modülleri önceden derlenmiş ikili biçimdedir ve milisaniyeler içinde çözülür.
  • Tam zamanında yerel kod. Tarayıcılar Wasm'i yükleme anında makine koduna çevirir ve neredeyse hiç dinamik tahmin yapmadan yerel hıza yakın yürütür.
  • Doğrusal bellek. Wasm, düz ve yalıtılmış bir bellek arabelleği üzerinde çalışır; bu, derlenmiş dillerin belleği yönetme biçimiyle birebir örtüşür ve çöp toplama duraklamaları olmadan çalışmayı sağlar.
// Küçük bir tat: JS'ye Wasm dışa aktarımı olarak sunulan derlenmiş bir C işlevi.
// Tarayıcıda çağırmak normal bir JS sözü gibi hissettirir:
const { instance } = await WebAssembly.instantiateStreaming(fetch('./fast.wasm'));
const result = instance.exports.my_native_function(input);

Sonuç, performansın — görüntü sıkıştırma, ses çözme, PDF yerleşimi — birçok gerçek iş yükünde yerel bir çalıştırılabilir dosyanın %80–95'i içine girmesidir. Son kullanıcı için 'sunucu çiftliğinde çalışır' ile 'sekmenizde çalışır' arasındaki fark neredeyse görünmez olur.

Kodeklerden veritabanlarına: Wasm gerçekte neyi güçlendiriyor

Wasm dağıtımlarının listesi modern internetin arka ucunu anımsatıyor:

  • Medya kodekleri. libvpx (WebP/VP8/VP9), libavcodec (video/ses) ve libvips, mozjpeg gibi görüntü kütüphaneleri tarayıcıda çalışır; sunucusuz anında dönüştürme sağlar.
  • Belge motorları. PDF işleyiciler, belge önizlemeleri ve tipografi motorları.
  • Sıkıştırma. zlib, zstd, brotli ve gzip; WebAssembly tarayıcıların ve CDN'lerin daha iyi sıkıştırma müzakere etmesini bile sağlar.
  • Tarayıcıda SQLite. Yerel olarak çalışan, istediğinizde eşitlenen tam bir ilişkisel veritabanı.
  • Oyunlar ve grafikler. Unity ve Unreal Wasm'e derlenir; karmaşık 3D sahne bir sekmede çalışır.
  • Yapay zekâ ve görüş. ONNX Runtime ve onnxruntime-web, model çıkarımını cihazınızda çalıştırır; girdiler özel kalır.

Tüm bu durumlarda desen aynıdır: savaşta kanıtlanmış yerel bir kütüphane, bir kez derlenmiş, tarayıcıya gönderilmiş, yerel olarak çalıştırılmış — yol üzerinde hiç sunucu yok.

WebAssembly neden istemci tarafı gizliliğin motorudur

Wasm'in gizlilik araçları üzerindeki pratik etkisi abartılamaz. Wasm'den önce tarayıcıda ciddi dosya işleme ya her şeyi sıfırdan JavaScript'te yazmak (yavaş, dünyayı yeniden kurmak) ya da işlemeyi sunucuya göndermek (özel veri cihazı terk eder) demekti. Wasm bu ödünleşimi kırar:

  • Yıllarca süren optimizasyon doğrudan aktarılır. Tüm sektörün yıllarca optimize ettiği kodekler ve kütüphaneler bir sekmede anında kullanılabilir.
  • Büyük girdiler mümkün olur. Yüzlerce megabaytlık dosyalar, tek başına JavaScript'in zorlanacağı yerlerde yerel olarak işlenebilir.
  • Çevrimdışı, özel uygulamalar normalleşir. Dönüştürme araçları bağlantı olmadan çalışır, çünkü hesaplama hiçbir zaman bağlantı gerektirmemiştir.

Convrs tam bu temel üzerine kuruludur: her dönüştürücü kendi biçimi için bir Wasm modülü taşır (görüntü kodekleri, video/ses motorları, belge işlem hatları) ve dönüşümün tamamını tarayıcınızda çalıştırır. Sayfa yüklendikten sonra dosyanız ağa bir daha dokunmaz. Wasm yalıtımı, kodun güvenilmez evren yazılımı bile olsa makinenizle yalnızca sayfanın sağladığı dar ve açık arayüzler üzerinden etkileşmesini sağlar.

Tasarım gereği yalıtılmış

Wasm olarak çalışan en güçlü yerel kod bile dosya sisteminize, kameranıza veya ağınıza sessizce dokunamaz. Tarayıcı sandbox'ı sayfanızın zaten kullandığı sandbox'tır — Wasm yetenek katar, erişim değil.

Genişleyen sınır: iş parçacıkları, SIMD ve ötesi

WebAssembly'in yetenekleri platformla birlikte genişliyor. İş parçacıkları, Wasm'in paralel kodlama ve dönüştürme için birden çok CPU çekirdeği kullanmasını sağlar; bu, video ve görüntü işleri için büyük bir kazanımdır. SIMD (tek komut çoklu veri), aynı işlemin 16 pikseli birden işlemesini sağlayarak kodekleri daha da hızlandırır. WebAssembly System Interface (WASI), Wasm modüllerinin G/Ç ile nasıl konuştuğunu tanımlar; bu da aynı kodun sunucularda, uç cihazlarda ve gömülü hedeflerde çalışmasını sağlar — taşınabilir, kurcalamaya dayanıklı iş yüklerinin kapısını açar.

Hâlâ dürüst sınırlar var. Wasm belleği sınırlıdır (tipik olarak birkaç gigabayta kadar), çok büyük dosyalar pratik tavanlara takılabilir, çöp toplamalı diller ekstra iskele gerektirir ve araç zinciri öğrenme eğrisi gerçektir. Ama günlük araçlara hâkim olan dönüştürme ve kodlama iş yüklerinde bu sınırlar nadiren bağlar.

Web'in geleceği için bu ne anlama geliyor

WebAssembly, tarayıcıyı her zaman olması istenen evrensel uygulama platformuna dönüştürdü. Kurulabilir masaüstü uygulamaları artık web sayfası olarak dağıtılıyor; sunucu kodu istemciye taşındı; yerel ekosistemler ve açık web yakınsıyor. Kullanıcılar için sessiz sonuç en değerli olanıdır: zor işi kendi makinenizde yapan, dosyalarınıza sizinmiş gibi davranan ve ne yapacağını sorması gerekmeyen yazılım — çünkü dosyaları hiçbir yerde saklamaz.

Bir sonraki sefer bir araç her şeyin tarayıcınızda olduğunu söylediğinde, neyin gerçekten ona güç verdiğini kontrol edin. Video, PDF, görüntü veya veriyi ölçekte hızlı işliyorsa, ağır işi yapanın WebAssembly olma ihtimali yüksektir — ve işi tam da verinizin zaten yaşadığı yerde yapıyordur.

Buy me a coffee