Rust를 이용한 웹어셈블리 소개
서론
WebAssembly (Wasm)는 스택 기반 가상 머신을 위한 이진 명령어 형식입니다. 이는 웹 브라우저에서 네이티브에 가까운 성능을 가능하게 하며, 모든 주요 브라우저에서 지원됩니다. Rust는 WebAssembly로 컴파일되는 시스템 프로그래밍 언어이며, 고성능 웹 애플리케이션에 탁월한 선택지입니다.
왜 WebAssembly인가?
- 성능(Performance): 계산 집약적인 작업을 네이티브에 가까운 속도로 실행합니다.
- 이식성(Portability): Wasm을 지원하는 모든 브라우저에서 실행됩니다.
- 언어 유연성(Language Flexibility): Rust, C++, 그리고 다른 언어들을 웹으로 가져올 수 있습니다.
- 보안(Security): 샌드박스(Sandboxed) 실행 환경을 제공합니다.
WebAssembly를 위한 Rust 설정하기
먼저 Wasm 지원이 포함된 Rust를 설치합니다:
rustup target add wasm32-unknown-unknown
Wasm 모듈의 빌드 및 패키징을 간소화하는 wasm-pack 도구를 설치합니다:
간단한 예제 만들기
두 숫자를 더하는 기본적인 Rust 모듈을 만들어 보겠습니다:
// src/lib.rs
#[no_mangle]
pub extern "C" fn add(a: i32, b: i32) -> i32 {
...
이 함수는 두 개의 i32 매개변수를 받아 그 합계를 반환합니다. #[no_mangle] 속성은 컴파일 과정에서 함수 이름이 변경되는 것을 방지합니다.
모듈 빌드하기
다음 명령어로 프로젝트를 빌드합니다:
wasm-pack build --target web
이 명령어는 컴파일된 Wasm 파일과 JavaScript 바인딩을 포함하는 pkg 디렉토리를 생성합니다.
JavaScript에서 모듈 사용하기
모듈을 테스트하기 위해 HTML 파일을 만듭니다:
<!DOCTYPE html>
<html>
<head>
...
작동 방식
- Rust 코드가 Wasm 바이트코드로 컴파일됩니다.
- wasm-pack이 JavaScript 바인딩을 생성합니다.
- 브라우저가 Wasm 모듈을 로드하고
add 함수를 실행합니다.
- 결과가 JavaScript로 반환됩니다.
결론
WebAssembly와 Rust를 사용하면 고성능 코드를 웹으로 가져올 수 있는 강력한 방법을 제공합니다. 몇 가지 단계만 거치면, Rust 코드를 컴파일하여 브라우저에서 실행할 수 있으며, 이는 이전에 순수 JavaScript만으로는 불가능했던 복잡한 애플리케이션을 가능하게 합니다. 이미지 처리(image processing)나 게임 물리(game physics)와 같은 더 복잡한 예제를 실험해 보세요!