Jamil Sultanli.
← Ana Səhifəyə Qayıt

WebAssembly (Wasm) və Müasir Veb Arxitekturası: Brauzerdə Yüksək Performanslı Hesablama və Gələcəyin Veb Texnologiyaları

·12 dəqiqə

Veb texnologiyalarının təkamülü son onillikdə inanılmaz bir sürətlə baş verdi. Statik HTML səhifələrindən mürəkkəb, interaktiv və tək səhifəli tətbiqlərə (SPA) keçid, brauzerlərin üzərinə düşən hesablama yükünü kəskin şəkildə artırdı. Uzun illər boyu brauzer daxilində dinamik ssenarilərin icrası üçün yeganə rəsmi dil JavaScript (JS) idi. Lakin video redaktorlar, 3D qrafika, süni intellekt modellərinin lokal icrası və böyük verilənlərin vizuallaşdırılması kimi resurs tələb edən tapşırıqlar JavaScript-in performans limitlərini zorlamağa başladı.

Məhz bu nöqtədə veb dünyasında yeni bir inqilab baş verdi: WebAssembly (Wasm). WebAssembly, brauzerlərdə demək olar ki, yerli (native) aparat sürətində işləyən, aşağı səviyyəli (low-level) ikili (binary) kod formatıdır. Bu məqalədə WebAssembly-nin daxili arxitekturasını, onun JavaScript ilə sinergiyasını, müasir veb tətbiqlərində necə tətbiq olunduğunu və gələcəyin veb infrastrukturunu necə formalaşdırdığını dərindən analiz edəcəyik.


BUNLARI DA OXUYUN

Sıfırdan Sayt Hazırlamaq Bələdçisi: Kod Yazmadan Professional Veb Sayt Necə Qurulur?

Kod yazmadan professional veb sayt hazırlamaq istəyirsiniz? WordPress, Webflow və Shopify ilə addım-addım sayt qurmaq bələdçisi və ən yaxşı platformalar.

Oxumağa davam et

WebAssembly (Wasm) Nədir və Necə İşləyir?

WebAssembly, W3C tərəfindən qəbul edilmiş dördüncü rəsmi veb texnologiyasıdır (HTML, CSS və JavaScript-dən sonra). O, ayrıca bir proqramlaşdırma dili deyil, digər dillər (məsələn, Rust, C/C++, Go, Zig) üçün hədəf kompilyasiya formatıdır. Yəni, siz Rust dilində yazdığınız yüksək performanslı bir alqoritmi WebAssembly formatına (.wasm faylına) kompilyasiya edərək birbaşa brauzerdə icra edə bilərsiniz.

Vacib Qeyd: WebAssembly, JavaScript-i əvəz etmək üçün yaradılmayıb. Əksinə, o, JavaScript ilə çiyin-çiyinə işləmək, ağır hesablama tələb edən tapşırıqları öz üzərinə götürərək JS-in yükünü azaltmaq üçün dizayn edilmişdir.

Wasm-ın İşləmə Prinsipləri və Kompilyasiya Tsikli

Ənənəvi JavaScript kodu brauzer tərəfindən oxunarkən Just-In-Time (JIT) kompilyatoru vasitəsilə maşın koduna çevrilir. Bu proses bir neçə mərhələdən (Parsing, AST yaradılması, Profiling, Optimizing və Re-optimizing) keçdiyi üçün vaxt aparır və CPU resurslarını xərcləyir.

WebAssembly-də isə proses tamamilə fərqlidir. Kod artıq tərtibatçı tərəfindən əvvəlcədən (Ahead-Of-Time - AOT) sıxılmış ikili formata kompilyasiya edildiyi üçün brauzer onu qəbul edən kimi çox sürətlə maşın koduna çevirir. Wasm kodu təhlükəsiz, qum qutusu (sandbox) mühitində icra olunur və brauzerin təhlükəsizlik modelinə tam riayət edir.

