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 엔진의 실행 과정
- JavaScript 코드 입력
- 파싱
- V8 엔진은 코드를 AST로 변환
- AST는 JavaScript 문법을 트리 형태로 분석하여 이해하기 쉽게 정리한 것.
- Ignition(인터프리터) - 바이트코드 생성
- AST를 바이트코드로 변환
- 바이트코드는 기계어로 변환되기 전의 중간 코드
- TurboFan(JIT 컴파일러) - 최적화된 기계어로 변환
- 실행하면서 성능이 중요한 코드(핫 코드)를 최적화
- 반복 실행되는 코드의 속도를 더욱 빠르게 만들어줌
- 실행 & 최적화유지
- 실행 도중 코드 최적화를 유지하면서 성능을 최대로 끌어올림
5. Node.js 런타임과 V8엔진
- V8 엔진만으로는 서버에서 필요한 기능을 수행할 수 없기 때문에, 다음과 같은 추가 기능을 포함한다.
- Node.js 런타임의 주요 구성 요소
- V8 엔진 : JavaScript 코드를 실행
- libuv : 이벤트 루프 & 비동기 I/O 관리 (파일, 네트워크 등)
- C++ 바인딩 : OS 기능에 접근 가능 (파일 시스템, 네트워크, 프로세스 등)
- 내장 모듈 : fs, http, crypto 등의 기능 제공