js 엔진이 코드를 실행하는 과정은 다음과 같은 단계들로 구성됩니다.
엔진은 먼저 js 소스 코드를 읽어들임
소스 코드를 토큰화하고 구문 분석을 통해 추상 구문 트리(AST)를 생성함. 이 과정에서 구문 오류가 발견됨
현대 js 엔진은 JIT(Just-In-Time) 컴파일러를 사용함
코드 실행을 위한 환경을 준비
JIT(Just-In-Time) 컴파일러는 프로그램 실행 과정에서 필요한 부분을 그때그때 기계어로 변환하는 컴파일 방식입니다. 인터프리터와 정적 컴파일러의 장점을 결합한 하이브리드 접근법입니다.
- 전통적인 방식과의 차이
정적 컴파일러와 인터프리터와 달리 JIT 컴파일러는 실행 중에 필요한 부분만 기계어로 변환함
장점:
성능 향상:
자주 실행되는 코드는 최적화된 기계어로 실행되므로 순수 인터프리터보다 빠름
동적 최적화:
실행 시간에 수집된 정보를 기반으로 코드를 최적화할 수 있음
플랫폼 독립성:
중간 바이트 코드는 플랫폼에 독립적이며, 기계어 변환은 실행 환경에 맞게 이루어짐
메모리 효율성:
전체 코드가 아닌 필요한 부분만 컴파일하므로 메모리를 효율적으로 사용함
TailwindCSS v2.1부터 도입된 JIT 모드(v3부턴 기본 모드)는 CSS 생성 방식을 현대적으로 바꾸었습니다.
작동 방식:
1. on-demand CSS 생성:
프로젝트에서 실제로 사용되는 클래스만 생성합니다.
2. 실시간 컴파일:
개발 중에 HTML/템플릿 파일을 감시하고, 발견된 클래스에 대한 CSS를 즉시 생성
3. 필요할 때만 컴파일:
전체 CSS 유틸리티를 미리 생성하지 않고, 필요한 순간에 생성(모든 유틸리티 클래스를 미리 생성하고, 프로덕션 전에 PurgeCSS로 사용하지 않는 클래스를 제거하는 기존 방식과의 차이)
프로덕션 빌드 시에 모든 소스 파일을 스캔하고, 단일 CSS 파일로 생성하고 컴파일하여 정적 파일로 제공합니다.
TailwindCSS의 JIT 컴파일러는 JavaScript JIT와 직접적인 기술적 관련은 없지만, '필요할 때 필요한 것만 생성한다'는 유사한 철학을 웹 스타일링에 적용한 접근법입니다.