“자바스크립트 런타임과 실행 메커니즘에 대한 정리 (JavaScript Runtime & Execution Mechanism)”
🧠 AI-Assisted Study Note
이 노트는 아래의 주제를 학습하는 과정에서 Gemini와 **ChatGPT (GPT-5)**과의 대화를 요약한 것입니다.
정보의 근원은 공개된 ECMAScript 명세, MDN, 그리고 엔진 동작 원리에 대한 다양한 기술 자료들이며,
주제의 선택, 질문의 방향, 개념 연결 구조는 전적으로 작성자 본 인의 학습 과정에서 형성된 것입니다.
JavaScript Runtime
🔹 정의
Runtime이란 프로그램이 실제로 실행되는 시점과 그 실행 환경 전체를 의미한다.
즉, 코드가 살아 움직이는 순간과 그걸 가능하게 하는 시스템을 통틀어 부르는 말이다.
💡 Runtime = 실행 중인 프로그램 + 그 실행을 가능하게 하는 엔진/환경
⚙️ JavaScript Runtime 구성 요소
| 구성 요소 | 설명 |
|---|---|
| JS 엔진 (V8, SpiderMonkey 등) | JavaScript 코드를 파싱하고 바이트코드로 컴파일해 실행하는 핵심 엔진. |
| 메모리 힙 (Memory Heap) | 객체, 함수, 클로저 등 데이터가 실제로 저장되는 공간. |
| 콜 스택 (Call Stack) | 현재 실행 중인 함수들의 실행 컨텍스트(Execution Context)를 관리. |
| 호스트 환경 API | 브라우저 또는 Node.js가 제공하는 기능 (예: setTimeout, fetch, DOM 등). |
| 이벤트 루프 (Event Loop) | 콜 스택이 비면 대기 중인 작업(콜백, 프로미스 등)을 큐에서 꺼내 실행. |
| Task Queue / Microtask Queue | 비동기 작업을 일시적으로 보관하는 큐. |
🧠 즉, JavaScript Runtime = JS 엔진 + 호스트 환경(API, Event Loop 등)
→ JS 코드가 실제로 실행되는 전체 생태계.
⏱️ Compile Time vs Runtime
| 시점 | 설명 |
|---|---|
| Compile Time (준비기) | 코드가 해석되고 실행 전 구조를 세팅하는 단계 (렉시컬 환경 구성 등). |
| Runtime (실행기) | 코드가 실제로 실행되어 값이 생성되고, 호출 스택이 움직이는 실시간 과정. |
예:
function foo()를 정의하는 건 compile time,
foo()를 호출하는 순간부터 runtime이 시작된다.
🧩 비유로 이해하기
- Compile Time → “무대 세팅”
- Runtime → “배우가 실제로 연기하며 스토리가 진행되는 순간”
- 코드가 동작하고, 변수가 값으로 살아 있는 그 순간이 바로 Runtime이다.
🔧 요약
- Runtime: 코드가 실행되는 “살아 있는 시간대 + 환경”.
- JavaScript Runtime: V8 엔진 + 이벤트 루프 + API 시스템의 조합.
- 핵심 개념: “코드가 실제로 움직이는 순간과 그 생태계 전체를 말한다.”
📚 자바스크립트 런타임과 실행 메커니즘
목차는 가장 '물리적인(낮은 수준)' 개념에서 시작하여, '엔진의 동작(메커니즘)'을 거쳐, '추상적인(높은 수준)' 개념으로 나아가도록 구성했습니다.
- Part 1: 메모리 모델 (Stack & Heap)과 값의 복사
- 원시 타입 vs 참조 타입
- "단 하나의 복사 규칙" (값 복사 vs 참조 복사의 진실)
- Part 2: 렉시컬 환경 (Lexical Environment) - '스코프'의 실체
- 명세(Spec)상의 정의: 2가지 구성 요소
- V8 엔진의 실제 구현: Fast Path vs Slow Path (Context 객체)
- Part 3: 실행 컨텍스트 (Execution Context) - '실행'의 주체
- 3가지 구성 요소 (LE, VE, ThisBinding)
- 3가지 종류 (GEC, FEC, MEC)
- Part 4: 호이스팅과 Function Object의 탄생
- 2-Pass 메커니즘: 생성 단계 vs 실행 단계
varvslet/const(TDZ)function선언 (핵심 메커니즘)
- Part 5: JIT (Just-In-Time) 컴파일이란?
- JS가 JIT 컴파일 언어인 이유
- Part 6: 핵심 메커니즘 2 -
this바인딩this가 필요한 이유- EC 종류별
this(GEC, MEC) - FEC의 4가지
this결정 규칙 (및 우선순위) - 예외: 화살표 함수 (Lexical
this)
- Part 7: 핵심 메커니즘 3 - 클로저 (Closure)
- 클로저의 정의
- 클로저의 작동 원리 (Function Object와
[[Environment]])
- Part 8: 핵심 메커니즘 4 - 모듈 시스템 (ESM)
- 모듈 스코프 (MEC)
- CJS vs ESM (Node.js vs 브라우저)
import/export와 '라이브 바인딩(Live Binding)'의 실체- 트리 쉐이킹(Tree Shaking)과의 연결
- Part 9: 기타 주요 용어 정리
- Snapshot (스냅샷)
- 정적(Static) vs 동적(Dynamic)
1. 메모리 모델 (Stack & Heap)과 값의 복사
JS 엔진이 변수를 어떻게 다루는지 이해하는 가장 근본적인 모델입니다.
🧠 Stack vs Heap
- 스택 (Stack): 함수 호출, 지역 변수, 원시 타입 값, 메모리 주소(포인터) 등 크기가 고정되고 순서가 명확한 데이터를 저장합니다. 접근 속도가 매우 빠릅니다. 함수가 호출되면 '스택 프레임'이 쌓이고(push), 함수가 종료되면 사라집니다(pop).
- 힙 (Heap): 객체(Object), 배열(Array), 함수(Function) 등 크기가 유동적이고 복잡한 데이터를 저장하는 거대한 메모리 공간입니다. 스택보다 속도가 느리지만, 데이터의 생명 주기를 더 유연하게 관리할 수 있습니다.
📋 원시 타입 (Primitive) vs 참조 타입 (Reference)
- 원시 타입:
string,number,boolean,null,undefined,symbol. - 참조 타입:
Object(및Array,Function,Map등 객체를 기반으로 하는 모든 것).