JavaScript Engine에 대해서(3)- JIT 컴파일러는 무슨 일을 할까?

dahye·2022년 3월 10일
4
post-custom-banner

JIT컴파일러 (Just-In-Time Compilation)

자 그럼 바로 JIT 컴파일러에 대해 살펴보도록 하겠습니다.

JIT가 하는 첫 번째 일을 바로 코드를 파싱(parse the code)하는 것입니다

  • 파싱하는 단계에서 코드는 AST(Abstract Syntax tree)라고 불리는 구조로 분해됩니다. 이 작업을 통해서 const 혹은 function 키워드를 통해 같이 의미론적으로 쓰인 언어가(meaningful to the language)가 분리되고, 트리 구조(tree structure)로 저장됩니다.
  • 이 단계에서 문법 오류(syntax errors)가 있는지 확인합니다. 그리고 만들어진 트리 구조(tree structure)는 이후에 머신 코드(mchine code)가 생성되는데 사용됩니다.

간단한 프로그램이 있다고 가정해보겠습니다. 그 프로그램에 우리가 f 함수를 선언한다면 함수는 아래와 그림과 같은 AST로 분해됩니다.

Building a background thread bytecode compiler
출처 -https://v8.dev/blog/background-compilation

즉, 다음과 같은 단계를 거치게 됩니다.

  1. 자바스크립트 소스를 파싱(parse)하여 AST 구조로 만든다.
  2. AST 를 머신코드로 바꾼다.

참고로 이 트리는 DOM tree와 전혀 연관되어있지 않습니다. 전혀 없습니다.
이렇게 생성된 머신코드는 즉시 실행됩니다. 이것이 모던 자바스크립트 엔진이 JIT컴파일러 (just-in-time compilation)이라고 불리는 이유입니다. 그리고 실행은 자바스크립트 엔진인 콜 스택(call stack)에서 실행됩니다.

모던 자바스크립트 엔진과 옵티마이제이션

모던 자바스크립트 엔진은 사실 굉장히 옵티마이제이션(optimization) 전략을 가지고 있습니다.

처음에는 실행 즉시 옵티마이징 되지 않은(unoptimized) 버전의 머신 코드를 생성합니다. 하지만, 프로그래밍이 실행되는 동안 뒤편에서는 코드의 옵티마이징과 재컴파일을 수행합니다.

프로그램이 실행되는 순간에도 뒤편에서 이 과정이 재차 수행되는 되고, 옵티마이징 되지 않은 코드는 옵티마이징 된 코드들과 교환(swap)됩니다.

이것이 바로 v-8과 같은 모던 자바스크립트 엔진의 핵심 키워드라고 볼 수 있습니다. 컴파일과 옵티마이제이션은 우리가 코드로는 접근 할 수 없는 특별한 스레드(threads) 안에서 일어납니다. 우리가 쓴 코드의 실행을 수행하는 메인 스레드(main threads)와는 완전히 분리되어 있습니다.


여기까지가 모던 자바스크립트 JIT 컴파일러에 관한 이야기입니다. 자바스크립트 구동 방식에 대해 이해하기 위한 글이기 때문에 흐름을 이해할 수 있는 정도로 글을 작성하고 있습니다.

AST 혹은 V-8 엔진에 대해서 더 궁금하신 것이 있다면, 하위 참조를 확인해주세요. 다음 글에서는 자바스크립트 런타임(Javascript Runtime)을 통해 어떻게 동작하는지 알아보고자 합니다.


profile
Junior Developer
post-custom-banner

0개의 댓글