본문 바로가기

Dev Story/아키텍처

V8 엔진 은 어떻게 자바스크립트 를 최적화 해주는가? #1

V8 엔진 은 자바스크립트 속도 향상을 위한 목적으로 설계되었다. 이런 속도를 최적화 한 방법에는 소스코드가 실행될 때 Ignition이라는 인터프리터로 한 줄씩 바이트 코드를 생성하여 캐싱 하였다가 다음번에 똑같은 구문을 반복 하였을때 최적화가 필요하다고 판단 되면 TurboFan 컴파일러 를 사용해서 머신 코드를 생성하여 매번 똑같은 작업을  방지하도록 속도 개선을 하였다. 이 두개 (인터프리터+ 컴파일러) 를 사용한 형태를 JIT(동적 컴파일러)이라고 하는데 인터프리터와 컴파일러의 장점을 취한 방식이다. 

 

V8 정의

V8 엔진 은  구글 개발팀에서 ECMAScript(ECMA - 262) 3rd 표준규격의 C++로 작성되었다. 오픈 소스 자바스크립트 컴파일러 혹은 엔진이라고 불리며 크롬 브라우저나 안드로이드 브라우저에 탑재되어 있다. 여타 자바스크립트 엔진과 차이점은 독립적으로 실행이 되기 때문에 Node Js 의 런타임으로 활용되는 특징이 있다.

 

작동방식

 



 

  1. Parser 는 자바스크립트 소스 코드를 AST(추상 구문 트리)를 생성하기 위한 변환 작업이다.
  2. AST (추상 구문 트리)로 변환하게 되면 Key,Value의 딕셔너리 형태가 되는데 변수 타입, 위치, 문장 순서 등의 정보와 같은 형태로 변환되고 다음 단계에 사용된다.
  3. ignition 인터프리터는 자바스크립트를 기계가 이해하기 쉬운 바이트 코드로 변환 하는 과정으로 최적화 목적으로 사용될 프로파일러에 도 이용되고 최적화가 필요 하지 않을때는 기계(PC) 실행에 이용된다.
  4. 터보팬 컴파일러는 3번 과정에서 얻은 프로파일 정보를 토대로 최적화를 할지 결정 하여 하게 된다면 향상된 컴파일 코드로 변환한다. 최적화 된 코드가 프로파일로 확인 해서 잘 사용되지 않게 된다고 생각 하면 다시 역최적화를 하는 경우도 있다. V8 엔진 초기에 이 부분이 잘 안되서 예전에 사용했던 Full-codegen과 Crankshaft 컴파일러를 레거시 형태로 남겨두고 있었다.
        

 

Ignition

이전 버전에서는 Full-codegen 이라는 컴파일러가 있었는데 소스코드 전체를 한 번에 컴파일하도록 되어 있었어 메모리 점유를 많이 한다는 사실을 인지하였고 Ignition는 인터프리터 방식을 채택하여 한 줄씩 번역하기 때문에 이 문제를 해결하게 되었다. 또한 자바스크립트는 동적 타이핑 언어라 실행되었을 때 데이터 형을 알 수 있는 경우가 있어서 이 같은 형태가 더 적합하다고 판단했다.

 

터보팬 (TurboFan)

이름에서 도 알 수 있듯이 안 좋은(?) 코드로 인해 발생한 PC열을 강한 팬을 돌려서 식혀 주기 위해 탄생된 컴파일러 (네이밍 센스가 인문학 적이라 참 좋다.) 즉 최적화(Optimize)를 당당하는 컴파일러이다.


최적화를 하는 방법에는 아래 캡처와 같이 두 가지 형태로 처리된다.

1. 함수가 임계점 이상으로 호출되었을 경우 kHotAndStable로 처리

(자주 호출되고 코드가 안 변하는 stable 한 코드 일 경우매번 같은 행동을 수행하는 반복문)


2. 함수가 작은 코드로 판단된다면 kSmallFunction으로 처리

(어떤 변화도 없고 바이트 코드 용량이 적으면서 임계점을 넘지 않은 경우)



출처

https://ko.wikipedia.org/wiki/V8_(%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8_%EC%97%94%EC%A7%84)
https://curious-notes.netlify.app/posts/js-engine-v8

 

[JS] V8 엔진과 JIT 컴파일러 - Curious Notes By Curie

자바스크립트 엔진은 자바스크립트 코드를 실행하는 프로그램 / 인터프리터이다. V8은 구글의 자바스크립트 엔진이다. JIT 컴파일러를 사용하여 구현되었다. 자바스크립트는 인터프리터 언어랬

curious-notes.netlify.app

 https://evan-moon.github.io/2019/06/28/v8-analysis/
 https://ui.toast.com/weekly-pick/ko_20210909