V8 엔진

sprinkler dev·2022년 1월 25일
0

What is V8?

V8은 C++로 작성된 구글의 오픈소스 자바스크립트, 웹어셈블리 엔진이다. 구글 크롬과 Node.js에서 사용한다.

자바스크립트로 작성된 코드를 실행시간에 바이트코드로 컴파일하여 실행한다. → JIT 컴파일 방식

ECMA ES-262 표준에 맞추어 구현되어 있다.

내부적으로 몇가지 스레드를 사용한다.

  • 코드를 가져오고, 컴파일하고 실행하는 메인 스레드
  • 컴파일을 위한 스레드 → 코드를 최적화하는 동안 메인스레드가 계속 동작할 수 있도록 함
  • 어떤 메소드를 실행할 때 시간이 많이 걸리는지 측정하는 프로파일러 스레드 → TurboFan으로 최적화
  • 가비지 컬렉터 스윕을 관리하기 위한 스레드

인라인 캐싱, 히든 클래스 등 여러 최적화 기법을 사용하고 있다.

V8 엔진이 동작하는 과정

  1. JS 코드를 파서에 전달
  2. 파서에서 소스코드 분석 후 추상 구문 트리(AST)로 변환
  3. AST를 Ignition에 전달 → JS를 바이트코드로 변환하는 인터프리터
  4. 바이트코드 실행
  5. 자주 사용되는 코드를 TurboFan에 전달 → 최적화 코드로 컴파일
  6. 그중 자주 사용하지 않는 코드를 Deoptimize

v5.9부터 Full-codegen과 Crankshaft를 사용하지 않는다.

full-codegen, crankshaft 버리기 까지의 히스토리

V8 엔진의 컴파일러 파이프라인

Bytecode

고급 언어로 작성된 소스코드를 가상머신이 이해할 수 있는 중간 코드로 컴파일한 것

ignition의 바이트코드 파이프라인

참고

https://nodejs.dev/learn/the-v8-javascript-engine

https://evan-moon.github.io/2019/06/28/v8-analysis/

https://v8.dev/

https://github.com/v8/v8

https://blog.sessionstack.com/how-javascript-works-inside-the-v8-engine-5-tips-on-how-to-write-optimized-code-ac089e62b12e

profile
2년차 백엔드 개발자

0개의 댓글