image.png

V8의 인터프리터인 Ignition은 변환한 Bytecode(IR)를 실행하면서 프로파일링 및 피드백 데이터를 수집한다. 이 바이트코드를 JIT 컴파일러가 컴파일하게 되는데, 어떤 JITC를 선택하는지는 이전에 수집한 프로파일링 및 피드백 데이터에 따라 결정된다. 간단하게 설명되는 바로는, 코드가 반복 사용될 때마다 카운팅 되어 특정 임계값이 넘어가면 ‘hot’ code로 표시한다. 이 hot 코드는 Maglev로 보내지며, 더 실행될 경우 TurboFan으로 보내져 최적화 된다.

Parser

자바스크립트 코드를 받으면 파서를 통해서 Lexical Analysis(어휘 분석) 과정을 거친 후 토큰으로 분해한다. 그리고 Syntax Analysis(구문 분석) 과정을 진행하고 이때 문법 에러가 존재하면 Syntax Error를 출력한다.

AST(추상 구문 트리)

프로그래밍으로 구현된 코드를 구문 구조의 형태를 나타내는 트리 형태의 자료구조를 말한다.

https://esprima.org/demo/parse.html#

Ignition

Ignition은 V8엔진의 인터프리터로 AST 결과물을 Bytecode로 변환하는 인터프리터이다.

생성된 Bytecode는 처리하는 핸들러를 통해 코드를 실행된다.

Bytecode (IR)

Bytecode란 기계어를 추상화한 코드이며 중간언어(IR)인 바이트 코드로 변환하는 것을 말한다.

바이트코드를 거쳐서 TurboFan, Maglev, SparkPlug 중 한 가지의 형태로 컴파일 과정을 거치게 된다. 이때 이 컴파일러를 선택하는 방법은 Ignition에서 한 프로파일링에 의해 통해 결정된다.

SparkPlug

Sparkplug는 Ignition에서 Maglev으로 넘어가는 그 사이에 존재하는데,

Maglevrk 존재하기 전 TurboFan은 최적화를 진행하고 컴파일하며, Ignition은 인터프리터로 실행한다. 하지만 Ignition과 TurboFan사이에는 너무 큰 속도 차이가 존재하여 단순 비최적화 컴파일러인 SparkPlug가 만들어지게 되었다.

SparkPlug는AST가 아닌 바이트코드를 기계어로 변환하며 최적화를 진행하지 않고, 그냥 바로 컴파일을 진행하여 빠르다.

Maglev

TurboFan 과 SparkPlug 의 중간 단계의 최적화 컴파일러이다.

주 목적은 동적 분석 없이 빠른 최적화를 실행하는 것이고, 오직 인터프리터에서 가져온 피드백만을 이용한다. 정적인 방법으로 유의미한 최적화를 실행하기 위해, 노드들로 채워진 control flow graph를 생성하여 자체적으로 지원하며, 이 노드들은 maglev IR로 알려져 있다.