V8 엔진이 자바스크립트를 실행하는 과정

태경·2023년 11월 28일
0

자바스크립트

목록 보기
2/2

우연히 V8과 마주침..

자바스크립트 공부 중 V8 엔진과 관련한 글을 보았는데
해당 글에서 V8 엔진에 대한 자세한 설명은 없어서 추상적으로 이해하고 넘겼으나

내 코드가 V8 엔진에서 어떤 과정을 거쳐서 실행되는지는 알아야한다고 생각이 들어 여러 자료들을 찾아 가볍게 정리해보았다.


V8 엔진이란?

구글이 주도하여 C++로 개발한 자바스크립트 & 웹 어셈블리 코드를
바이트 코드 (Bytecode)로 컴파일하여 실행하는 엔진이며 Chrome과 NodeJs에서 사용되고 있다.

고대 유물 시절

기본적으로 자바스크립트는 인터프리터 언어로 알고 있는 부분이 많으나
사실 초기에는 JITC 방식으로 실행시에 모든 바이트 코드를 Native code로 변환하여 통째로 읽는 방식이었다.

이는 바이트 코드를 한줄씩 읽으며 처리하는 인터프리터 방식보단 실행과정에서 더 빠를 수도 있다.

그러나 자바스크립트

자바스크립트 언어의 특성상 변수에 대한 예외처리가 발생할 가능성이 높았기 때문에 한번에 네이티브 코드로 컴파일하는 것이 실행 속도가 더 떨어진다고 판단했던 것 같다.

그리하여 현재 V8 엔진이 사용하는 방식은 Adaptive JITC 방식이며 이는 모든 코드를 일괄적으로 최적화하는 것이 아니고

기본적으로 인터프리터로 동작하다가 자주 반복되는 코드(hotspot)와 관련된 부분에만 JITC를 적용하여 네이티브 코드로 컴파일하는 방식이다.

V8은 최적화를 위해 hidden class, inline caching 등의 방식을 사용하는데 이와 관련된 내용은 다음 포스팅에서 다룰 예정이다.


V8 엔진의 작동 원리

위에서 대충 언급한 컴파일 과정이 현재는 어떤 기술로 어떤 과정을 거쳐서 실행되는지 간단한 그림으로 전체적인 흐름을 파악해보자.

먼저 V8 엔진은 소스 코드 (자바스크립트 코드)를 파싱해서
AST (Abstract Syntax Tree) (해석하면 추상 구문 트리)로 변환시킨다.

그 다음, AST를 Ignition (인터프리터)에게 넘겨 컴퓨터가 해석하기 쉬운
Bytecode로 변환하고 이를 실행하여 원래의 자바스크립트 코드가 작동하게 되는 것이다.

여기서 자주 사용되는 코드는 TurboFan으로 보내져서 Optimized Machine Code (최적화된 코드)로 컴파일되는데, 다시 덜 사용된다 싶으면 Deoptimizing 하기도 한다.


자바스크립트를 사용하는 개발자로서 내 코드가 어떻게 돌아가는지 궁금했었는데 이번 기회로 간단하게 파악할 수 있어서 좋았다. 😙

다음 포스팅에서는 hidden class와 inline caching 등 엔진의 최적화에 대해서 더 자세히 알아보자!

0개의 댓글