JS 컴파일의 핵심 단계

Raccoon·2025년 1월 12일
post-thumbnail

실제 컴파일 과정은 아래 얘기할 과정보다 훨씬 복잡하지만, 핵심적으로 세 가지 단계로 나눌 수 있다고 한다.

  1. 토크나이징(tokenizing) / 렉싱(lexing)
  2. 파싱
  3. 코드 생성

각각의 단계를 살펴보자.

1.토크나이징 / 렉싱

문자열을 의미있는 조각으로 쪼개는 단계이다.
예를 들어, let a = 2; 라는 코드가 있다고 할 때, let a = 2 ; 로 쪼갤 수 있다.
이 의미있는 쪼갠 조각을 토큰 이라고 하는데, 책에서는 이 토큰을 어떤 방식으로 인지하는지에 따라 토크나이징렉싱으로 나뉜다고 한다.

단순히 쪼개기만 한다면 토크나이징, 쪼갠 토큰들에 의미를 부여하고 맥락을 파악한다면 렉싱 이라고 보면 된다.

좀 더 찾아보니 실제로 토크나이징과 렉싱이 별개로 이루어지는 상황은 많지 않고, 사실상 쪼개고 + 의미부여 를 하기 때문에 토크나이징 + 렉싱 이 같이 이뤄진다고 보면 될거같다.

렉싱에서 의미를 부여한다는 의미는 각 토큰에 대해 종류(키워드, 식별자)와 유형(문자, 숫자)를 결정하는 것이라고 한다.

2.파싱

토크나이징 / 렉싱을 통해 나눠진 토큰들을 구문 분석을 진행해 AST(Abstract Syntax Tree) 를 생성하는 단계이다.

구문 분석 에서는 토큰들을 문법적 규칙을 검사하고 토큰들이 어떻게 결합되어 구조적 의미를 가지는가를 결정한다. 결과적으로 AST가 생성된다.

let a = 2 ; 는 아래의 AST로 변환된다.

세미콜론은 보통 문장의 종료를 나타내기 때문에 실질적인 의미를 가지지 않아서, AST에서는 포함시키지 않는다.

3.코드 생성

AST를 컴퓨터가 실행 가능한 코드로 변환 하는 단계이다.

정리하자면 let a = 2 라는 코드를 토큰 단위로 쪼개고 의미를 부여한 뒤, AST로 바꾸고 실행 가능한 코드로 변환한다.

결론

실제 JS 엔진은 세 단계로 설명한 것보다 훨씬 복잡하게 동작하지만, 일단 핵심적인 컴파일 과정은 위와 같다. 나중에 더 세세한 컴파일 과정을 알아보려고 한다!

profile
꾸준함을 목표로 합니다.

0개의 댓글