[ Rust / C++ Kodu ] 
       │
       ▼ (Kompilyator: LLVM / wasm-pack)
[ .wasm İkili Faylı (Bytecode) ]
       │
       ▼ (Brauzerə Yüklənmə və Dekodlaşdırma)
[ Native Maşın Kodu (X86 / ARM) ]

WebAssembly və JavaScript: Performans və Memarlıq Müqayisəsi

WebAssembly-nin niyə bu qədər sürətli olduğunu anlamaq üçün onun JavaScript ilə memarlıq fərqlərinə nəzər salmaq lazımdır. JavaScript dinamik tipli bir dildir və yaddaşın idarə edilməsi avtomatik olaraq Garbage Collector (GC) tərəfindən həyata keçirilir. Bu, proqramçının işini asanlaşdırsa da, gözlənilməz performans durğunluqlarına (GC pauses) səbəb olur.

WebAssembly isə statik tiplidir və birbaşa xətti yaddaş (Linear Memory) modelindən istifadə edir. Bu modeldə proqram yaddaşı böyük bir array (massiv) kimi görür və yaddaşın idarə edilməsi (məsələn, Rust-ın sahiblik modeli və ya C++-ın manual idarəetməsi ilə) tamamilə kod səviyyəsində tənzimlənir.

Texnoloji Müqayisə Cədvəli

ParametrJavaScriptWebAssembly (Wasm)
FormatMətn əsaslı (Source code)İkili format (Binary bytecode)
TipləşdirməDinamik (Dynamic typing)Statik (Static typing)
Yaddaş İdarəetməsiGarbage Collector (GC)Xətti Yaddaş (Linear Memory / Manual və ya Rust-safe)
Başlanğıc SürətiOrta/Zəif (Parsing və JIT gecikmələri)Çox Sürətli (Birbaşa maşın koduna yaxın dekodlaşdırma)
İcra SürətiDəyişkən (JIT optimizasiyasından asılıdır)Sabit və Native sürətə yaxın (90-95% native speed)
Əsas İstifadə SahəsiUI idarəetməsi, DOM manipulyasiyası, API sorğularıAğır riyazi hesablamalar, 3D qrafika, Kriptoqrafiya

Wasm-ın Əsas İstifadə Sahələri və Real Case Study-lər

WebAssembly-nin gücünü göstərən ən böyük nümunələrdən biri Figma platformasıdır. Figma, brauzer daxilində işləyən mürəkkəb bir dizayn alətidir. Onlar öz tətbiqlərinin daxili mühərrikini C++ dilində yazmış və WebAssembly-yə kompilyasiya etmişdirlər. Bu addım Figma-nın yüklənmə sürətini və böyük sənədlərlə işləyərkən göstərdiyi performansı 3 dəfədən çox artırmışdır.

Digər bir nümunə isə Adobe Photoshop Web versiyasıdır. Adobe, onilliklər boyu inkişaf etdirdiyi nəhəng C++ kod bazasını WebAssembly vasitəsilə brauzerə köçürərək, istifadəçilərə heç bir proqram yükləmədən birbaşa vebdə peşəkar şəkil redaktə imkanı təqdim etdi.

Wasm-ın tətbiq olunduğu digər sahələr:

  1. Brauzer daxili Süni İntellekt (On-device AI): TensorFlow.js və ya ONNX Runtime vasitəsilə maşın öyrənməsi modellərinin serverə müraciət etmədən, birbaşa istifadəçinin kompüterində (Wasm və WebGPU gücü ilə) icra edilməsi.
  2. Kriptoqrafiya və Təhlükəsizlik: Şifrələmə və deşifrələmə alqoritmlərinin yüksək sürətlə işləməsi.
  3. Oyun Mühərrikləri: Unity və Unreal Engine oyunlarının birbaşa brauzerdə, əlavə plaginlər olmadan işlədilməsi.
  4. Video və Audio Emalı: Real vaxt rejimində video axınlarının sıxılması, effektlərin tətbiqi və səs analizi.

