JavaSctipt

[javascript] V8 Engine

판교너굴맨 2022. 1. 21. 23:58

컴퓨터는 0과1로 이루어진 값만 이해할 수 있다. 그리고 이 기계어를 인간이 해석하기 쉽게 만든 언어를 고급언어라 하며 우리가 자주 사용하는 c, python, java, javascript 등이 고급언어에 해당한다.

 

그러면 Javascript로 작성한 소스코드를 컴퓨터가 읽을 수 있도록 하려면?

Javascript Engine이 필요하다. 오늘은 여러 Javascript Engine 중에서 구글에서 개발한 V8을 학습해보려고 한다.

내가 작성한 코드가 어떻게 실행되는지 정도는 알아둬야 할 것 같았다.

 

V8 Engine

구글에서 만든 Javascript Engine이다.

V8 Engine은 C++로 개발 되었다.

현재 Chrome과 Node.js에서 사용되고 있다.

JIT (Just-In-Time) Compiler를 사용한다.

 

V8 Engine 구조

  • Parser
    V8이 소스코드를 가져오면 가장먼저 Parser가 소스코드를 분석후 토큰을 생성한다. (Lexical Analysis 과정)

    이 토큰을 Parser가 AST로 변환한다.
  • AST (Abstract Syntax Tree)
    파싱 되어 만들어진 AST는 Ignition Interpreter로 넘어간다.
  • Ignition Interpreter
    Ignition Interpreter가 AST를 ByteCode로 변환 한다.

    (처음에는 바이트 코드로 전부 변환하는 작업이 있어서 시간이 걸리지만 이후부터는 컴파일 언어에 가까운 성능을 보인다.)
  • TruboFan JIT Compiler
    • 바이트 코드를 실행하면서 Profiler는 최적화(Optimizes)가 가능한 부분을 찾아서 기록해둔다. (자주 쓰이는 변수나 함수)
    • Profiler가 최적화 가능한 부분을 TurboFan에 전달하고, TurboFan은 필요한 부분을 기계어(Optimized Machine Code)로 변환하여 최적화를 진행한다.
    • 코드가 자주 사용되지 않으면 Deoptimize 될수도 있다. (다시 Bytecode로)
    • 최적화 방법으로는 히든 클래스, 인라인 캐싱이 있다.

 

JIT (Just-in-time) Compiler

Just-in-time Compiler: 프로그램을 실제 실행하는 시점에 (실시간) 기계어로 번역하는 컴파일 기법

JIT Compiler는 바이트 코드를 읽어 빠른 속도로 기계어를 생성할 수 있다. 이런 기계어 변환은 코드가 실행되는 과정에서 실시간으로 일어난다.

전체 코드의 필요한 부분만 변환하며, 기계어로 변환된 코드는 캐시에 저장되기 때문에 재사용시 컴파일을 다시할 필요가 없다.

 

인터프리터 (동적 컴파일)

우리가 작성한 소스코드를 각 행 마다 기계어로 컴파일 한다.

개발 편의성이 높지만, 실행 속도가 떨어짐

  • 장점:  소스코드가 한 줄 한 줄 기계어로 변환되어 실행되기 때문에 바로바로 동작을 확인하면서 실행할 수 있다. (디버깅에 유리)
  • 단점:
    • 반복문 등으로 코드가 복잡해지면 속도가 느려진다. for문과 같은 반복문을 사용하는 경우 억 단위를 반복한다고 가정하면 억단위를 한 줄 한 줄 반복해서 변환하게 된다.
    • 실행할 때마다 한 줄씩 번역하고 실행하게 된다.

 

컴파일러 (정적 컴파일)

코드를 실행하기 전에 소스코드 전체를 컴파일 한다.

개발 편의성은 떨어지지만, 실행 속도는 높다.

  • 장점 : 컴파일이 되고 난 후 번역할 필요가 없어서 인터프리터보다 전체 소스코드의 실행이 빠르다.
  • 단점 : 코드 전체를 컴파일 하기 때문에 초기에 속도가 느리다.

 

참고 자료

https://youtu.be/xckH5s3UuX4

https://helloinyong.tistory.com/290

 

[2020.10.16] Google Chrome V8 엔진을 파헤쳐보자

Google V8 엔진 V8은 Google Chrome과 Node.js에서 사용되고 있는 구글에서 제작한 자바스크립트 엔진이다. C++로 작성되었고 고성능의 자바스크립트 전용의 웹 어셈블리 엔진이라 할 수 있다. 일반적으로

helloinyong.tistory.com

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

 

V8 엔진은 어떻게 내 코드를 실행하는 걸까?

이번 포스팅에서는 구글의 V8 엔진이 어떤 방식으로 자바스크립트를 해석하고 실행하는지 살펴 보는지에 대해 포스팅하려고 한다. 은 로 작성되었지만 필자의 메인 언어가 이 아니기도 하고, 워

evan-moon.github.io