JS의 실행 과정
JeongSeulho
2025년 06월 12일
준비중...
클립보드로 복사

1. JS 엔진
Call Stack
과 Heap
을 가지고 있는 ECMAScript
를 실행시키는 엔진으로 V8
, SpiderMonkey
, JavaScriptCore
등이 있음
JS 엔진
은 ECMAScript(ECMA-262)
만 구현하며 다양한 런타임 환경에서 사용 가능
2. JS 런타임
JS 엔진
을 내장하며 추가적인 기능을 제공하는 프로그램으로 Chrome
, Node.js
, Firefox
등이 있음
웹 브라우저인 런타임들은 DOM
및 웹에서 사용가능한 API를 제공
서버 측 런타임들은 파일 시스템에 관한 API를 제공
런타임에 추가할 기능은 정해진 규칙이나 표준이 없음, Nodes.js
, Deno
는 다른 방식으로 파일 시스템을 구현
또한, 이벤트 루프는 런타임에서 제공하는 기능으로 런타임 마다 구조가 다를 수 있음
이벤트 루프는 JS 런타임에서 필수는 아니지만 대부분의 런타임에서 제공하고 있음
3. 컴파일러와 인터프리터
2개 모두 고수준 또는 중간수준의 언어를 기계어로 변환하는 프로그램이다.
3-1. 컴파일러
- 코드를 기계어로 컴파일하고 결과를 저장하는 프로그램
- 실행 시 컴파일 결과물만 있으면 실행 가능
OS
에 따라서 다르게 컴파일 되어 결과물은 지정한OS
에서만 실행 가능(OS
에 따라 컴파일 최적화 가능)
3-2. 인터프리터
- 코드를 한줄씩 읽어 기계어로 변환하고 실행하는 프로그램
- 실행 시 인터프리터가 있어야 실행 가능
- 운영체제 종류와 상관없이 특정 인터프리터가 있으면 실행 가능
3-3. Adaptive JIT 방식
- 컴파일러와 인터프리터를 모두 사용하는 혼합 방식
- 고수준 언어를 바이트 코드(
VM
이 실행가능한 언어)로 컴파일, 이후 한 줄 씩 바이트 코드를 인터프리터가 변환하고 실행 - 실행초기에는 인터프리터로 실행, 반복되는 코드를 검출하여 기계어로 컴파일해둠(
Adaptive Compilation
) OS
관계 없이 실행 가능- 실행 속도가 인터프리터보다 빠르고 컴파일러보다 느림
- 컴파일한 내용을 메모리에 저장하므로 메모리 사용량이 많음
바이트 코드는
VM
이 실행할 수 있는 언어, 기계어와 다름
V8
,JVM
등이VM
의 예시
JAVA에서의 예시를 보면
JAVA
는 컴파일러를 통해.class
이라는 바이트 코드로 변환되고- 실행 시 인터프리터를 통해 바이트 코드가 한 줄씩 이진 코드로 변환되며
JVM
에서 실행 됨 - 반복되는 바이트 코드는 기계어로 컴파일해두고 실행
4. JS의 실행 과정
큰 흐름은 다음과 같다
- 소스 코드 =>
AST(Abstract Syntax Tree)
AST
=> 바이트 코드- 바이트 코드를
Adaptive Compilation
를 포함한JIT
방식으로 실행