V8 엔진

담당
김준표
완료
완료
유형
JavaScript
비고

요약

V8 엔진은 구글이 개발한 오픈소스 자바스크립트 엔진입니다.
Node.js와 Chrome에서 사용하고 있으며 Ignition, JIT, TurboFan이라는 컴파일러와 인터프리터를 사용하여 자바스크립트 코드를 기계어로 변환시켜준다.
 

자바스크립트 엔진

자바스크립트 코드를 CPU가 이해할 수 있게 기계어로 변환해서 실행하는 프로그램 또는 인터프리터
 

컴파일러와 인터프리터

컴파일러

파일 전체를 읽은 후에 컴파일하여 기계어로 변환하는 프로그램

인터프리터

코드를 한 줄씩 해석하여 기계어로 번환하는 프로그램
코드를 실행하기 전 컴파일 단계가 없기 때문에, 초기 실행 속도는 빠르지만 전체적인 실행 속도는 일반적으로 컴파일러보다 느리다.
 

V8 엔진

구글이 만든 웹 브라우저를 만드는데 기반을 제공하는 오픈소스 자바스크립트 엔진
ECMAScript 규격의 C++로 작성되었고, 자바스크립트를 바이트 코드로 컴파일하고 바이트 코드를 최적화된 기계어로 JIT 방식을 통해 변환한다.
JIT, TurboFan이라는 컴파일러와 Ignition이라는 인터프리터를 사용한다.
Node.js, Chrome에서 사용하고 있다.
 

JIT 컴파일러

  • 프로그램을 실제 실행하는 시점에 기계어로 번역하는 컴파일 방식
  • 최적화할 코드를 선별한 후 해당 코드들만 컴파일하기 때문에 프로그램의 실행 속도를 빠르게 하기 위해 사용한다.
 

V8 엔진의 동작 방식

notion image

1. Parser

  • 자바스크립트 소스코드를 엔진에서 가져와 Parser에게 전달
  • 전달받은 코드를 Lexical Analysis 과정을 통해 토큰 단위로 분해
  • ex) const good = 66 → [’const’, ‘good’, ‘=’, ‘66’]

2. AST(Abstract Syntax Tree)

  • 추상 구문 트리라는 표현으로도 불린다.
  • Parser에서 분해된 토큰을 통해 AST Tree를 생성한다.
notion image
  • const good = 66의 구문을 AST Tree로 구현한 코드이다.

3. Interpreter Ignition → Bytecode

  • AST에서 나온 코드가 Ignition이라는 인터프리터에 전달됨
  • AST 코드를 빠르게 Bytecode로 중간 번역하고 실행시킨다.
  • Ignition
    • 바이트 코드 생성기 및 인터프리터
    • 한 줄씩 코드를 읽으며 Bytecode로 변환하는 컴파일 과정을 수행한다.
    • 이후, 모든 코드가 Bytecode로 변환되면 해당 코드를 실행시킨다.
  • Bytecode
    • 고수준 언어로 작성된 소스 코드를 가상머신이 편하게 이해할 수 있도록 중간 코드로 한번 컴파일 한 코드
    • CPU가 이해하도록 만드는 것이 아니라 VM(가상머신)이 이해할 수 있도록 이진 표현법으로 표현된다.
  • Ignition이 모든 코드를 한 줄씩 읽는 과정에서 변수 및 함수 선언을 처리하고 호이스팅이 수행된다.

4. Profiler

  • Ignition 인터프리터가 실행될 때(V8 엔진 런타임 중에) Profiler가 코드의 실행 패턴을 분석하여 코드가 반복되는 부분과 같은 과열되는 부분(hot spot)을 탐색한다.
  • hot spot을 발견하면 TurboFan으로 전달하여 최적화 컴파일을 진행한다.

4. TurboFan → Optimized Machine Code

  • TurboFan이 Profiler로부터 전달받은 hot spot Bytecode를 Optimized Machine Code(최적화된 가상 코드)로 직접 기계어의 형태로 다시 컴파일하게 된다.
  • 최적화된 가상 코드는 해당 bytecode를 대체하여 동작된다.
  • 만약 해당 코드가 더 이상 최적화가 필요하지 않거나, 동적 환경 변수에 의해 변경되는 형태를 가졌다면 TurboFan이 Deopmitizing 한다.
  • Ignition이 bytecode를 실행시킬 때, TurboFan이 최적화를 하지 않았더라도 중단없이 실행되며, 이후 최적화된 코드로 대체되었다면 다시 코드가 실행될 때 변경된 코드로 실행되게 된다.
  • 최적화 기법은 히든 클래스, 인라인 캐싱 등 여러 최적화 기법이 사용된다.
 

출처