
V8의 인터프리터인 Ignition은 변환한 Bytecode(IR)를 실행하면서 프로파일링 및 피드백 데이터를 수집한다. 이 바이트코드를 JIT 컴파일러가 컴파일하게 되는데, 어떤 JITC를 선택하는지는 이전에 수집한 프로파일링 및 피드백 데이터에 따라 결정된다. 간단하게 설명되는 바로는, 코드가 반복 사용될 때마다 카운팅 되어 특정 임계값이 넘어가면 ‘hot’ code로 표시한다. 이 hot 코드는 Maglev로 보내지며, 더 실행될 경우 TurboFan으로 보내져 최적화 된다.
자바스크립트 코드를 받으면 파서를 통해서 Lexical Analysis(어휘 분석) 과정을 거친 후 토큰으로 분해한다. 그리고 Syntax Analysis(구문 분석) 과정을 진행하고 이때 문법 에러가 존재하면 Syntax Error를 출력한다.
프로그래밍으로 구현된 코드를 구문 구조의 형태를 나타내는 트리 형태의 자료구조를 말한다.
https://esprima.org/demo/parse.html#
Ignition은 V8엔진의 인터프리터로 AST 결과물을 Bytecode로 변환하는 인터프리터이다.
생성된 Bytecode는 처리하는 핸들러를 통해 코드를 실행된다.
Bytecode란 기계어를 추상화한 코드이며 중간언어(IR)인 바이트 코드로 변환하는 것을 말한다.
바이트코드를 거쳐서 TurboFan, Maglev, SparkPlug 중 한 가지의 형태로 컴파일 과정을 거치게 된다. 이때 이 컴파일러를 선택하는 방법은 Ignition에서 한 프로파일링에 의해 통해 결정된다.
Sparkplug는 Ignition에서 Maglev으로 넘어가는 그 사이에 존재하는데,
Maglevrk 존재하기 전 TurboFan은 최적화를 진행하고 컴파일하며, Ignition은 인터프리터로 실행한다. 하지만 Ignition과 TurboFan사이에는 너무 큰 속도 차이가 존재하여 단순 비최적화 컴파일러인 SparkPlug가 만들어지게 되었다.
SparkPlug는AST가 아닌 바이트코드를 기계어로 변환하며 최적화를 진행하지 않고, 그냥 바로 컴파일을 진행하여 빠르다.
TurboFan 과 SparkPlug 의 중간 단계의 최적화 컴파일러이다.
주 목적은 동적 분석 없이 빠른 최적화를 실행하는 것이고, 오직 인터프리터에서 가져온 피드백만을 이용한다. 정적인 방법으로 유의미한 최적화를 실행하기 위해, 노드들로 채워진 control flow graph를 생성하여 자체적으로 지원하며, 이 노드들은 maglev IR로 알려져 있다.