Rust və WebAssembly ilə Praktiki Tətbiq: İlk Wasm Modulunun Yaradılması

Bu bölmədə Rust proqramlaşdırma dilindən istifadə edərək sadə, lakin yüksək performanslı bir riyazi hesablama funksiyası (məsələn, böyük bir ədədin Fibonaççi ardıcıllığını hesablamaq) hazırlayacağıq və onu JavaScript daxilində necə çağıracağımızı addım-addım görəcəyik.

Addım 1: Rust Layihəsinin Qurulması

İlk öncə sisteminizdə Rust və wasm-pack alətinin quraşdırıldığından əmin olun. Sonra yeni bir kitabxana layihəsi yaradın:

cargo new --lib wasm-fibonacci
cd wasm-fibonacci

Cargo.toml faylını açın və aşağıdakı konfiqurasiyaları əlavə edin. Bu, Rust-a layihəni dinamik kitabxana (cdylib) kimi və WebAssembly hədəfi üçün hazırlamağı tapşırır:

[package]
name = "wasm-fibonacci"
version = "0.1.0"
edition = "2021"

[lib]
crate-type = ["cdylib"]

[dependencies]
wasm-bindgen = "0.2"

Addım 2: Rust Kodunun Yazılması

src/lib.rs faylını açın və aşağıdakı kodu daxil edin. Burada wasm_bindgen atributu vasitəsilə Rust funksiyamızı JavaScript dünyasına ixrac edirik:

use wasm_bindgen::prelude::*;

// Bu atribut funksiyanın JS tərəfindən görünməsini təmin edir
#[wasm_bindgen]
pub fn fibonacci(n: u32) -> u32 {
    if n == 0 {
        return 0;
    }
    if n == 1 {
        return 1;
    }
    
    let mut a = 0;
    let mut b = 1;
    let mut c;
    
    for _ in 2..=n {
        c = a + b;
        a = b;
        b = c;
    }
    
    b
}

Addım 3: Kodun WebAssembly-yə Kompilyasiyası

Terminalda aşağıdakı əmri icra edərək Rust kodumuzu npm paketi formatında Wasm-a kompilyasiya edirik:

wasm-pack build --target web

Bu əmr layihə daxilində pkg/ adlı yeni bir qovluq yaradacaq. Bu qovluğun içində .wasm faylı və onu asanlıqla yükləmək üçün avtomatik yaradılmış JavaScript "glue" (yapışdırıcı) kodu yer alır.

Addım 4: JavaScript ilə İnteqrasiya

İndi isə yaratdığımız Wasm modulunu HTML və JavaScript daxilində istifadə edək. Bir index.html faylı yaradın və aşağıdakı strukturu qurun:

<!DOCTYPE html>
<html lang="az">
<head>
    <meta charset="UTF-8">
    <title>WebAssembly Fibonacci Test</title>
</head>
<body>
    <h1>WebAssembly və JavaScript Performans Testi</h1>
    <button id="run-btn">Hesablamanı Başlat</button>
    <div id="result"></div>

    <script type="module">
        // Avtomatik yaradılmış JS glue kodunu idxal edirik
        import init, { fibonacci } from './pkg/wasm_fibonacci.js';

        async function run() {
            // Wasm modulunu yükləyirik
            await init();

            document.getElementById('run-btn').addEventListener('click', () => {
                const n = 40;
                
                // JS tərəfində vaxtın ölçülməsi
                const t0 = performance.now();
                const result = fibonacci(n);
                const t1 = performance.now();

                document.getElementById('result').innerHTML = `
                    <strong>Nəticə:</strong> ${result} <br>
                    <strong>Hesablama müddəti:</strong> ${(t1 - t0).toFixed(4)} ms
                `;
            });
        }

        run();
    </script>
</body>
</html>

Bu sadə nümunə göstərir ki, mürəkkəb alqoritmləri Rust-da yazıb, heç bir çətinlik çəkmədən birbaşa brauzer mühitində saniyənin mində biri qədər kiçik zaman kəsiyində icra etmək mümkündür.


