본문 바로가기
카테고리 없음

[node.js] V8엔진에 대하여

by hbIncoding 2025. 2. 11.

1. V8 엔진이란?

  • Google에서 개발한 오픈소스 JavaScript 엔진으로, JavaScript 코드를 실행할 때 사용된다.
  • Chrome 브라우저와 Node.js에서 사용되며, 빠른 실행 속도를 자랑한다.
    • V8은 C++로 작성되었으며, JavaScript를 기계어로 변환하여 실핸한다.

2. V8 엔진의 주요 특징

  • JIT(Just-In-Time) 컴파일 방식 -> 인터프리팅이 아니라 실행 중 기계어로 변환하여 빠름
  • 가비지 컬렉션 -> 불필요한 메모리 자동 해제
  • 크롬과 Node.js에서 사용 -> 서버(Node.js)와 클라이언트(Chrome) 모두에서 실행 가능
  • WebAssembly(Wasm) 지원 -> JavaScript 이외의 언어도 실행 가능

3. V8 엔진의 내부 구조

V8의 주요 컴포넌트

  • Parser : JavaScript 코드를 AST(Abstract Syntax Tree, 추상 구문 트리)로 변환
  • Ignition(인터프리터) : 바이트코드 생성 및 실행
  • TruboFan(JIT 컴파일러) : 바이트 코드를 최적화된 기계어로 변환
  • Garbage Collector : 메모리 자동 관리

JavaScript 실행 흐름

  • JS 코드 -> Parser -> AST -> Bytecode(Ignition) -> Machine Code(TurboFan) -> 실행

인터프리터 vs JIT 컴파일러

  인터프리터 (Ignition) JIT 컴파일러 (TurboFan)
역할 바이트코드 생성 및 실행 바이트코드를 최적화하여 기계어로 변환
속도 빠른 시작(초기 실행 빠름) 최적화 후 매우 빠름
장점 모든 코드를 빠르게 실행 가능 반복되는 코드(핫 코드) 최적화
단점 실행 속도가 상대적으로 느림 최적화 전에 시간이 걸릴 수 있음
요약 한 줄씩 해석하고 즉시 실행하는 방식으로 소스 코드를 직접 읽고 해석하여 실행한다.
즉, 시작은 빠른 대신 해석과 실행을 반복하니 전체 실행 속도는 느리다. 하지만 디버깅이 쉽고 직관적이라는 장점이 생긴다.
초반에는 느릴 수 있지만, 반복 실행되는 부분이 빨라진다. 따라서 전체 실행 속도는 매우 빠르다. 반대로 컴파일된 코드 디버깅이 어려울 수 있다.
대표적인 언어 Python, JavaScript(V8의 Ignition), Ruby, PHP Java,JavaScript(V8의 TurboFan), C#

 따라서 Ignition이 처음 실행 -> TurboFan이 최적화하여 속도를 올림!

4. V8 엔진의 실행 과정

  1. JavaScript 코드 입력
  2. 파싱
    • V8 엔진은 코드를 AST로 변환
    • AST는 JavaScript 문법을 트리 형태로 분석하여 이해하기 쉽게 정리한 것.
  3. Ignition(인터프리터) - 바이트코드 생성
    • AST를 바이트코드로 변환
    • 바이트코드는 기계어로 변환되기 전의 중간 코드
  4. TurboFan(JIT 컴파일러) - 최적화된 기계어로 변환
    • 실행하면서 성능이 중요한 코드(핫 코드)를 최적화
    • 반복 실행되는 코드의 속도를 더욱 빠르게 만들어줌
  5. 실행 & 최적화유지
    • 실행 도중 코드 최적화를 유지하면서 성능을 최대로 끌어올림

5. Node.js 런타임과 V8엔진

  • V8 엔진만으로는 서버에서 필요한 기능을 수행할 수 없기 때문에, 다음과 같은 추가 기능을 포함한다.
  • Node.js 런타임의 주요 구성 요소
    • V8 엔진 : JavaScript 코드를 실행
    • libuv : 이벤트 루프 & 비동기 I/O 관리 (파일, 네트워크 등)
    • C++ 바인딩 : OS 기능에 접근 가능 (파일 시스템, 네트워크, 프로세스 등)
    • 내장 모듈 : fs, http, crypto 등의 기능 제공