웹 어셈블리란?
웹 어셈블리란 최신 웹 브라우저에서 실행할 수 있는 새로운 유형의 코드이며 새로운 기능과 성능 면에서 큰 이점을 제공한다. 주로 손으로 작성하기 위한 것이 아니라 C,C++,Rust 등과 같은 소스 언어에 대한 효과적인 컴파일 대상이 되도록 설계 되었다. 웹 어셈블리 모듈은 웹앱으로 가져와 javascript를 통해 사용할 웹 어셈블리 기능을 노출할 수 있다.
웹 어셈블리 목표
- 빠르고 효율적이며 이식 가능하게 활용하여 다양한 플랫폼에서 거의 기본 속도로 실행할 수 있다.
- 읽기 및 디버깅 가능: 웹 어셈블리는 저수준 어셈블리 언어이지만 사람이 읽을 수 있는 텍스트 형식을 사용하여 손으로 코드를 작성하고 보고 디버깅할 수 있다.
- 보안 유지: 웹 어셈블리는 안전한 샌드박스 실행 환경에서 실행되도록 지정된다. 다른 웹 코드와 마찬가지로 브라우저의 동일 출처 및 권한 정책을 적용한다
- 웹 어셈블리는 다른 웹 기술과 원활하게 작동하고 이전 버전과의 호환성을 유지하도록 설계되었다.
웹 어셈블리 핵심 개념
모든 개념은 WebAssembly JavaScript API에 1:1로 반영된다.
- Module: 브라우저에서 실행 가능한 기계 코드로 컴파일된 WebAssembly 바이너리를 나타낸다. 모듈은 상태 비지장이므로 a와 마찬가지로 Blob창과 작업자 간에 명시적으로 공유할 수 있다. 모듈은 ES 모듈처럼 가져오기 및 내보내기를 선언한다
- Memory: WebAssembly의 저수준 메모리 액세스 명령으로 읽고 쓴 바이트의 선형 배열을 포함하는 크기 조정 가능한 ArrayBuffer이다.
- 테이블: 메모리에 원시 바이트로 저장할 수 없는 크기 조정 가능한 형식의 참조배열이다.
- 인스턴스: 메모리, 테이블 및 가져온 값 집합을 포함하여 런타임에 사용하는 모든 상태와 쌍을 이루는 모듈이다. 인스턴스는 특정 가져오기 세트를 사용하여 특정 전역으로 로드된 ES 모듈과 같다.
Javascript API는 개발자에게 모듈, 메모리, 테이블 및 인스턴스를 생성할 수 있는 기능을 제공한다. WebAssembly 인스턴스가 주어지면 JavaScript 함수는 해당 JavaScript 함수를 WebAssembly 인스턴스에 대한 가져오기로 전달하여 WebAssembly 코드에 의해 동기식으로 호출 될 수도 있다.
내 앱에서 WebAssembly를 사용하는 방법
현재 네 가지 주요 진입점
- EmScriptem으로 C/C++ 애플리케이션 포팅
- 어셈블리 수준에서 직접 WebAssembly를 작성하거나 생성한다.
- Rust 애플리케이션을 작성하고 WebAssembly를 출력으로 지정한다
- TypeScript와 유사하고 WebAssembly 바이너리로 컴파일되는 AssemblyScript 사용
C/C++에서 포팅

1. Emscripten은 먼저 C/C++를 clang+LLVM 에 공급한다.
2. Emscripten은 clang+LLVM의 컴파일된 결과를 .wasm 바이너리로 변환한다
3. WebAssembly 자체로는 현재 DOM에 직접 액세스할 수 없다. 정수 및 부동 소수점 기본 데이터 유형을 전달하는 JavaScript만 호출할 수 있다. 따라서 Web API에 액세스하려면 WebAssembly가 JavaScript를 호출해야 Web API를 호출할 수 있다. 따라서 Emscripten은 이를 달성하는 데 필요한 HTML 및 JavaScript 글루 코드를 생성한다.