JS는 인터프리터 언어일까?

Raccoon·2024년 12월 30일
post-thumbnail

You Don't Know JS Yet 책을 읽던 도중, 이에 관한 내용이 나와서 궁금증이 생겼다.

현대의 JS가 인터프리터 언어인지 컴파일러 언어인지에 대한 궁금증이 생겨, 먼저 컴파일, 인터프리터, 스크립트 언어를 비교해보려고 한다.

컴파일 언어

컴파일 과정을 요약하자면 다음과 같다.

파싱 -> 추상 구문 트리(AST) -> 중간 코드 생성 -> 최적화 -> 어셈블리 코드 -> 오브젝트(바이너리) 파일

컴파일 이후 링킹 -> 실행 파일 -> CPU 실행 순으로 코드 실행이 이루어진다.

즉, 컴파일을 거치면 바이너리 파일이 생성되고, 이 바이너리 파일은 링킹을 거쳐 실행파일로 만들어진 뒤, CPU가 이를 실행한다.

모든 코드를 한 번에 컴파일하고, 컴파일된 바이너리 코드(이진 코드)를 실행하기 때문에 실행시간이 짧고 빠르다.(성능 우수)

C, C++이 해당한다.

인터프리터 언어

인터프리터 언어는 해석기(Interpreter)를 사용하고, 이진 코드로 변환할 필요 없이 실행시 코드를 한줄 씩 해석하고 실행한다.

컴파일 단계가 없어서 실행될 때마다 소스 코드를 실시간으로 해석해야하기 때문에 컴파일 언어보다 성능 최적화가 어렵다.

Python이 해당한다.

스크립트 언어

앞의 두 언어가 실행 방식에 초점을 맞췄다면, 스크립트 언어는 사용 목적에 초점을 맞췄다고 보는게 좋다.

스크립트 언어는 일반적으로 작은 프로그램 이나 자동화된 작업에 자주 사용된다.

그리고 다른 프로그램에 삽입되어 동작하는 경우가 많은데, Python은 다양한 애플리케이션에서 스크립트로 삽입될 수 있고, JS는 웹 페이지에 삽입되어 브라우저에서 실행되는 예시가 있다.

스크립트 언어는 일반적으로 인터프리터 방식으로 실행되기 때문에, 인터프리터 언어를 사용하고 있지만, 스크립트 언어의 목적에 맞게 사용한다면 스크립트 언어가 될 수 있다는 것이다.

결론

그래서, 자바스크립트는 어떤 언어에 속하는가?

이에 대한 논쟁은 아직까지도 이어져 오고 있다고 하는데,
중론은 "스크립트 언어에 속한다"지만 컴파일 언어에 가까운지, 스크립트 언어에 가까운지 비교해볼 필요가 있을 것 같다.

모든 컴파일 언어는 파싱을 거치는데, JS로 작성한 소스 코드는 실행 전 파싱을 거친다. 그렇다면 JS는 컴파일 언어에 가까울까?

과거에는 JS엔진이 AST를 한 줄씩 실행했기 때문에 JS는 인터프리터 언어라는 주장이 지배적이었다고 한다.

모던 JS 엔진(V8, SpiderMonkey)은 런타임에 소스 코드를 기계어로 컴파일하는 방식인 JIT(Just-In-Time) 컴파일 기술을 도입했다.

그렇다면 JS는 컴파일 언어에 가까워졌을까?

과거보다는 그렇다고 생각한다.

하지만, 정적 컴파일을 수행하는 일반적인 컴파일 언어와는 달리 JS는 런타임에 컴파일을 수행하는 동적 컴파일 방식이기 때문에, 인터프리터 언어와 컴파일 언어의 특성을 둘 다 가진다고 봐야하지 않을까 싶다.

사실 이쯤되면 어떤 언어라고 결론을 낼 수는 없어보여서, 하이브리드 언어라고 봐야하지 않을까 싶은데..

이 논쟁에 자신있게 내 의견을 내려면 훨씬 더 많은 공부가 필요해보인다.

더 많은 의견을 읽어보고, 내 생각과 비교해보는 연습을 해보도록 하자!!

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

0개의 댓글