Tech

Diary

Lecture

About Me

개발중

JS의 실행 과정

JeongSeulho

2025년 06월 12일

준비중...
클립보드로 복사
thumbnail

1. JS 엔진

Call StackHeap을 가지고 있는 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의 실행 과정

큰 흐름은 다음과 같다

  1. 소스 코드 => AST(Abstract Syntax Tree)
  2. AST => 바이트 코드
  3. 바이트 코드를 Adaptive Compilation를 포함한 JIT 방식으로 실행
출처
forlecture1013님의 블로그cinntiq님의 블로그