WebAssembly Nedir: Webin Yeni Performans Devrimi
Web uygulamalarının performans sınırlarını zorladığı bir dönemde, JavaScript’in yalnız başına taşıyamayacağı yükler ortaya çıkmaya başladı. Video düzenleme, 3D rendering, bilimsel hesaplama, oyun motorları… Bunların hepsi tarayıcıda çalışması beklenen ama JavaScript’in hız sınırlarına sürekli çarpan senaryolar. İşte tam bu noktada WebAssembly sahneye girdi ve web platformunun oyununu tamamen değiştirdi.
WebAssembly Nedir?
WebAssembly, kısaca WASM olarak da bilinen, tarayıcıda çalışabilen düşük seviyeli bir binary format ve sanal makine spesifikasyonudur. 2019 yılında W3C tarafından resmi bir web standardı olarak kabul edildi. Ama sadece “tarayıcıda çalışan hızlı kod” demek, işin özünü tam anlatmıyor.
WASM’ı özel kılan şu: C, C++, Rust, Go gibi dillerde yazdığın kodu derleyip tarayıcıda çalıştırabiliyorsun. Bu kod native uygulamaya yakın hızlarda çalışıyor. Mozilla, Google, Microsoft ve Apple’ın ortak geliştirdiği bu standart, web platformuna gerçek anlamda sistem programlama kapısını açtı.
WASM bir derlenmiş format. JavaScript gibi yorumlanmıyor, doğrudan tarayıcının sanal makinesinde binary olarak çalışıyor. Bu nedenle parse edilmesi çok daha hızlı, optimize edilmesi çok daha kolay.
Stack Tabanlı Sanal Makine Mantığı
WASM, stack tabanlı bir sanal makine üzerinde çalışır. Her şey bir yığın (stack) mantığıyla işlenir. Kayıtlar yok, yığından değer alırsın, işlem yaparsın, yığına geri koyarsın.
# Basit bir WASM text format örneği (.wat dosyası)
# İki sayıyı toplayan bir fonksiyon
cat > toplama.wat << 'EOF'
(module
(func $topla (param $a i32) (param $b i32) (result i32)
local.get $a
local.get $b
i32.add)
(export "topla" (func $topla))
)
EOF
# WAT formatını WASM binary formatına dönüştür
wat2wasm toplama.wat -o toplama.wasm
# Dosya boyutunu kontrol et
ls -lh toplama.wasm
Bu basit örnekte bile WASM’ın yapısını görüyorsun: modüller, fonksiyonlar, tipler ve export mekanizması. Text format (.wat) insan okunabilir, binary format (.wasm) ise tarayıcının direkt işlediği format.
Nasıl Çalışır: Derleme Süreci
WASM’ın çalışma mantığını anlamak için derleme pipeline’ına bakmak gerekiyor. Sysadmin olarak biz bunu bir build pipeline gibi düşünebiliriz.
# Rust ile basit bir WASM modülü oluşturma örneği
# Önce Rust ve wasm-pack kur
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
cargo install wasm-pack
# Yeni bir Rust projesi oluştur
cargo new --lib wasm-hesaplama
cd wasm-hesaplama
# Cargo.toml dosyasını yapılandır
cat > Cargo.toml << 'EOF'
[package]
name = "wasm-hesaplama"
version = "0.1.0"
edition = "2021"
[lib]
crate-type = ["cdylib"]
[dependencies]
wasm-bindgen = "0.2"
EOF
# src/lib.rs dosyasını yaz
cat > src/lib.rs << 'EOF'
use wasm_bindgen::prelude::*;
#[wasm_bindgen]
pub fn fibonacci(n: u32) -> u32 {
match n {
0 => 0,
1 => 1,
_ => fibonacci(n - 1) + fibonacci(n - 2),
}
}
#[wasm_bindgen]
pub fn faktoriyel(n: u64) -> u64 {
if n == 0 {
return 1;
}
n * faktoriyel(n - 1)
}
EOF
# WASM olarak derle
wasm-pack build --target web
# Çıktı dizinini kontrol et
ls -lh pkg/
Derleme tamamlandığında pkg/ dizininde .wasm dosyası ve bunu JavaScript’ten kullanmayı kolaylaştıran wrapper dosyaları oluşuyor. Bu wrapper’lar olmadan JavaScript ile WASM arasındaki veri alışverişi oldukça zahmetli olur.
C/C++ ile Emscripten Kullanımı
WASM dünyasında C/C++ projelerini dönüştürmek için en yaygın araç Emscripten’dir. Özellikle legacy C/C++ kütüphanelerini web’e taşımak için kritik.
# Emscripten kurulumu (Linux)
git clone https://github.com/emscripten-core/emsdk.git
cd emsdk
./emsdk install latest
./emsdk activate latest
source ./emsdk_env.sh
# Basit bir C dosyası oluştur
cat > goruntu_isleme.c << 'EOF'
#include <stdlib.h>
#include <string.h>
// Gri tonlama filtresi
void gri_tonlama(unsigned char* piksel_data, int genislik, int yukseklik) {
int toplam_piksel = genislik * yukseklik;
for (int i = 0; i < toplam_piksel; i++) {
int offset = i * 4;
unsigned char r = piksel_data[offset];
unsigned char g = piksel_data[offset + 1];
unsigned char b = piksel_data[offset + 2];
unsigned char gri = (unsigned char)(0.299 * r + 0.587 * g + 0.114 * b);
piksel_data[offset] = gri;
piksel_data[offset + 1] = gri;
piksel_data[offset + 2] = gri;
}
}
EOF
# WASM olarak derle
emcc goruntu_isleme.c
-O3
-o goruntu_isleme.js
-s WASM=1
-s EXPORTED_FUNCTIONS='["_gri_tonlama"]'
-s EXPORTED_RUNTIME_METHODS='["ccall", "cwrap"]'
# Oluşan dosyaları kontrol et
ls -lh goruntu_isleme.*
-O3 flag’i agresif optimizasyon anlamına geliyor. WASM için bu optimizasyon seviyeleri kritik çünkü dosya boyutunu ve çalışma hızını doğrudan etkiliyor.
JavaScript ile WASM Entegrasyonu
WASM tek başına çalışmaz. JavaScript ile el ele çalışır. Bu ortaklık çok önemli: WASM ağır hesaplamayı yapar, JavaScript DOM ve API işlerini halleder.
// index.html içinde WASM yükleme ve kullanma
async function wasmYukle() {
try {
// WASM modülünü fetch et
const response = await fetch('toplama.wasm');
const buffer = await response.arrayBuffer();
// WebAssembly.instantiate ile modülü başlat
const { instance } = await WebAssembly.instantiate(buffer, {
env: {
memory: new WebAssembly.Memory({ initial: 256 }),
abort: () => console.error('WASM abort çağrıldı')
}
});
// WASM fonksiyonunu çağır
const sonuc = instance.exports.topla(15, 27);
console.log(`15 + 27 = ${sonuc}`);
// Fibonacci testi
console.time('wasm-fibonacci');
const fib40 = instance.exports.fibonacci(40);
console.timeEnd('wasm-fibonacci');
console.log(`Fibonacci(40) = ${fib40}`);
} catch (hata) {
console.error('WASM yüklenemedi:', hata);
}
}
wasmYukle();
# Node.js ortamında WASM test etme (sunucu tarafı)
cat > test_wasm.js << 'EOF'
const fs = require('fs');
async function testEt() {
const wasmBuffer = fs.readFileSync('./toplama.wasm');
const { instance } = await WebAssembly.instantiate(wasmBuffer, {
env: {
memory: new WebAssembly.Memory({ initial: 256 })
}
});
// Performans karşılaştırması
const TEKRAR = 1000000;
// WASM ile
console.time('wasm-toplama');
for (let i = 0; i < TEKRAR; i++) {
instance.exports.topla(i, i + 1);
}
console.timeEnd('wasm-toplama');
// Pure JS ile
console.time('js-toplama');
for (let i = 0; i < TEKRAR; i++) {
i + (i + 1);
}
console.timeEnd('js-toplama');
}
testEt().catch(console.error);
EOF
node test_wasm.js
Gerçek Dünya Senaryoları
Teoria güzel ama sysadmin olarak bizi asıl ilgilendiren gerçek kullanım senaryoları. WASM’ın production’da ne işe yaradığına bakalım.
Senaryo 1: Figma Benzeri Web Uygulaması
Figma, tasarım araçlarını web’e taşırken C++ motorunu WASM’a derleyerek kullanıcılara native’e yakın performans sundu. Benzer bir yaklaşım düşünelim: tarayıcıda SVG/canvas üzerinde çalışan ağır bir rendering motoru.
# Wasmer ile sunucu taraflı WASM çalıştırma örneği
# Wasmer kurulumu
curl https://get.wasmer.io -sSfL | sh
# Bir WASM modülünü doğrudan çalıştır
wasmer run --dir /tmp toplama.wasm
# WASM modülü için benchmark
wasmer run --enable-all toplama.wasm -- --benchmark
# Wasmer'in WASI (WebAssembly System Interface) desteği ile
# dosya sistemi erişimi olan bir WASM uygulaması
wasmer run --dir /home/kullanici/data uygulama.wasm
Senaryo 2: Edge Computing ile WASM
Edge computing’de WASM son derece güçlü. Cloudflare Workers, Fastly Compute@Edge gibi platformlar WASM’ı edge node’larda çalıştırıyor. Sunucu gerektirmeden, kullanıcıya en yakın noktada hesaplama yapabiliyorsun.
# Wasmtime kurulumu (WASM runtime, sunucu tarafı)
curl https://wasmtime.dev/install.sh -sSf | bash
# WASM modülünü wasmtime ile çalıştır
wasmtime toplama.wasm
# WASI ile sistem çağrılarına izinli çalıştırma
wasmtime --dir /tmp --env HOME=/tmp uygulama.wasm
# Wasmtime ile performans profili
wasmtime --profile=guest uygulama.wasm
# İzolasyon testi: sadece belirli dizine erişim ver
wasmtime
--dir /var/app/data::/data
--env DATABASE_URL=sqlite:///data/app.db
backend.wasm
Bu izolasyon mekanizması sysadminler için çok değerli. WASM modülü sadece izin verdiğin kaynaklara erişebiliyor. Docker gibi ama çok daha hafif ve hızlı başlayan bir izolasyon.
Senaryo 3: Şifreleme ve Güvenlik İşlemleri
Tarayıcıda AES şifreleme, hash hesaplama gibi işlemler WASM ile ciddi hız kazanıyor. Web Crypto API ile kıyaslandığında bazı senaryolarda WASM daha fazla kontrol sunuyor.
// Rust ile yazılmış, WASM'a derlenecek şifreleme kodu
// src/lib.rs
use wasm_bindgen::prelude::*;
#[wasm_bindgen]
pub fn sha256_hesapla(veri: &[u8]) -> Vec<u8> {
// Basitleştirilmiş örnek - gerçekte sha2 crate kullanılır
let mut hash = vec![0u8; 32];
// XOR tabanlı basit hash (örnek amaçlı)
for (i, &byte) in veri.iter().enumerate() {
hash[i % 32] ^= byte;
hash[i % 32] = hash[i % 32].wrapping_add(byte.wrapping_mul(31));
}
hash
}
#[wasm_bindgen]
pub fn base64_encode(veri: &[u8]) -> String {
let chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
let chars: Vec<char> = chars.chars().collect();
let mut sonuc = String::new();
for chunk in veri.chunks(3) {
let b0 = chunk[0] as usize;
let b1 = if chunk.len() > 1 { chunk[1] as usize } else { 0 };
let b2 = if chunk.len() > 2 { chunk[2] as usize } else { 0 };
sonuc.push(chars[(b0 >> 2) & 0x3F]);
sonuc.push(chars[((b0 & 0x3) << 4) | ((b1 >> 4) & 0xF)]);
sonuc.push(if chunk.len() > 1 { chars[((b1 & 0xF) << 2) | ((b2 >> 6) & 0x3)] } else { '=' });
sonuc.push(if chunk.len() > 2 { chars[b2 & 0x3F] } else { '=' });
}
sonuc
}
WASM’ın Güvenlik Modeli
Sysadmin perspektifinden WASM’ın güvenlik modelini anlamak kritik. WASM sandbox içinde çalışır ve bu sandbox oldukça güçlü.
Bellek izolasyonu: Her WASM modülü kendi linear memory alanına sahip. Dışarıya doğrudan erişemez.
Capability-based güvenlik: WASI standardıyla birlikte WASM modülleri sadece açıkça verilen yeteneklere (dosya erişimi, ağ vs.) sahip olabiliyor.
Tip güvenliği: WASM statik olarak tiplenmiş. Çalışmadan önce doğrulama yapılıyor.
Kontrol akışı bütünlüğü: WASM’da rastgele adrese atlama yok. Kontrol akışı doğrulanıyor.
# WASM modülünün güvenlik özelliklerini kontrol et
# wasm-validate aracı ile modülü doğrula
wasm-validate benim_modulüm.wasm
# wasm2wat ile modülün içeriğini incele
wasm2wat benim_modulüm.wasm -o inceleme.wat
cat inceleme.wat
# Import ve export tablosunu görüntüle
wasm-objdump -x benim_modulüm.wasm
# Modülün kullandığı fonksiyonları listele
wasm-objdump -d benim_modulüm.wasm | grep "func["
Performans Optimizasyonu
WASM hızlı ama yanlış kullanılırsa bu hızı hissetmeyebilirsin. Özellikle JavaScript ile WASM arasındaki sınırı (boundary) sık geçmek ciddi overhead yaratıyor.
# WASM binary boyutunu optimize et
# wasm-opt aracı (Binaryen'den)
wasm-opt -O3 -o optimized.wasm original.wasm
wasm-opt -Oz -o small.wasm original.wasm # boyut optimizasyonu
# Boyut karşılaştırması
echo "Orijinal:"
ls -lh original.wasm
echo "Hız optimize:"
ls -lh optimized.wasm
echo "Boyut optimize:"
ls -lh small.wasm
# wasm-strip ile debug bilgilerini kaldır
wasm-strip optimized.wasm
# gzip ile ek küçültme (HTTP transfer için)
gzip -9 -k optimized.wasm
ls -lh optimized.wasm.gz
# WASM için CI/CD pipeline örneği
cat > .github/workflows/wasm-build.yml << 'EOF'
name: WASM Build Pipeline
on:
push:
branches: [main]
jobs:
build-wasm:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Rust kurulumu
uses: actions-rs/toolchain@v1
with:
toolchain: stable
target: wasm32-unknown-unknown
- name: wasm-pack kurulumu
run: cargo install wasm-pack
- name: WASM derle
run: wasm-pack build --target web --release
- name: Boyut kontrolü
run: |
WASM_SIZE=$(stat -c%s pkg/*.wasm)
echo "WASM boyutu: $WASM_SIZE bytes"
if [ $WASM_SIZE -gt 1048576 ]; then
echo "UYARI: WASM dosyası 1MB sınırını aştı!"
exit 1
fi
- name: Artifaktları yükle
uses: actions/upload-artifact@v3
with:
name: wasm-package
path: pkg/
EOF
WASM’ın Geleceği ve WASI
WASM sadece tarayıcıyla sınırlı değil artık. WASI (WebAssembly System Interface), WASM’ı sunucu tarafında, container’larda ve IoT cihazlarında çalıştırmayı standardize ediyor.
Docker’ın kurucularından Solomon Hykes’ın meşhur sözü var: “Eğer 2008’de WASM ve WASI olsaydı, Docker’ı yaratmamıza gerek kalmayabilirdi.” Bu söz WASM’ın potansiyelini çok net özetliyor.
Şu an production’da WASM kullanan büyük projeler:
- Figma: C++ render motorunu WASM’a derledi
- AutoCAD: 30 yıllık C++ kod tabanını web’e taşıdı
- Google Earth: WebGL + WASM kombinasyonu
- Shopify: Eklenti sistemini WASM ile izole etti
- Cloudflare Workers: Edge function’ları WASM üzerinde çalıştırıyor
- Fastly Compute@Edge: WASM tabanlı serverless platform
- Zoom: Video kodlama filtrelerinde WASM kullanıyor
Sysadmin Olarak WASM ile Ne Yapabilirsin?
Tarayıcı geliştirici olmayan biri için neden WASM öğrenmeli sorusu akla gelebilir. Ama bakış açısını genişletince fark ediyorsun:
Plugin izolasyonu: Uygulamanın eklenti sistemini WASM ile yapıyorsan, kötü yazılmış bir eklenti tüm sistemi çökertemiyor.
Hafif containerization: Wasmer veya Wasmtime kullanarak uygulamaları Docker olmadan izole çalıştırabiliyorsun. Başlangıç süresi milisaniyeler.
Cross-platform araçlar: Bir kez derle, her yerde çalıştır. Linux, Windows, macOS, tarayıcı. Gerçek anlamda platform bağımsızlık.
Serverless ve edge: Lambda fonksiyonlarını WASM olarak deploy etmek, cold start süresini dramatik şekilde düşürüyor.
# Wasmer ile basit bir WASM uygulaması container gibi çalıştır
wasmer create-exe uygulama.wasm -o uygulama_native
# Artık native binary gibi çalışır
./uygulama_native
# Wasmer registry'den hazır WASM uygulaması çalıştır
wasmer run python/python -- --version
wasmer run syrusakbary/cowsay -- "WASM harika!"
Sonuç
WebAssembly, web platformunun son 10 yılının en önemli gelişmelerinden biri. Sadece “tarayıcıda hızlı kod çalıştırma” olarak görmemek gerekiyor. WASM, güvenli izolasyon, platform bağımsızlığı ve yüksek performansı bir arada sunan yeni nesil bir çalışma ortamı.
Sysadmin ve DevOps perspektifinden bakıldığında WASM’ın getirdiği en büyük değer izolasyon ve taşınabilirliktir. Docker container’larından çok daha hızlı başlayan, çok daha az kaynak tüketen, ama benzer güvenlik garantileri sunan bir teknoloji hayal edebiliyorsun artık.
Şu an yapman gereken pratik ilk adımlar basit: Wasmtime veya Wasmer kur, bir Rust projesi derleyip WASM çıktısı al, Node.js ile bu WASM modülünü test et. Bu döngüyü birkaç kez yapınca WASM’ın nasıl çalıştığı kafanda oturmuş olacak.
Edge computing’in yükselişiyle birlikte WASM’ı anlamak giderek daha kritik bir sysadmin becerisi haline geliyor. Cloudflare Workers, Fastly, Deno Deploy gibi platformların tamamı WASM’ı birinci sınıf vatandaş olarak destekliyor. Bu trende hazırlıklı olmak, yarın bu altyapıları yönetirken seni bir adım öne geçirecek.
