WebAssembly: 의미, 장점, 사용 사례 등
게시 됨: 2022-10-12WebAssembly 또는 Wasm은 모든 컴퓨터 아키텍처에서 실행할 수 있는 프로그램을 만들기 위한 이진 코드 형식입니다.
시스템은 가상 머신과 C 또는 C++와 같은 프로그래밍 언어의 컴퓨터 코드를 사람이 읽을 수 있는 .wat 및 바이너리 .wasm 형식으로 변환하는 컴파일러로 구성됩니다.
WebAssembly의 원래 목표는 브라우저 내에서 네이티브에 가까운 실행 속도를 가능하게 하여 프로그래머가 웹 페이지용 고성능 애플리케이션을 개발할 수 있도록 하는 것이었습니다. 그러나 이 기술은 이제 브라우저를 넘어 클라우드로 진화하는 것 같습니다.
이 가이드는 이 진화하는 기술, 강점과 약점, 미래 잠재력에 대해 알아야 할 모든 것을 보여줍니다.
목차
웹어셈블리란?
WebAssembly는 가상 머신에서 실행되고 다른 언어로 컴파일할 수 있는 바이너리 코드 형식입니다. 이식 가능하도록 설계되었으며 웹 브라우저 또는 서버 응용 프로그램에서 실행할 수 있습니다.
2017년에 처음 출시된 WebAssembly는 2019년부터 W3C 권장 사항이며 Mozilla, Google, Microsoft, Red Hat 등을 비롯한 수많은 기여자가 유지 관리합니다.
원래 목표는 브라우저 내부의 C/C++ 응용 프로그램에서 볼 수 있는 거의 기본 실행 속도를 개발하는 것이었습니다. 또한 이전 버전과 호환되고 JavaScript와 호환되는 안전한 개방형 표준, 디버그 가능 및 버전 없는 웹 표준을 의미합니다.
WebAssembly는 어떻게 작동합니까?
WebAssembly는 .wasm 바이너리 또는 .wat 텍스트 형식으로 컴파일된 컴퓨터 코드를 실행하기 위해 브라우저나 서버 환경에 포함될 수 있는 Java 또는 JavaScript와 같은 런타임 엔진으로 설계되었습니다.
WebAssembly 실행을 위한 코드를 작성하기 위해 개발자는 지원되는 수많은 언어 중 하나로 프로그램을 작성합니다. 그런 다음 WebAssembly 컴파일러를 사용하여 AOT(Ahead of Time) 또는 JIT(Just In Time)를 사용하여 컴파일합니다.
이 코드는 실행 환경에서 대부분의 작업을 수행할 수 있지만 브라우저의 DOM 개체에 액세스하거나 수정할 수는 없습니다. 이러한 상호 작용은 JavaScript를 통과해야 합니다.
샘플 WebAssembly 애플리케이션을 만드는 방법
아래에서 볼 수 있는 것처럼 몇 단계만 거치면 웹 브라우저용 Wasm 애플리케이션을 간단하게 만들 수 있습니다.
- Emscripten SDK를 다운로드하여 설치합니다.
- 샘플 helloworld.c 코드를 작성하거나 원하는 경우 C++/Rust에서 수행하십시오.
- 터미널에서 emcc helloworld.c -s WASM=1 -s helloworld.html 을 실행하여 Emscripten을 사용하여 코드를 WebAssembly로 컴파일합니다. 필요한 Wasm 바이너리, HTML 및 JavaScript 파일(접착제 코드)을 생성합니다.
- 웹 브라우저를 통해 helloworld.html 페이지를 제공합니다.
웹어셈블리의 장점
WebAssembly 및 관련 기술을 채택해야 하는 이유는 다음과 같습니다.
- 네이티브에 가까운 성능 – WebAssembly는 C 및 C++와 같은 저수준 언어와 유사한 성능을 제공하는 저수준 설계를 가지고 있습니다.
- 보안 – 시스템 액세스가 제한된 가상 환경에서 시스템을 격리하여 보안을 유지하도록 설계되었습니다.
- 개방형 표준 – 많은 조직과 개인이 WebAssembly에 기여하고 있으며 공식 W3C 권장 사항입니다.
- 경량 – WebAssembly는 가상 머신에서 실행될 바이너리 코드로 컴파일됩니다. 이 코드는 이식 가능하며 시스템 파일이 필요하지 않거나 함께 제공되지 않습니다.
- 다국어 지원 – 50개 이상의 언어를 WebAssembly로 컴파일할 수 있습니다.
- 플랫폼 독립적 – WebAssembly 가상 머신은 각 아키텍처가 동일한 런타임 환경을 제공하도록 설계되었습니다. 개발자는 WebAssembly용 코드를 작성하기만 하면 됩니다.
웹어셈블리의 한계
- 작업 진행 중 – 표준은 아직 개발 중이므로 많은 기능과 개선 사항이 아직 제공되지 않습니다.
- 가비지 수집 없음 – WebAssembly는 곧 구현될 수 있지만 여전히 가비지 수집이 부족합니다.
- DOM 액세스 없음 – WebAssembly에서 직접 웹 브라우저의 DOM에 액세스할 수 없으며 JavaScript를 통해 이동해야 합니다.
웹어셈블리 대 자바
Java는 WebAssembly의 가장 초기 구현입니다. 한 번만 쓰고 어디에서나 실행할 수 있는 언어로 설계되었지만 그 과정에서 많은 문제가 발생했습니다.
Java와 마찬가지로 WebAssembly는 RE(런타임 환경)를 사용하여 코드를 실행하지만 Java와 달리 WebAssembly를 원하는 언어로 작성할 수 있습니다.

