프로그래밍을 하다 보면 스택, 힙, 컴파일, JIT 같은 개념을 자주 접하게 됩니다.
하지만 처음 접하는 분들에겐 다소 낯설고 어렵게 느껴질 수 있습니다.
이 글에서는 JavaScript를 중심으로 이러한 개념들이 어떤 역할을 하는지,
그리고 서로 어떤 관계를 갖는지 차근차근 정리해보려 합니다.
스택은 함수가 호출될 때 사용되는 짧은 생명 주기의 메모리 공간입니다.
지역 변수나 매개변수 등이 저장되며, 함수 실행이 끝나면 자동으로 해제됩니다.
function greet() {
const name = "Alice";
console.log("Hello, " + name);
}
위 예제에서 name
은 스택에 저장되며, greet()
함수가 종료되면 함께 사라집니다.
힙은 객체나 배열처럼 크기가 유동적이거나 함수 밖에서도 유지되어야 하는 데이터를 저장하는 공간입니다.
JavaScript에서는 대부분의 참조형 데이터가 힙에 저장되며, 메모리는 가비지 컬렉터(GC)가 자동으로 관리합니다.
const user = { name: "Bob" }; // user 객체는 힙에 저장됨
JavaScript는 함수 호출이 중첩될 때 이를 콜 스택(Call Stack)에 기록합니다.
가장 마지막에 호출된 함수가 먼저 종료되고, 스택에서 제거되는 구조입니다.
function a() { b(); }
function b() { console.log("b"); }
a(); // 실행 순서: a → b → b 종료 → a 종료
콜 스택이 과도하게 깊어지면 "Maximum call stack size exceeded" 오류가 발생할 수 있습니다.
의존성은 외부에서 제공하는 기능이나 모듈을 가져와 사용하는 것을 의미합니다.
JavaScript에서는 import
, require
등을 통해 다양한 라이브러리를 불러올 수 있습니다.
const fs = require('fs'); // Node.js 파일 시스템 모듈
JavaScript는 전통적으로 인터프리터 언어이지만,
V8 엔진 등은 성능 향상을 위해 JIT(Just-In-Time) 컴파일 방식을 사용합니다.
이를 통해 실행 중 일부 코드를 네이티브 코드로 변환하여 속도를 높입니다.
JIT은 실행 중인 코드 중 자주 호출되는 부분(핫 코드)을 추적하고,
그 부분만 즉석에서 기계어로 변환하여 실행 속도를 높이는 방식입니다.
function add(a, b) {
return a + b;
}
add(1, 2);
add(3, 4);
add("a", "b"); // 타입이 바뀌면 최적화가 해제될 수 있음
AST는 "추상 구문 트리"라는 의미로,
JavaScript 코드를 문법적 구조에 따라 계층적으로 표현한 트리 구조입니다.
const x = 5 + 3;
이 코드는 다음과 같은 트리로 변환됩니다:
VariableDeclaration
└─ VariableDeclarator
├─ Identifier (x)
└─ BinaryExpression (+)
├─ Literal (5)
└─ Literal (3)
댕글링 포인터란, 이미 해제된 메모리 공간을 참조하려는 포인터를 의미합니다.
이는 C/C++처럼 메모리를 수동으로 관리하는 언어에서 발생할 수 있습니다.
int* p = malloc(sizeof(int));
free(p);
*p = 10; // 위험한 접근, 댕글링 포인터
반면 JavaScript는 포인터가 없고, 메모리도 자동으로 관리되므로
이와 같은 문제가 발생하지 않습니다.
함수명 | 역할 |
---|---|
malloc(size) | 메모리 할당 (초기화 없음) |
calloc(n, size) | 0으로 초기화된 메모리 n개 할당 |
realloc(ptr, size) | 기존 메모리 크기 조절 |
free(ptr) | 메모리 해제 |
JavaScript에서는 이 모든 과정을 엔진이 자동으로 처리해줍니다.
개념 | JavaScript 기준 | C 기준 |
---|---|---|
스택 | 함수 실행 시 자동 메모리 | 지역 변수 저장 |
힙 | 객체, 배열 저장소 | malloc 등으로 동적 할당 |
컴파일 | JIT 컴파일 (런타임) | 정적 컴파일 |
호출 관계 | 콜 스택 기반 함수 실행 | 동일 |
메모리 해제 | 자동 (GC) | 수동 (free ) |
포인터 | 없음 | 있음 (주의 필요) |