[TIL] 자바스크립트의 JIT 컴파일, 간단히 알아보자

승민·2025년 4월 10일
0

TIL

목록 보기
13/20

JS는 인터프리터? 컴파일?

자바스크립트(JS)는 원래 가벼운 작업을 위해 만들어진 언어로, 인터프리터 방식을 사용해 코드를 실행했습니다. 인터프리터는 코드를 한 줄씩 읽고 바로 실행하는 방식이라 시작은 빠르지만, 반복 작업에선 속도가 느립니다.

하지만 웹이 발전하며 복잡한 작업(게임, SPA 등)이 늘자, 인터프리터만으론 성능이 부족해졌습니다. 그래서 컴파일 방식의 빠른 실행 속도가 필요해졌고, 이를 인터프리터와 결합한 JIT(Just-In-Time) 컴파일이 등장했습니다. (예: Chrome의 V8 엔진)

인터프리터: 코드를 한 줄씩 실행. 시작은 빠르지만 반복 속도가 느림.
컴파일러: 코드를 기계어로 미리 변환. 시작은 느리지만 실행이 빠름.

JIT 컴파일이란?

JIT는 인터프리터와 컴파일러의 장점을 합친 방식입니다:

  • 인터프리터로 빠르게 시작하고,
  • 자주 쓰이는 코드(핫 코드)를 감지해 기계어로 컴파일해서 캐싱.

즉, 기본은 인터프리터지만, 반복 작업에선 컴파일러를 활용합니다.

JIT 동작 방식

  1. 파싱
    소스 코드를 읽고 AST(추상 구문 트리)로 변환.
    문법 오류 체크.
  2. 베이스라인 실행
    인터프리터가 코드를 한 줄씩 실행 (V8의 Ignition 사용).
  3. 프로파일링
    자주 실행되는 핫 코드를 모니터링으로 식별.
  4. 최적화 컴파일
    핫 코드를 기계어로 변환 (V8의 TurboFan 사용).
    타입 추론, 인라인 캐싱 적용.
  5. 디옵티마이제이션
    잘못된 가정(예: 타입 변경)이면 인터프리터로 복귀.
function add(a, b) { return a + b; }
for (let i = 0; i < 1000; i++) { add(i, i); }
// 처음 몇 번은 느리게(인터프리터), 반복되면 기계어로 변환

JIT 장점과 단점

장점
성능 향상: 반복 실행되는 코드는 기계어로 변환되어 네이티브 속도로 실행됩니다.
적응성: 실행 중에 동적으로 최적화하므로, 코드의 실제 사용 패턴에 맞춰 효율적으로 동작합니다.

단점
메모리 사용량 증가: 컴파일된 코드와 인터프리터 상태를 유지해야 하므로 메모리가 더 필요합니다.
초기 지연: 최적화 전 인터프리터 단계가 느릴 수 있습니다.
복잡성: 디옵티마이제이션 등으로 엔진 설계가 복잡해집니다

요약

JS는 간단하 동작을 위해 인터프리터 방식으로 코드를 읽었지만, 복잡한 기능들을 처리하기위해 인터프리터 + 컴파일 인 JIT 컴파일 방식을 사용합니다.

0개의 댓글