contents
웹어셈블리(WebAssembly, Wasm) 는 현대 웹 브라우저에서 실행되는 소형 바이너리 형식의 저수준, 어셈블리 같은 언어입니다. 이는 직접 손으로 작성하기 위한 것이 아니라, C, C++, Rust, Go와 같은 고급 언어를 위한 이식성 높은 컴파일 대상으로 사용되도록 설계되었습니다.
본질적으로, Wasm은 다른 언어로 작성된 코드를 웹에서 네이티브에 가까운 속도로 실행하는 방법입니다.
Wasm이 해결하는 문제
수십 년 동안 자바스크립트는 웹 브라우저에서 네이티브하게 실행할 수 있는 유일한 언어였습니다. 현대의 자바스크립트 엔진은 믿을 수 없을 정도로 빠르지만, Wasm이 해결하고자 하는 두 가지 근본적인 한계에 직면했습니다.
- 예측 가능한 성능: 자바스크립트는 고급, 동적 타입 언어입니다. 이 때문에 런타임에 코드를 최적화하기 위해 복잡한 JIT(Just-In-Time) 컴파일러가 필요합니다. 3D 게임, 비디오 편집, 암호화와 같은 CPU 집약적인 작업에서는 C++이나 Rust와 같은 저수준, 정적 타입 언어의 순수하고 예측 가능한 성능을 따라잡기 어렵습니다.
- 언어 생태계: 웹은 "자바스크립트 섬"이었습니다. C++로 작성된 강력하고 기존의 라이브러리나 애플리케이션이 있다면, 느리고 복잡한 트랜스파일 과정이나 보안 및 이식성 문제가 있는 플러그인(Flash, ActiveX 등) 없이는 웹에서 실행할 수 없었습니다.
Wasm은 웹을 위한 안전하고 빠르며 언어에 구애받지 않는 실행 환경을 제공함으로써 이러한 장벽을 허물었습니다.
Wasm의 작동 원리: 핵심 개념 ⚙️
- 컴파일 대상: 개발자들은 Wasm을 직접 작성하지 않습니다. C++이나 Rust와 같은 언어로 코드를 작성한 다음, Wasm 호환 컴파일러(Emscripten, wasm-pack 등)를 사용하여 소스 코드를
.wasm파일로 컴파일합니다. - 바이너리 형식 (
.wasm):.wasm파일은 소형 바이너리 명령어 형식입니다. 단순하고 저수준 형식이므로 브라우저는 자바스크립트를 파싱하고 최적화하는 것보다 훨씬 빠르게 이를 디코딩하고 기계의 네이티브 코드로 컴파일할 수 있습니다. - 샌드박스 환경 🔒: Wasm 코드는 자바스크립트 자체와 마찬가지로 브라우저의 자바스크립트 엔진 내의 안전한 샌드박스 환경에서 실행됩니다. 이는 중요한 보안 기능입니다. Wasm은 호스트 시스템, 파일 시스템, 네트워크, 또는 문서 객체 모델(DOM)에 직접 접근할 수 없습니다. 순수한 계산 엔진입니다.
- 자바스크립트 브리지: Wasm은 스스로 외부 세계와 소통할 수 없기 때문에, 자바스크립트를 통해 통신해야 합니다.
- 임포트(Imports): Wasm 모듈은 자바스크립트로부터 "임포트"해야 하는 함수를 선언할 수 있습니다. 예를 들어, 웹 페이지의 무언가를 변경하려면 DOM을 조작하는 JS 함수를 임포트해야 합니다.
- 익스포트(Exports): Wasm 모듈은 자신의 함수를 "익스포트"할 수 있으며, 이렇게 익스포트된 함수는 자바스크립트에서 호출할 수 있습니다.
이는 Wasm과 자바스크립트가 함께 작동하도록 설계되었음을 의미합니다. 자바스크립트는 애플리케이션의 "접착제" 역할을 하여 UI, 이벤트, API 호출을 처리하고, Wasm은 성능이 중요한 무거운 계산 작업을 담당합니다.
브라우저를 넘어서: WASI 🌍
웹어셈블리의 비전은 브라우저를 훨씬 넘어 확장되었습니다. 이 분야에서 가장 큰 발전은 WASI(WebAssembly System Interface) 입니다.
- 문제점: Wasm 모듈은 샌드박스 환경에 있고 시스템 리소스에 접근할 수 없습니다. 그렇다면 어떻게 서버에서 실행되면서 파일 읽기나 네트워크 연결 열기와 같은 유용한 작업을 할 수 있을까요?
- 해결책: WASI는 Wasm 모듈에 시스템 수준 리소스에 대한 안전하고 이식성 있는 접근을 제공하는 표준화된 API입니다. 이는 Wasm 코드와 호스트 운영 체제 사이의 추상화 계층 역할을 합니다.
Wasm + WASI를 사용하면, 프로그램을 한 번 컴파일하여 .wasm 파일로 만들고, 클라우드, 엣지 서버, IoT 기기, 브라우저 등 호환되는 런타임 어디에서나 안전하게 실행할 수 있습니다. 이는 Wasm을 도커와 같은 기술의 대안이 되는 보편적이고 가벼운 애플리케이션 런타임으로 만듭니다.
주요 특징 및 목표
- 빠름: Wasm의 바이너리 형식은 효율적인 디코딩 및 실행을 가능하게 하여, 계산 집약적인 작업에서 네이티브에 가까운 성능을 제공합니다.
- 이식성: 모든 현대 브라우저(크롬, 파이어폭스, 사파리, 엣지)와 Wasm 런타임이 있는 모든 OS에서 실행됩니다.
- 안전함: 샌드박스 모델과 외부 세계와의 잘 정의된 인터페이스는 악성 코드가 호스트 시스템에 접근하는 것을 방지합니다.
- 언어 독립적: 웹과 그 너머에 폴리글랏(다중 언어) 환경을 제공하여, 개발자가 작업에 적합한 언어를 사용할 수 있게 합니다.
일반적인 사용 사례
- 고성능 웹 애플리케이션: 브라우저 내 비디오 및 오디오 편집, 과학 시뮬레이션, CAD 애플리케이션 (예: AutoCAD 및 Photoshop의 웹 버전은 Wasm으로 구동됨).
- 웹 게이밍: Unity 및 Unreal Engine과 같은 게임 엔진은 게임을 Wasm으로 컴파일하여 브라우저에서 실행할 수 있습니다.
- 서버리스 및 엣지 컴퓨팅: Wasm의 작은 크기와 빠른 시작 시간은 서버리스 함수를 위한 컨테이너의 훌륭한 대안이 됩니다.
- 이식성 있는 라이브러리: 복잡한 라이브러리(압축 또는 암호화 알고리즘 등)를 Rust나 C++로 만들고 Wasm으로 컴파일하면, 웹 애플리케이션, Node.js 및 기타 환경에서 사용할 수 있습니다.
references