한컴테크를 통해 한컴의 기술을 공유합니다. 한컴의 프로그래밍, 프레임워크, 라이브러리 및 도구 등 다양한 기술을 만나보세요. 한컴 개발자들의 다양한 지식을 회사라는 울타리를 넘어 여러분과 공유합니다. 한컴이 제공하는 기술블로그에서 새로운 아이디어와 도전을 마주하고, 개발자가 꿈꾸는 미래를 실현하세요.

한컴테크

WebAssembly(WASM) & WASI 2024 : 크로스플랫폼의 미래

한 줄 요약
  • Wasm 기술과 WASI 인터페이스의 2024년 발전 방향과 그것이 가져올 변화를 알아보겠습니다.

#WebAssemnbly #Wasm #WASI #기술동향

📣 WebAssembly(Wasm) & WASI 2024 : 크로스플랫폼의 미래

1. 어떤 프로그래밍 언어로도 개발


1.1. Wasm 기술

WebAssembly(이하 Wasm)는 2015년부터 JavaScript의 느린 속도를 보완하기 위해 개발이 되었습니다.

Wasm은 C, C++, JavaScript, Rust, Go, Python 등의 프로그래밍 언어로 작성된 소스 코드를 저수준의 바이트코드로 컴파일하여 웹 브라우저상에서 동작할 수 있도록 하는 런타임 환경으로 개방형 표준 기술입니다.

출처 – WebAssembly: Docker without containers!

Wasm 모듈로 컴파일할 수 있는 언어는 공식 웹사이트에서 확인할 수 있습니다.

Emscripten 도구를 사용하면 C/C++ 언어로 작성된 프로그램을 Wasm 모듈로 변환할 수 있습니다.

💡 Emscripten 이란?

Emscipten은 C/C++ 코드를 Wasm 형식으로 컴파일할 수 있도록 도와주는 LLVM 기반 오픈 소스 컴파일러입니다.

Rust는 기본적으로 C/C++과 유사한 형태로 Wasm 변환이 자연스러워 최근 Wasm 개발 언어로 많이 사용되고 있습니다. Wasm-bindgen 도구를 사용해서 Rust와 JavaScript 간의 코드를 연동할 수 있습니다.

1.2. Wasm 런타임

Wasm 런타임은 Wasm 바이너리 코드를 로드하고 실행할 수 있는 환경입니다. Wasm 바이너리를 실행하는 데 필요한 인프라를 제공합니다.

출처 – Choosing a WebAssembly Run-Time

Wasm의 가장 매력적인 특징은 샌드박스 실행 모델이라는 것입니다. 이러한 특징은 플랫폼의 보안이 샌드박스를 구현하는 Wasm 런타임에 의해 크게 좌우된다는 것을 의미합니다.

V8은 Google Chrome과 Node.js에서 사용하는 Wasm 런타임입니다. 현재 다른 Wasm 런타임으로 WasmerWasmtimeWasmEdge 등이 있으며 빠르게 진화하고 있습니다.

1.3. Wasm의 장점

성능

  • 여러 언어로 작성된 코드를 기계어에 가까운 속도로 웹 브라우저상에서 실행할 수 있습니다. 웹 브라우저에서 더욱 복잡하고 기능적인 애플리케이션의 개발을 가능하게 합니다.

보안

  • Wasm 런타임에서 실행되는 코드는 샌드박스 안에서 메모리가 할당되고 기능이 제한됩니다. 기존의 웹 기술들과 동일한 수준의 보안을 제공합니다.
💡 샌드박스(Sandbox)란?

어떤 응용 프로그램이나 프로세스가 다른 시스템 자원에 대한 액세스를 격리하고 제한하는 보안 메커니즘을 나타냅니다. 즉, 샌드박스는 애플리케이션이나 프로세스가 시스템 전체에 영향을 미치는 것을 방지하고, 보안 측면에서 안전한 환경을 제공합니다.

다양성

  • 40개 이상의 언어를 Wasm으로 컴파일할 수 있습니다. C, C++, Rust 등의 시스템 언어와, Go, Python, Ruby와 같은 garbage collection 언어까지 웹에서 실행할 수 있습니다.

이식성

  • Wasm은 중간 코드로 변환을 통해서 모든 주요 브라우저에서 지원하며, 여러 주요 런타임에서 대부분의 CPU(x86, ARM, RISC-V)와 Linux, Windows, macOS 및 비 Posix를 포함한 대부분의 OS를 지원합니다.
💡 Wasm 중간 코드(IR, Intermediate Representation)란?

Wasm은 실제 물리적 기계(x86, ARM 등)가 아닌 개념적인 기계를 위한 가상 명령어입니다. 고급 언어(C, C++ 등)를 플랫폼에 종속적이지 않은 중간 코드(IR)로 변환된 후 최적화됩니다. Java 컴파일러와 다르게 컴파일 시점에 최적화가 이루어지기 때문에 실행 성능이 향상됩니다. 이후 IR에서 Wasm 바이트코드로 컴파일하게 됩니다.

Wasm IR
get_local 0
i64.eqz
if (result i64)
    i64.const 1
else
    get_local 0
    get_local 0
    i64.const 1
    i64.sub
    call 0
    i64.mul