WebAssembly-nin Gələcəyi: WASI və Server-Side Wasm

WebAssembly-nin potensialı yalnız brauzerlərlə məhdudlaşmır. WASI (WebAssembly System Interface) standartının yaradılması ilə Wasm artıq server tərəfində (backend) və bulud (cloud) infrastrukturunda da geniş tətbiq olunmağa başlamışdır.

WASI, WebAssembly-yə əməliyyat sistemi səviyyəsində resurslara (fayl sistemi, şəbəkə və s.) təhlükəsiz şəkildə çıxış imkanı verir. Bu, Docker konteynerlərinə qarşı çox güclü bir alternativ yaradır.

"WebAssembly server tərəfində Docker-dən 100 dəfə daha sürətli başlaya (startup time) və ondan dəfələrlə az yaddaş tuta bilər. Əgər 2008-ci ildə WASI mövcud olsaydı, bəlkə də Docker-i yaratmağa ehtiyac qalmazdı." — Solomon Hykes, Docker-in həmtəsisçisi

Server-Side Wasm-ın Üstünlükləri:

  • Ultra-yüngül çəki: Bir Docker imici yüzlərlə meqabayt olduğu halda, Wasm modulu cəmi bir neçə kilobayt və ya meqabayt həcmində olur.
  • Cold Start Probleminin Həlli: Serverless (FaaS) arxitekturalarında ən böyük problem olan "soyuq başlanğıc" gecikməsi Wasm ilə mikrosaniyələr səviyyəsinə enir.
  • Platformadan Müstəqillik: Eyni .wasm faylı həm x86, həm də ARM arxitekturalı serverlərdə heç bir dəyişiklik edilmədən işləyir.

Nəticə və Gələcəyə Dair Tövsiyələr

WebAssembly, veb proqramlaşdırmanın sərhədlərini yenidən müəyyənləşdirir. O, brauzeri sadəcə sənəd oxuyucudan çıxarıb, tam funksional, ağır hesablamalar apara bilən qlobal bir əməliyyat sisteminə çevirir. Müasir texnologiya analitiki və ya proqram təminatı memarı olaraq, gələcək layihələrinizdə WebAssembly-ni nəzərə almaq rəqabət üstünlüyü qazanmağın açarıdır.

Gələcək üçün praktiki tövsiyələr:

  1. Hibrid Arxitektura Qurun: Tətbiqinizin UI və istifadəçi interfeysi idarəetməsini JavaScript/TypeScript (React, Vue, Next.js) ilə saxlayın, lakin ağır data emalı, şəkil/video manipulyasiyası və mürəkkəb riyazi hesablamaları Rust və ya C++ ilə yazılmış Wasm modullarına həvalə edin.
  2. Rust Dilini Öyrənin: Rust, WebAssembly ekosistemi üçün ən təhlükəsiz, ən sürətli və ən yaxşı dəstəklənən dildir. wasm-bindgenwasm-pack alətləri bu inteqrasiyanı son dərəcə asanlaşdırır.
  3. Edge Computing-i Araşdırın: Cloudflare Workers və ya Fastly Compute@Edge kimi platformalar vasitəsilə Wasm modullarını istifadəçiyə ən yaxın coğrafi nöqtədə (Edge) icra edərək, server gecikmələrini sıfıra endirin.

WebAssembly artıq gələcəyin deyil, bu günün texnologiyasıdır. Bu texnologiyanı mənimsəmək, istifadəçilərinizə masaüstü tətbiq sürətində veb təcrübəsi təqdim etməyin ən effektiv yoludur.

JS
YAZAR

Jamil Sultanli

Rəqəmsal marketinq, SEO və startuplar üzrə məsləhətçi. Datanın tətbiqi ilə işlərin miqyaslanması (Scaling) və inkişaf (Growth) strategiyalarının idarə olunması haqqında yazır.

Bunları da oxuyun