javascript 엔진. 크롬과 nodeJS를 지원한다.


V8 엔진은 2개 주요 부분으로 이루어짐
1. Ignition Interpreter: 자바스크립트 코드를 바이트코드로 해석하는 역할. 구문 분석기. Parser가 생성한 추상구문트리(Abstract Syntax Tree)를 입력으로 받고 바이트 코드를 출력한다.
- 바이트 코드로 번역되어야 실행된다. (코드를 실행, 점화한다는 의미로 Ignition이라고 명명한듯)
2. Turbofan Compiler: 인터프리터로부터 받은 바이트코드를 최적화 버전으로 컴파일한다. 최적화하는 시점은 런타임 코드 실행 중 데이터를 받는 시점인듯.
(V8은 C++로 작성되어 다중 스레드 방식으로 모든 작업을 한번에 한다.)
- Turbofan 에 들어가는 코드는 Profiler에 의해 발견된 반복문과 같이 최적화할 필요가 있는 코드들이다.
- 바이트 코드들로 실행하다가 최적화가 필요한 코드가 실행되는 시점에 Turbofan의 출력인 최적화된 코드(Optimized Code)가 실행된다.
AST는 고수준 코드 표현을 저수준 표현으로 변환한다. 이렇게 변환하는 이유는 컴파일러를 위한 소스코드의 추상코드를 구축하기 위함.
코드를 AST로 변환 => 변수 유형, 위치, 명령문 순서와 같은 필수적인 정보만 포함. 불필요한 내용(주석)을 걷어냄
// 함수 선언
function addition(x, y){
var answer = x + y;
console.log(answer);
}
// 함수
addition(10,20) 호출
type: Program
- body
- #1
type: FunctionDeclaration
- id
type: Identifier
name: addition
- params
- #1
type: Identifier
name: x
- #2
type: Identifier
name: y
- body
type: BlockStatement
- body
- #1
type: VariableDeclaration
- declarations
- #1
type: VariableDeclarator
- id
type: Identifier
name: answer
- init
type: BinaryExpression
operator: +
- left
type: Identifier
name: x
- right
type: Identifier
name: y
kind: var
sourceType: script
(Secret Behind JavaScript Performance: V8 & Hidden Classes)
이렇게 자바스크립트 코드를 어떠한 키, 값 쌍의 자료구조로 변경함.
그리고 구조를 보면 알 수 있듯이 "JavaScript나 V8에 종속적이지 않다."
javascript는 동적으로 타입이 결정되는 언어기에 속성을 즉석에서 추가나 제거를 할 수 있지만 더 많은 동적인 조회를 요구하므로 javascript의 성능을 저하시킨다.
즉 동적 속성 추가는 자바스크립트의 성능을 저하시킨다.
V8은 이런 문제를 해결한다.
-> V8의 히든 클래스를 통해서.
새 객체를 만든다. -> V8 엔진이 새로운 히든 클래스를 만든다. -> 새 속성을 추가한다. -> V8 엔진은 이전 클래스의 모든 속성 + 새 속성으로 새로운 히든 클래스를 만든다.


(Secret Behind JavaScript Performance: V8 & Hidden Classes)
이러면 컴파일러는 userObject.name에 접근하려고 할 때 dictionary 조회(동적 조회?)를 하지 않고 V8은 클래스 C01을 가리키고 -> C02를 가리켜 name이라는 속성을 가진 히든 클래스에 접근할 수 있다.
const articleObject = {}라는 빈 객체를 생성하면 V8 엔진은 새로운 숨겨진 클래스를 생성하지 않고 이미 생성됬던 C01 클래스를 가리킨다. -> 그리고 새로운 속성인 age를 추가한 히든 클래스를 생성한다. (재사용)