end
Wasm Binary (.wasm)
20 00
50
04 7E
42 01
05
20 00
20 00
42 01
7D
10 00
7E
0B

1.3. Wasm 활용 제품

Wasm의 장점들로 인해 데스크톱 앱과 동일한 품질과 성능의 웹 앱으로 활용되고 있습니다.

Figma

웹 기반 UI/UX 디자인 및 프로토타이핑을 위한 협업 도구

Sketch Up

스케치, 공유, 개선, 제작 및 아이디어 실현을 위한 3D 모델링 도구

AutoCAD

2D 및 3D 설계 워크플로우 최적화를 위한 CAD 자동화 도구

2. 컴파일 한 번으로 어디서든 실행


2.1. WASI 인터페이스

Wasm 기술을 웹 브라우저 이외의 환경에서도 실행하기 위해 표준화되고 있는 기술이 WebAssembly System Interface(이하 WASI) 인터페이스입니다. 서버 플랫폼에서 Wasm 모듈을 실행할 때 필요한 시스템 인터페이스를 제공합니다.

응용 프로그램이 파일, 메모리 및 네트워크 연결과 같은 시스템 리소스에 접근하기 위해서는 프로그래밍 언어에서 제공하는 표준 라이브러리를 사용하게 됩니다. Wasm은 OS 플랫폼에 종속적이지 않기 때문에 개념적인 OS를 위한 시스템 인터페이스가 필요합니다.

다음은 기본 모듈인 wasi-core에서 제공하는 사항입니다.

  • files
  • network connections
  • clocks
  • random number

WASI의 목표는 여러 면에서 운영체제 호환성 표준인 POSIX와 유사합니다.

💡 POSIX란?

Portable Operating System Interface의 약자로 서로 다른 UNIX OS의 공통 API를 정리하여 이식성이 높은 유닉스 응용 프로그램을 개발하기 위한 목적으로 표준화 제정한 인터페이스 규격입니다.

현재 garbage collection, network I/O 및 async, threading 등의 많은 표준 제안이 진행 중입니다.

WASI Preview 1

  • 2019년에 공개된 WASI 개발 스냅샷입니다. 운영 체제 계층에 가까워졌지만 한계가 있었습니다.

WASI Preview 2

  • 2024년 초에 출시된 WASI 버전으로 WIT, Wasm 컴포넌트 및 모든 종류의 표준 인터페이스 기반을 구축하였습니다.

2.2. Wasm 컴포넌트 모델

Wasm 컴포넌트 모델로 하나의 Wasm 바이너리가 다른 Wasm 바이너리를 라이브러리로 사용할 수 있게 됩니다. 컴퓨팅 역사상 최초로 다른 언어 간의 라이브러리가 함께 연동될 수 있을 것입니다.

WIT(Web Assembly Interface Types) 표준 IDL 구문을 활용하면 프로그래밍 언어에 상관없이 Wasm 인터페이스를 사용할 수 있습니다. Wasm 호스트와 게스트가 공통적인 방식으로 데이터를 주고받는 코드를 컴파일할 수 있게 됩니다.

2.3. WASI + Wasm 런타임

브라우저가 아닌 환경을 위해 개발된 Wasm 런타임이 WASI 인터페이스를 지원하면서 브라우저 외부에서 Wasm 애플리케이션이 실행될 수 있게 되었습니다.

WASI + Wasm 런타임으로 Linux, Windows, macOS와 같은 기존 OS에서 Wasm 모듈을 실행할 수 있습니다.

출처 – WebAssembly: Docker without containers!

2.4. 서버 인프라로 활용

기존의 Docker 컨테이너는 x86, ARM과 같은 시스템 아키텍처에 따라 이미지를 생성해야 합니다.

Wasm과 WASI의 이식성을 활용해서 OS 수준의 종속성 없이 서버 인프라를 배포할 수 있습니다. 그리고 네이티브에 가까운 성능과 빠른 배포 시간, 샌드박스에 의한 높은 보안을 제공합니다.

💡 그럼 Wasm이 Docker를 대체할까?

아니요, 하지만 Docker가 리눅스 컨테이너, 윈도우 컨테이너, Wasm 컨테이너를 나란히 실행하는 미래를 상상해 보세요. 시간이 지나면 Wasm이 가장 인기 있는 컨테이너 유형이 될 수도 있습니다. Docker는 이 모든 것을 동등하게 사랑하고 모두 실행할 것입니다. 

출처 – Solomon Hykes on Twitter / X

Conclusion


Wasm은 웹 브라우저 환경에 한정하지 않고 지원 영역을 확장하는 과정에 있습니다. 어떤 프로그래밍 언어로도 개발하고, 컴파일 한 번으로 어디서든 실행 가능한 크로스플랫폼 기술로 발전하고 있습니다.

Docker 공동 설립자 Solomon Hykes는 다음과 같이 말했습니다.

“2008년에 Wasm+WASI가 있었다면 Docker를 만들 필요가 없었을 것입니다. 서버의 WebAssembly는 컴퓨팅의 미래입니다.”

출처 : Solomon Hykes on Twitter / X

Wasm은 지속적으로 진화하고 있습니다. 2023년 Wasm이 현장에서 폭발적으로 이슈화된 해라고 하면, 2024년은 Wasm 제품화가 시작되는 해라고 할 수 있을 것입니다.

References


Scroll to Top