[기술면접 | JS] V8 Engine

김준표·2023년 9월 7일
0

CS

목록 보기
3/7
post-thumbnail

요약

V8 엔진은 구글이 개발한 오픈소스 자바스크립트 엔진입니다.

Node.js와 Chrome에서 사용하고 있으며 Ignition, JIT, TurboFan이라는 컴파일러와 인터프리터를 사용하여 자바스크립트 코드를 기계어로 변환시켜준다.

자바스크립트 엔진

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

컴파일러와 인터프리터

컴파일러

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

인터프리터

코드를 한 줄씩 해석하여 기계어로 번환하는 프로그램

코드를 실행하기 전 컴파일 단계가 없기 때문에, 초기 실행 속도는 빠르지만 전체적인 실행 속도는 일반적으로 컴파일러보다 느리다.

V8 엔진

구글이 만든 웹 브라우저를 만드는데 기반을 제공하는 오픈소스 자바스크립트 엔진

ECMAScript 규격의 C++로 작성되었고, 자바스크립트를 바이트 코드로 컴파일하고 바이트 코드를 최적화된 기계어로 JIT 방식을 통해 변환한다.

JIT, TurboFan이라는 컴파일러와 Ignition이라는 인터프리터를 사용한다.

Node.js, Chrome에서 사용하고 있다.

JIT 컴파일러

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

V8 엔진의 동작 방식


출처 : JSConf EU 2017, Franziska Hinkelmann

1. Parser

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

2. AST(Abstract Syntax Tree)

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

    AST로 코드를 변환하는 사이트

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이 최적화를 하지 않았더라도 중단없이 실행되며, 이후 최적화된 코드로 대체되었다면 다시 코드가 실행될 때 변경된 코드로 실행되게 된다.
  • 최적화 기법은 히든 클래스, 인라인 캐싱 등 여러 최적화 기법이 사용된다.

출처

https://astexplorer.net/#/gist/2575639569a01ef721a9a117f20e0137/32f4d6918106d21476bfb817acb35aa5670ed43b
https://velog.io/@remon/V8-엔진이-대체-뭐야
https://yceffort.kr/2021/05/ast-for-javascript

profile
프론트엔드 개발자 | 문제가 있는 내용이 있다면 댓글로 알려주세요.

0개의 댓글