WebAssembly(Wasm) 생태계는 브라우저를 넘어 서버, 엣지, 임베디드 환경으로 확장되고 있다. WASI, Wasmer, Wasmtime, Component Model 등이 범용 실행 환경을 구성한다.
Wasm 실행 환경 비교
| 런타임 | 환경 | 특징 | 용도 |
|---|
| 브라우저 | 클라이언트 | V8/SpiderMonkey 내장 | 웹 앱 |
| Wasmtime | 서버 | Rust 구현, Bytecode Alliance | 서버사이드 |
| Wasmer | 서버 | 다중 백엔드, 패키지 관리 | 범용 |
| WasmEdge | 엣지/클라우드 | 경량, AI 지원 | 서버리스 |
| wasm3 | 임베디드 | 인터프리터, 초경량 | IoT |
WASI (WebAssembly System Interface)
WASI: Wasm 모듈이 OS 기능(파일, 네트워크, 시간)에 접근하는 표준 인터페이스
POSIX와 비슷하지만:
- 캐퍼빌리티 기반 보안 (명시적 권한 부여)
- 플랫폼 독립적
- 샌드박스 내에서 동작
WASI 버전:
- wasi_snapshot_preview1: 현재 대부분 구현
- WASI Preview 2 (WASIp2): Component Model 기반
Rust → Wasm 컴파일
rust
// src/lib.rs
use wasm_bindgen::prelude::*;
# [wasm_bindgen]
pub fn fibonacci(n: u32) -> u64 {
match n {
0 => 0,
1 => 1,
_ => {
let (mut a, mut b) = (0u64, 1u64);
for _ in 2..=n {
let c = a + b;
a = b;
b = c;
}
b
}
}
}
# [wasm_bindgen]
pub fn process_image(data: &[u8]) -> Vec<u8> {
// 고성능 이미지 처리
data.iter().map(|&x| 255 - x).collect() // 반전
}
javascript
// JavaScript에서 사용
import init, { fibonacci, process_image } from './pkg/my_wasm.js';
await init(); // Wasm 모듈 초기화
console.log(fibonacci(40)); // 102334155 (빠른 계산)
// 이미지 처리 (TypedArray 공유)
const imageData = new Uint8Array([255, 128, 64, 200]);
const result = process_image(imageData);
Component Model (미래)
Wasm Component Model:
- 언어 중립적 인터페이스 정의 (WIT: Wasm Interface Types)
- Rust, Python, JS, Go 컴포넌트가 서로 호출 가능
- 강타입 인터페이스
WIT 예시:
package my:greet;
interface greeter {
greet: func(name: string) -> string;
}
관련 문서