CodeBlanks Logo Icon CodeBlanks

WebAssembly

wasm32 hedefi ile WebAssembly üretmeyi öğrenirsin.

WebAssembly

Rust, tarayıcıda ve sunucuda çalışan WebAssembly'ye derlenebilir: rustup target add wasm32-unknown-unknown. wasm-bindgen, Rust fonksiyonlarını JavaScript'e açar ve tür dönüşümlerini yapar; wasm-pack bir npm paketi üretir:

use wasm_bindgen::prelude::*;

#[wasm_bindgen]
pub fn fib(n: u32) -> u64 {
    let (mut a, mut b) = (0u64, 1u64);
    for _ in 0..n { (a, b) = (b, a + b); }
    a
}

// JavaScript:
// import init, { fib } from "./pkg/hesap.js";
// await init(); console.log(fib(10));   // 55

wasm32-unknown-unknown hedefinde dosya sistemi ve thread yoktur; wasm32-wasip1 (WASI) ise sınırlı bir sistem arayüzü sunar.

Hedefe göre koşullu kod

Aynı crate hem yerel hem wasm için derlenebilir; platforma özgü parçalar cfg ile ayrılır:

fn ortam() -> &'static str {
    if cfg!(target_arch = "wasm32") { "wasm" } else { "yerel" }
}

#[cfg(target_arch = "wasm32")]
fn zaman() -> f64 { /* js_sys::Date::now() */ 0.0 }

#[cfg(not(target_arch = "wasm32"))]
fn zaman() -> f64 { /* std::time */ 0.0 }

Saf hesap fonksiyonları (yukarıdaki fib gibi) hiçbir değişiklik olmadan her iki hedefte çalışır.

Uygulama Taşınabilir hesap

Yukarıdaki ortam ve fib fonksiyonlarını (wasm_bindgen olmadan) yaz. ortam() ve fib(10) sonuçlarını boşlukla yazdır.

Başlangıç kodu

main.rs
fn main() {
    // buraya yaz
}

Örnek çözüm

main.rs
fn ortam() -> &'static str {
    if cfg!(target_arch = "wasm32") {
        "wasm"
    } else {
        "yerel"
    }
}

pub fn fib(n: u32) -> u64 {
    let (mut a, mut b) = (0u64, 1u64);
    for _ in 0..n {
        (a, b) = (b, a + b);
    }
    a
}

fn main() {
    println!("{} {}", ortam(), fib(10));
}

Beklenen çıktı

yerel 55

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 WebAssembly için Rust'ın güçlü olmasının nedeni nedir?

  • JavaScript'ten daha kolaydır
  • Tek seçenektir
  • Güçlü değildir
  • Çöp toplayıcı ve büyük runtime gerektirmediği için küçük ve hızlı modüller üretir Doğru cevap

Açıklama: Boyut için opt-level = "z", lto = true ve wasm-opt sık kullanılır.

2 JS'e aç

Soru
#[____]
pub fn fib(n: u32) -> u64 { .. }
Cevap
#[wasm_bindgen]
pub fn fib(n: u32) -> u64 { .. }

Açıklama: #[wasm_bindgen] fonksiyonu JavaScript'ten çağrılabilir yapar.

3 Araç ve görevi

Kavram Anlamı
wasm32-unknown-unknown Tarayıcı hedefi
wasm-bindgen Rust ↔ JS köprüsü
wasm-pack npm paketi üretir
WASI Sistem arayüzü

Uzman bölümündeki tüm dersler