컴파일 언어와 인터프리터 언어의 가장 큰 차이점은 전체 파일을 스캔하여 한꺼번에 번역을 하는지(컴파일), 프로그램 실행시 한 번에 한 문장씩 번역하는지(인터프리터)이다.
JS가 컴파일 언어인지, 인터프리터 언어인지를 알기 위해선 먼저 JS의 엔진이 어떤 방식으로 동작하는 지를 알아야 한다. JS의 엔진이 작동하는 원리는 다음과 같다.
엔진이 실행할 JS파일을 받는다.
파싱, AST(Abstract Syntax Tree)를 구축하는 과정을 거친다.
인터프리터가 코드를 읽으며 실행한다.
코드를 수행하는 중, 프로파일러가 최적화 할 수 있는 코드를 컴파일러에게 전달해준다.
(주로 반복해서 실행되는 코드블록들)
원래 있던 코드와 최적화된 코드를 바꿔준다.
이렇게 코드를 우선 인터프리터 방식으로 실행하고, 필요한 경우 컴파일 하는 방법을 JIT(Just-In-Time) 컴파일러라고 부른다.
결론적으로, JS는 인터프리팅과 컴파일이 혼합되어 사용되나 기본적인 작동 방식이 인터프리팅이기 때문에 인터프리터 언어에 더 가깝다. 엔진 내부에서 컴파일 과정을 거치는 이런 방식 덕분에 JS의 성능을 크게 올릴 수 있었다.