Rust
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.
Örnek çözümü göster
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));
}
Kendini test et
-
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
Cevabı göster
Çöp toplayıcı ve büyük runtime gerektirmediği için küçük ve hızlı modüller üretir — Boyut için opt-level = "z", lto = true ve wasm-opt sık kullanılır.
-
JS'e aç
#[____]
pub fn fib(n: u32) -> u64 { .. }
Cevabı göster
#[wasm_bindgen]
pub fn fib(n: u32) -> u64 { .. }
-
Araç ve görevi
- wasm32-unknown-unknown
- Tarayıcı hedefi
- wasm-bindgen
- Rust ↔ JS köprüsü
- wasm-pack
- npm paketi üretir
- WASI
- Sistem arayüzü
Sıradaki ders: Panic handler