웹어셈블리 대 자바스크립트
WebAssembly는 JavaScript와 마찬가지로 브라우저 또는 기타 호스트 환경에서 실행됩니다. 그러나 JavaScript가 텍스트 형식으로 실행 환경에 전달되고 적시에 컴파일되는 경우 WebAssembly에는 텍스트 형식과 바이너리 형식이 모두 있습니다.
웹 브라우저 내에서 JavaScript는 DOM에 액세스할 수 있지만 WebAssembly는 액세스할 수 없습니다. 그러나 실행 속도와 관련하여 WebAssembly는 네이티브에 가까운 코드 실행 속도로 JavaScript를 능가합니다.
속도는 WebAssembly가 빛나는 곳이며 많은 용도에 이상적인 이유입니다. JavaScript를 사용하여 WebAssembly를 브라우저에 로드할 수 있으며 두 코드는 함께 실행되고 리소스를 공유할 수 있습니다.
WebAssembly 대 Docker 대 Kubernetes
Docker와 Kubernetes는 클라우드 컴퓨팅을 지원하는 인기 있는 두 가지 기술입니다. Docker는 개발자가 모든 시스템 종속성과 함께 애플리케이션을 단일 패키지로 패키징할 수 있도록 하는 컨테이너 기술입니다. 이를 통해 1초 이내에 모든 클라우드 환경에 애플리케이션을 쉽게 배포할 수 있습니다.
반면 Kubernetes는 Docker, CRI-O, containerd 및 모든 Kubernetes CRI(컨테이너 런타임 인터페이스) 구현과 같은 컨테이너화된 애플리케이션을 관리하고 배포하는 오픈 소스 시스템입니다. 또한 Kubernetes를 사용하면 여러 서버 또는 가상 머신에 걸쳐 클라우드 배포를 쉽게 확장할 수 있습니다.
이러한 관점에서 WebAssembly는 Docker와 더 유사하며 Kubernetes를 사용하여 컨테이너화된 클라우드 애플리케이션으로 실행할 수 있습니다. 또한 Docker에 비해 많은 이점을 제공하지만 이를 대체하지는 않을 것입니다.
브라우저 너머
태초에 웹 서버가 있었습니다. 전체 시스템을 서버로 전용해야 했습니다. 그런 다음 서버가 하나 이상의 CPU 스레드에서 실행되도록 허용하는 가상 머신 또는 VM이 있었습니다. 그래도 전용 VM이 있어야 했습니다.
클라우드 컴퓨팅은 애플리케이션을 컨테이너화하여 필요할 때만 서버를 실행하고 실행할 수 있게 했습니다. 따라서 더 이상 전용 기계가 필요 없이 사용한 만큼만 비용을 지불하면 되므로 비용이 절감됩니다. 그러나 여전히 몇 가지 문제가 있습니다.
첫째, 도커 파일의 크기는 몇 기가바이트일 수 있으며 이는 시작 및 기타 관리 문제에 약간의 지연이 있음을 의미합니다. 그러나 유사한 Wasm 파일은 미리 컴파일된 바이너리이기 때문에 크기가 몇 MB에 불과할 수 있습니다. 이것은 Docker보다 훨씬 빠른 시작 시간을 제공하여 특정 시간이 중요한 애플리케이션에 적합합니다.
둘째, WebAssembly의 설계는 개발자가 시스템 리소스를 관리하고 할당할 필요가 없으며 선택한 프로그래밍 언어를 사용하여 간단하게 요점에 도달할 수 있음을 의미합니다.
이러한 기능으로 인해 WebAssembly는 클라우드 마이크로 서비스를 실행하는 데 이상적이지만 Docker 애플리케이션은 운영 환경 및 파일 시스템에 대한 더 많은 제어가 필요한 애플리케이션에 여전히 선호됩니다.
자세한 내용은 WasmCloud 및 WasmEdge와 같은 프로젝트에서 WebAssembly를 실행 가능한 컴퓨팅 플랫폼으로 개발하고 있습니다.
Wasm 사용 사례
WebAssembly의 고유한 특성을 감안할 때 많은 사용 사례가 있습니다. 그들은 세 가지 주요 그룹으로 나눌 수 있습니다. 브라우저 내, 브라우저 외부 및 하이브리드 설정.
브라우저 내 유형은 설명이 필요 없으며 브라우저 외부는 주로 서버, IoT 및 클라우드 배포를 나타내는 반면 하이브리드는 이 둘의 혼합을 나타냅니다.
다음은 Wasm이 탁월한 사용 사례를 보여줍니다.
- 이미 존재하는 고성능 코드 – WebAssembly로 이식할 수 있는 오래되었지만 놀라운 코드입니다.
- 새로운 고성능 코드 – 처음부터 설계하고 구현해야 하는 코드입니다.
- 데스크탑 애플리케이션을 웹으로 포팅 – 이것은 웹 기반 비디오 편집과 같은 새로운 유형의 웹 기반 데스크탑 솔루션을 열 수 있습니다.
- 클라우드 컴퓨팅 – 새로운 기회를 위해 Docker 및 Kubernetes와 함께 실행합니다.
다음은 Wasm이 탁월할 수 있는 특정 응용 프로그램 및 시나리오를 보여줍니다.
- 비디오 및 이미지 편집
- 게임 디자인
- AI 애플리케이션
- 가상 및 증강 현실 애플리케이션
- 음악 응용 프로그램
- P2P 애플리케이션
- 서버측 애플리케이션
- 클라우드/클러스터 계산
- 컴퓨터 지원 설계
- OS 플랫폼 시뮬레이션
- 암호화
- 로컬 웹 서버
- 원격 데스크톱 애플리케이션
- 과학적 시각화
- 스마트폰의 하이브리드 네이티브 앱
- IoT 기기에서
지원되는 언어 및 프레임워크 목록
50개 이상의 언어가 WebAssembly로 컴파일되며 가장 인기 있는 언어는 다음과 같습니다.
- 씨
- C++
- 아르 자형
- 루비
- 빠른
- 가다
- 코틀린
- 녹
- PHP
- Blazor – .NET 개발자를 위한 프레임워크입니다.
- JwebAssembly – Java 바이트코드 및 JRuby, Jython, Groovy, Scala 및 Kotlin과 같은 관련 언어용 컴파일러입니다.
- Yew – WebAssembly를 사용하여 다중 스레드 웹 앱을 만들기 위한 Rust 프레임워크입니다.
- AssemblyScript – WebAssembly 코드를 생성하도록 특별히 설계된 언어입니다.
- Grain – 강력한 형식의 함수형 언어입니다.
- 모토코
여기에서 더 많은 언어를 찾을 수 있습니다.
WebAssembly 런타임 및 도구 목록
- 모든 주요 브라우저에는 Wasm이 지원됩니다.
- Pyodide – Pandas, NumPy, SciPy를 포함한 Python 과학 스택이 있는 브라우저의 Python 런타임입니다.
- 워머
- wagi – 마이크로 서비스 및 웹 앱용
- Wasi – 모듈식 시스템 인터페이스
- WasmTime – 빠르고 안전한 WebAssembly 런타임.
- 와스머
- 루셋
- wasmCloud – 클라우드 환경
- Krustlet – Rust로 작성된 Wasm 실행을 위한 Kubernetes kublete.
- WasmEdge – 클라우드 및 에지 런타임 환경
결론
WebAssembly와 WebAssembly가 컴퓨팅에 필요한 것의 여정이 끝났습니다. 그리고 보시다시피, 그것은 많은 약속을 담고 있습니다.
아직 진행 중인 작업이지만 끊임없는 개발입니다. 관심이 있으시면 여기, 여기, 여기에서 더 많은 정보를 찾을 수 있습니다.