
이 포스트는 JS 전공도서인 YDKJSY 시리즈의 1장을 읽고 정리한 내용이다.
자바스크립트가 인터프리터 언어인지 컴파일러 언어인지에 대한 논쟁은 오랫동안 이어져 왔다. 이는 단순히 용어의 문제를 넘어, 언어의 특성과 실행 방식에 대한 깊이 있는 이해를 필요로 한다.
왜 논쟁이 일어났을까?
자바스크립트는 어떻게 실행될까?
자바스크립트 엔진은 소스 코드를 실행하기 전에 몇 가지 단계를 거친다.
핵심은 바로 JIT(Just-In-Time) 컴파일이다. 코드가 실행되는 순간에 실시간으로 컴파일되고 최적화되는 방식이다.
왜 자바스크립트를 인터프리터 언어라고 부를까?
왜 자바스크립트를 컴파일러 언어라고 부를 수 있을까?
결론적으로 자바스크립트는 인터프리터와 컴파일러의 특징을 모두 가지고 있는 하이브리드 언어라고 할 수 있다.
따라서 자바스크립트를 단순히 인터프리터 언어 또는 컴파일러 언어로 분류하기보다는, 실행 환경과 사용 목적에 따라 다르게 평가해야 한다.
핵심: 자바스크립트는 JIT 컴파일을 통해 높은 성능과 유연성을 동시에 제공하는 현대적인 프로그래밍 언어이다.
요약: 자바스크립트는 인터프리터와 컴파일러의 장점을 모두 가지고 있는 하이브리드 언어이며, 실행 환경과 사용 목적에 따라 다르게 평가될 수 있다.

(인터프리터, 스크립트 언어의 실행 절차)

(파싱 + 컴파일 + 실행)
컴파일 단계에선 가상 머신(VM)에 전달할 이진 바이트 코드가 생성된다. 혹자는 가상 머신의 역할이 전달받은 바이트 코드를 해석하는 것이라고 이야기한다. 그런데 이런 관점에서는 자바를 비롯한 JVM 기반 언어는 컴파일이 아닌 인터프리터 언어라고 해석할수밖에 없다. 그럼 자바 등의 언어가 컴파일 언어라는 보편적인 주장에 모순이 생긴다.
자바와 JS는 완전히 다른 언어이지만 인터프리터와 컴파일 관점에서는 비슷한 점이 많다는 게 상당히 흥미로운 지점이다.
또 다른 흥미로운 점은 JS 엔진은 파싱 이후 생성된 코드를 다양한 방법으로 실행 전에 그때그떄 처리 및 최적화 한다는 점이다.
이런 JS 엔진 작동 방식으로 인해 관점에 따라 JS를 컴파일 언어 혹은 인터프리터 언어라고 할 수 있는 것이다. JS 엔진 안에서는 우리가 상상할 수 없을 정도로 복잡한 일들이 일어나고 있다.
지금까지 정리한 지식들을 모아 결론을 내려보아 JS로 만든 소스 코드가 실행될 때까지 어떤 절차를 거치는지 정리해보면,
네 단계를 그림으로 표현하면,

(파싱, 컴파일 후 JS가 실행됨)
그렇다면 JS는 한 줄씩 실행되는 인터프리터 언어일까, 혹은 몇 단계를 거쳐 실행되는 컴파일 언어일까?
완전한 사실이 아니긴 하지만, YDKJSY 책의 필자는 JS가 컴파일 언어라고 생각한다고 언급했다.
JS를 컴파일 언어라고 생각하는 게 중요한 이유는 갸벌저거 아성헌 문법을 입력하는 등의 실수를 하더라도 코드 실행 전에 정적 오류를 미리 발견할 수 있다는 특징이 있기 때문이다. 이런 JS만의 방식은 기존 스크립트 프로그램과 상당히 다른 방식으로 개발할 수 있도록 한다.