V8 엔진 은 자바스크립트 속도 향상을 위한 목적으로 설계되었다. 이런 속도를 최적화 한 방법에는 소스코드가 실행될 때 Ignition이라는 인터프리터로 한 줄씩 바이트 코드를 생성하여 캐싱 하였다가 다음번에 똑같은 구문을 반복 하였을때 최적화가 필요하다고 판단 되면 TurboFan 컴파일러 를 사용해서 머신 코드를 생성하여 매번 똑같은 작업을 방지하도록 속도 개선을 하였다. 이 두개 (인터프리터+ 컴파일러) 를 사용한 형태를 JIT(동적 컴파일러)이라고 하는데 인터프리터와 컴파일러의 장점을 취한 방식이다.
V8 정의
V8 엔진 은 구글 개발팀에서 ECMAScript(ECMA - 262) 3rd 표준규격의 C++로 작성되었다. 오픈 소스 자바스크립트 컴파일러 혹은 엔진이라고 불리며 크롬 브라우저나 안드로이드 브라우저에 탑재되어 있다. 여타 자바스크립트 엔진과 차이점은 독립적으로 실행이 되기 때문에 Node Js 의 런타임으로 활용되는 특징이 있다.
작동방식
- Parser 는 자바스크립트 소스 코드를 AST(추상 구문 트리)를 생성하기 위한 변환 작업이다.
- AST (추상 구문 트리)로 변환하게 되면 Key,Value의 딕셔너리 형태가 되는데 변수 타입, 위치, 문장 순서 등의 정보와 같은 형태로 변환되고 다음 단계에 사용된다.
- ignition 인터프리터는 자바스크립트를 기계가 이해하기 쉬운 바이트 코드로 변환 하는 과정으로 최적화 목적으로 사용될 프로파일러에 도 이용되고 최적화가 필요 하지 않을때는 기계(PC) 실행에 이용된다.
- 터보팬 컴파일러는 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
'Dev Story > 아키텍처' 카테고리의 다른 글
Docker 를 처음 적용해보는 분들에게 도움을 드리는 글 (설정법 포함) (0) | 2022.08.10 |
---|---|
성능 개선에 성공한 Master-Slave Model (feat. Nginx,Docker) (0) | 2022.07.16 |
자료구조와 알고리즘 차이점 (0) | 2021.11.02 |
Lazy 클레스를 이용한 싱글패턴 - 실무편(DB 관리 클레스) (2) | 2019.02.27 |
실무에 적용한 전략패턴 (C# 기준) (0) | 2019.02.24 |