오보에블로그

[웹어셈블리] 웹 어셈블리란? 본문

STEADYSTUDY/넓고 얕게

[웹어셈블리] 웹 어셈블리란?

(OBO) 2020. 7. 1. 12:31
728x90

공식적인 정의

웹어셈블리WebAssembly,Wasm는 스택 기반의 가상머신을 위한 바이너리 명령 포맷이다. Wasm은 C/C++/Rust 와 같은 하이레벨 언어의 컴파일을 지원하고 웹상에 클라이언트와 서버 애플리케이션을 배포할 수 있도록 설계됐다.

 

바이너리 명령 포맷

웹어셈블리는 사실 바이너리 포맷과 텍스트 포맷과 같은 여러요소를 포함하고 있으며 Core Specification에 해당 API와 컴파일 타깃이 문서화 되어 있다. 바이너리와 텍스트 포맷은 모두 추상 구문 (abstract syntax)라는 공통 구조로 매핑된다.텍스트 포맷의 웹어셈블리 코드는 AST로 직렬화돼 바이너리 포맷(.wasm 파일)로 컴파일되며, 웹브라우저의 자바스크립트 엔진은 디코딩 스택을 이용해 .wasm 파일을 AST로 디토딩해 형식을 검사한 다음 함수를 실행하기위한 해석을 수행한다.

 

스택머신

스택머신은 스택과 명령이라는 두 개의 요소로 구성된다. 스택은 push와 pop라는 두가지 연산을 수행하는 데이터 구조이다. 아이템은 스택에 push되고, 이후 LIFO형태로 스택에 push된것이 pop된다. 스택은 또한 스택의 가장 꼭대기 아이템이 무엇인지 가리키는 포인터를 가지고 있다. 스택 명령은 스택의 아이템에 대해 수행할 작업을 나타낸다. 

 

웹어셈블리 언어 구조

- 값 : 웹어셈블리가 제공하는 값의 유형

- 명령: 스택머신 내에서 실행된다

- 트랩: 에러조건이나 실행 중단이 발생할 때 이뤄진다.

- 함수: 코드가 조직화되는 단위, 각 함수는 일련의 값을 파라미터로 사용하고 일련의 값을 반환하낟.

- 테이블 : 실행 프로그램에 의해서 선택될 수 있는 특정한 타입의 값으로 이뤄진 배열

- 선형 메모리 : 값을 저장하고 로드하는데 사용할 수 있는 원시 바이트 배열

- 모듈 : 함수와 테이블 그리고 선형 메모리를 포함하는 웹어셈블리 바이너리

- 임베더 : 웹어셈블리를 웹브라우저와 같은 호스트 실행 환경에서 실행할 수 있는 메커니즘

 

WAT

sexp : 중첩 리스트 데이터에 대한 표기법, 기본저긍로 리스트 기반의 데이터를 텍스트 형태로 간단하고 우아하게 표현하는 방법 제공

 

Wat은 여러개의 함수를 갖고 있는 모듈을 다양한 파라미터로 표현한다. 소스코드와 wat그리고 그에대한 트리 구조 간의 관계를 살펴보기 위해 파라미터로 전달된 값에 2를 더하는 간단한 C함수의 경우를 생각해보자

 

int addTwo(int num) {
	return num + 2;
    }

addTwo함수를 Wat로 변환하면 다음과 같다.

 

(module
	(table 0 anyfunc)
    (memory $0 1)
    (export "memory" (memory $0))
    (export "addTwo" (func $addTwo))
    (func $addTwo (; 0 ;) (param $0 i32) (result i32)
    	(i32.add
        	(get_local $0)
            (i32.const 2)
        )
    )
)

이를 트리로 표현하면 다음과 같다.

 

Wat를 위한 트리 구조 다이어그램
세부적인 언어 개념

WasmFiddle

C/C++ 코드를 Wat로 변환해준다.

https://wasdk.github.io/WasmFiddle/

728x90