V8엔진

최근혁(GeunH)·2023년 9월 11일

JavaScript

목록 보기
1/5

// 정리용으로 작성한 내용입니다. 틀린 부분이 있으면 지적해주시면 정말 감사하겠습니다!

JavaScript 엔진이란?

  • JavaScript엔진은 작성한 코드를 해석하고 실행하는 인터프리터 ( 컴파일러 방식과 다르게 한줄 마다 해석하고 실행하는 방식 ) 이다.
    왜 해석해? -> 컴퓨터는 0과 1인 이진코드밖에 이해하지 못하니까!

V8 엔진

공식 문서를 먼저 보자.
https://v8.dev 를 참고하면 나오는 설명은 "V8 is Google’s open source high-performance JavaScript and WebAssembly engine, written in C++. It is used in Chrome and in Node.js, among others."라고 써져있다.

JavaScript는 일반적으로 인터프리터 언어 ( 런타임에 코드를 실행하고 한줄씩 해석하는 것 )로 분류되지만, V8 엔진은 인터프리터 방식 대신 JIT(Just In Time : 인터프리터 방식으로 실행하기 전에 중간 언어 또는 기계 코드로 번역하고, 그것을 실행하는 방식 ) 컴파일 방식을 통해 JavaScript 코드를 중간 언어로 번역하고 실행할 수 있는 형태로 컴파일할 수 있다. 그러나 이 컴파일 과정은 기존의 컴파일러와는 차이가 있다.

V8 엔진은 우리가 작성한 JS코드를파싱하고 컴파일하며 기계어로 바꿔준다.
그러나 V8엔진이 이러한 과정을 수행하는 시간은 C++ 만큼 빠르지 않다는 단점이 있다.
그 대신에, V8엔진은 휴리스틱하게 많이 호출되는 함수일수록 더 최적화 ( 프로그램의 실행 속도를 향상시키기 위해 코드를 개선하는 과정 )를 시켜준다.이러한 최적화 기술은 V8 엔진이 JavaScript 코드를 빠르게 실행하도록 도와준다.

그럼 무엇이 최적화라고 할 수 있는 것일까

반복 최적화(Loop Optimization): 어떤 함수를 수없이 반복해야 할 경우, 최적화는 매 반복에서 함수를 다시 컴파일하지 않고 최적화된 코드를 재사용함으로써 불필요한 오버헤드를 줄인다. 이처럼 V8와 같은 엔진은 반복되는 코드를 최적화하여 반복되는 작업을 최적으로 처리하려고 한다.

V8 엔진이 Chrome 브라우저와 Node.js와 같은 환경에서현재로서는 웹 애플리케이션에 가장 효율적인 패턴이다.
-> 왜? V8 엔진은 이벤트 루프와 비동기 호출 패턴을 지원하기에 웹 애플리케이션의 성능과 사용자 경험을 최적화하는 데 기여하기 때문!

과정

V8 엔진에서는 TurboFan와 Ignition이라는 중요한 두 컴포넌트가 있다.

Ignition (이그니션):

인터프리터 역할: Ignition은 V8 엔진의 첫 번째 단계로, JavaScript 코드를 바이트 코드로 변환하고 실행하는 역할을 한다. 이는 코드를 빠르게 파싱하고 실행하기 위한 초기 단계로, Ignition은 JavaScript 코드를 중간 언어인 바이트 코드로 변환하며, 이 바이트 코드는 다음 단계인 TurboFan으로 전달된다.

TurboFan (터보팬):

최적화 역할: TurboFan은 V8 엔진의 최적화 단계에서 핵심 역할을 수행한다. V8 엔진은 코드 실행 도중에 실행 흐름을 분석하고, 자주 호출되는 함수 및 코드 경로를 식별하여 최적화 대상으로 선택한다. 이러한 최적화 대상 코드는 TurboFan으로 이동하여 최적화 및 더 효율적인 머신 코드로 컴파일되고, 이러한 최적화에는 인라인 캐싱(Inline Caching), 코드 인라이닝(Code Inlining) 등이 포함된다. TurboFan은 반복되는 코드 경로를 특히 최적화하여 자주 호출되는 함수 및 코드 블록을 최적으로 처리하려고 한다.

모든 코드가 터보팬을 거치지는 않는다. 최적화가 필요하다고 판단되는 경우에, 터보팬으로 진입하게 되는 것!

profile
목표 : 스스로 성장하는 개발자

0개의 댓글