Emscripten 도구를 사용하면 C/C++ 소스코드를 가져와서 .wasm 모듈로 컴파일하고, 이 모듈을 불러와서 돌리는데 필요한 자바스크립트 "접착제(glue)" 코드를 끼워넣고, HTML 문서에 코드의 실행결과를 출력할 수 있다.
https://emscripten.org/docs/getting_started/downloads.html
#include <stdio.h>
int main(int argc, char ** argv) {
printf("Hello World\n");
}
emcc hello.c -s WASM=1 -o hello.html
-s WASM=1
— wasm으로 결과물을 만들어 내는 옵션. 이것을 지정하지 않으면 기본적으로 Emscripten이 asm.js를 출력-o hello.html
— Emscripten이 코드를 실행할 HTML 페이지 (및 사용할 파일 이름)를 생성하고 wasm 모듈과 JavaScript "glue"코드를 생성하여 wasm을 컴파일하고 인스턴스화하여 웹 환경에서 사용할 수 있도록 지정로컬 하드에서 직접 읽으면 안 되고 HTTP 서버로 HTML파일을 실행해야 한다
정상적으로 Hello World가 출력되는 모습
#include <stdio.h>
#include <emscripten/emscripten.h>
int main(int argc, char ** argv) {
printf("Hello World\n");
}
#ifdef __cplusplus
extern "C" {
#endif
void EMSCRIPTEN_KEEPALIVE myFunction(int argc, char ** argv) {
printf("MyFunction Called\n");
}
#ifdef __cplusplus
}
#endif
$ emcc -o hello2.html hello2.c -O3 -s WASM=1 --shell-file template.html -s NO_EXIT_RUNTIME=1 -s EXTRA_EXPORTED_RUNTIME_METHODS='["ccall"]'
내보내기 옵션으로 자바스크립트에서 함수를 가져올 수 있음
템플릿에 버튼을 추가할 수 있다
<script type="text/javascript">
document.getElementById('my-button').addEventListener('click', () => {
var result = Module.ccall(
'myFunction', // name of C function
null, // return type
null, // argument types
null
); // arguments
});
</script>
1: MDN 웹 어셈블리 홈페이지
2: W3C. 2019. World Wide Web Consortium (W3C) brings a newlanguage to the Web as WebAssembly becomes a W3C
Recommendation
측정 결과 조건문의 경우 자바스크립트가 웹 어셈블리보다 더 뛰어난성능을 나타내는 것을 확인하였다. 반면에 반복문과 버블정렬은 자바스크립트보다 웹 어셈블리의 성능이 더 좋다는 것을 확인할 수 있었고 반복문의경우 횟수가 커질수록 자바스크립트와 웹 어셈블리간의 실행 간격이커지는 것을 확인할 수 있었다. 총 7가지의 사례를 통해 웹 어셈블리가 자바스크립트보다 성능이 더 뛰어나거나 비슷하다는 것을 관찰할 수 있었다.3
JavaScript와 비교했을 때 빠름. 특히 CPU 집약적인 작업이나 3D 그래픽, 비디오 디코딩 등의 작업에서 뛰어난 성능을 보여준다.
C, C++, Rust 등 다양한 언어로 개발할 수 있으며, 기존에 사용되는 언어로 작성된 코드를 재사용할 수 있다
웹어셈블리는 플랫폼과 운영체제에 독립적이다. 이식성이 높아서 웹어셈블리 모듈을 다른 환경에서도 재사용할 수 있다.
새로운 언어(C, C++ 등)을 학습해야 하며 JavaScript와 비교했을 때, 학습 곡선이 높고 초기 개발 시간이 오래 걸릴 수 있음.
웹어셈블리 코드는 바이너리 형식으로 컴파일되기 때문에 읽기가 어렵고 디버깅과 테스트 과정이 복잡하다
웹어셈블리는 현재 대부분의 주요 브라우저에서 지원되지만, 모든 환경에서 완벽하게 호환되지는 않을 수 있다
3: 코드 단위별 웹 어셈블리와 자바스크립트의 성능 분석, 김아영, 박태준
https://bigexecution.tistory.com/64
개인적 의견
현실적으로 당장 어떻게 웹어셈블리를 적용하는 건 무리가 있어 보인다.