자 그럼 바로 JIT 컴파일러에 대해 살펴보도록 하겠습니다.
JIT가 하는 첫 번째 일을 바로 코드를 파싱(parse the code)하는 것입니다
const
혹은 function
키워드를 통해 같이 의미론적으로 쓰인 언어가(meaningful to the language)가 분리되고, 트리 구조(tree structure)로 저장됩니다.간단한 프로그램이 있다고 가정해보겠습니다. 그 프로그램에 우리가 f
함수를 선언한다면 함수는 아래와 그림과 같은 AST로 분해됩니다.
출처 -https://v8.dev/blog/background-compilation
즉, 다음과 같은 단계를 거치게 됩니다.
참고로 이 트리는 DOM tree와 전혀 연관되어있지 않습니다. 전혀 없습니다.
이렇게 생성된 머신코드는 즉시 실행됩니다. 이것이 모던 자바스크립트 엔진이 JIT컴파일러 (just-in-time compilation)이라고 불리는 이유입니다. 그리고 실행은 자바스크립트 엔진인 콜 스택(call stack)에서 실행됩니다.
모던 자바스크립트 엔진은 사실 굉장히 옵티마이제이션(optimization) 전략을 가지고 있습니다.
처음에는 실행 즉시 옵티마이징 되지 않은(unoptimized) 버전의 머신 코드를 생성합니다. 하지만, 프로그래밍이 실행되는 동안 뒤편에서는 코드의 옵티마이징과 재컴파일을 수행합니다.
프로그램이 실행되는 순간에도 뒤편에서 이 과정이 재차 수행되는 되고, 옵티마이징 되지 않은 코드는 옵티마이징 된 코드들과 교환(swap)됩니다.
이것이 바로 v-8과 같은 모던 자바스크립트 엔진의 핵심 키워드라고 볼 수 있습니다. 컴파일과 옵티마이제이션은 우리가 코드로는 접근 할 수 없는 특별한 스레드(threads) 안에서 일어납니다. 우리가 쓴 코드의 실행을 수행하는 메인 스레드(main threads)와는 완전히 분리되어 있습니다.
여기까지가 모던 자바스크립트 JIT 컴파일러에 관한 이야기입니다. 자바스크립트 구동 방식에 대해 이해하기 위한 글이기 때문에 흐름을 이해할 수 있는 정도로 글을 작성하고 있습니다.
AST 혹은 V-8 엔진에 대해서 더 궁금하신 것이 있다면, 하위 참조를 확인해주세요. 다음 글에서는 자바스크립트 런타임(Javascript Runtime)을 통해 어떻게 동작하는지 알아보고자 합니다.
AST for JavaScript developers
AST for JavaScript developers
Background compilation
Background compilation