WebAssembly
- Rust kursu
- Uzman
- Ders 34/46
- 4 dk
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)); // 55wasm32-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
fn main() {
// buraya yaz
}Örnek çözüm
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ç
#[____]
pub fn fib(n: u32) -> u64 { .. }
#[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ü |