내가 주로 사용하는 자바스크립트 구동과정을 이해하면서, 자료를 찾아보던중, WebAssembly 기술을 접하게 되었다.
어떻게 이루어지는지, 자바스크립트와 차이점은 어떤것인지 알아보고 싶어졌다.
오늘은 자바스크립트와 웹어셈블리 구동의 차이점을 보는 포스팅이다.
parse, decode
JS 파일이 브라우저에 들어오면 AST(Abstract Syntax Tree 구문 트리)로 변환된다.
AST는 우리가 작성한 js 파일이 최적화 되기지않은 low level 로 변환된 형태를 말한다.
즉, high level (js) -> low level 로 변환 하는거다.
근데 WASM 은 이미 low -level 이기때문에 구문해석만 하면 끝난다.
compile + optimize
컴파일방식과, 인터프리터 방식 두가지를 보통 언어들은 사용한다.
JS는 컴파일 방식을 하는데, JIT(Just-In-Time) 컴파일러로 바이트코드를 명령어로 바꾼다. 당연하게도 런타임에 컴파일을 전부 하는동안 컴퓨터는 실행코드를 이해할수 없다.
그런데 WASM은 LLVM 컴파일러로 최적화가 어느정도 되어있어서, JS에 비해 최적화 과정이 적다. (이부분은 추후에 컴파일러만 따로 다뤄봐야겠다.)
re-optimize
재 최적화는 JS에서만 일어나는데, JIT 컴파일러가 기존 최적화를 버리고 다시 최적화를 한다고 한다. 정확히 일어나는 시점은 다음에 알아볼 예정.
아무튼, WASM은 타입이 명시적이므로 JIT에서 데이터 수집, 타입추론 과같은 과정이 필요없다.
execute
JS 실행속도를 정확히 알려면 JIT에 대해 잘알아야한다.
근데 JIT 은 브라우저마다 다를 수 있어서 어려운데, WASM은 이미 컴파일러를 위해 작성되었기 때문에, 이상적인 명령어 셋(Instruction set) 이 이미 있어서 JS에 비해 실행 성능차이가 10~800%(?) 있다고 한다. (궁금하면 읽어보자.)
GC : Garbage Collection
Javascript 는 기본적으로 gc를 따로 관리하지 않아도 된다. (생명주기에 따라 알아서 할당/해제 된다.) WASM은 저수준 언어이기에 따로 하나하나 C,C++에서 하듯이 malloc을 써서 관리 해줘야하긴 한다. 어렵긴해도 안정적인 성능을 제공할수는 있다.
_참고자료 :