
예전에 사람들과 자바스크립트 관련된 이야기를 한 적이 있었다.
그 때 자바스크립트는 인터프리터 언어인지 컴파일러 언어인지 애매하다는 이야기가 나왔다.
결론적으로 자바스크립트는 둘 다에 속한다는 답이 나오기는 했지만,
나는 이 답이 너무 애매한 답변이라고 생각해서 이에 대해서 알아보기로 했다.
우선 인터프리터란 프로그래밍 언어의 소스 코드를 바로 실행하는 프로그램이나 환경을 말한다.
또한, 인터프리터 언어란 인터프리터를 통해 소스 코드를 한 줄씩 읽어 실행되는 언어를 말한다.
R, Python, Ruby와 같은 언어들이 대표적인 인터프리터 언어이다.
당연하게도 인터프리터 언어는 컴파일을 할 필요가 없다.
그래서 코드를 변경했을 때 바로 실행이 가능하며 이로 인해 프로그램 수정이 간단해진다.
또한, 적절한 인터프리터가 존재하기만 한다면 인터프리터 언어는 어디서든지 실행이 가능하다.
따라서 플랫폼에 구애받지 않기 때문에 이식성이 뛰어나다.
그리고 별도의 실행 파일이 필요가 없기 때문에 메모리를 적게 사용한다.
마지막으로 코드를 한 줄씩 실행하므로 코드에 오류가 있다면, 해당 코드만 실행이 되지 않기에
오류가 어디서 발생이 되는지 찾기 쉽다는 장점이 있다.
인터프리터 언어는 코드를 한 줄씩 읽어서 실행을 해야 하기 때문에 실행 속도가 느리다.
그리고 별도의 컴파일 과정을 거치지 않기 때문에 오류가 있는 코드가 있더라도,
코드를 실행하기 전까지는 오류가 존재하는지 알 수 있는 방법이 없다.
마지막으로 소스 코드를 그대로 사용하기에 소스 코드가 쉽게 공개된다는 단점이 있다.
먼저 컴파일이란 고급 언어로 작성된 프로그램을 저급 언어로 바꾸는 프로그램을 말한다.
그리고 컴파일 언어란 프로그램을 실행하기 전에 컴파일을 거친 후 실행되는 언어를 말한다.
대표적으로 C, C++, JAVA 등이 이 컴파일 언어에 속한다.
컴파일 언어를 실행할 때는 프로그램이 이미 저급 언어로 바꾸어져 있기에 실행 속도가 빠르다.
또한, 실행하기 전 컴파일 과정에서 전체 코드를 검사하게 되는데,
이 때 오류가 있다면 알 수 있어 프로그램 실행 전에 오류를 발견할 수 있다.
마지막으로 컴파일한 실행 파일을 거꾸로 되돌리는 디컴파일이 가능하기는 하지만 쉽지 않다.
따라서 원래의 소스 코드를 알기 어렵다는 장점이 있다.
컴파일 언어는 코드의 변경이 조금이라도 있다면 컴파일을 다시해야 한다.
따라서 프로그램을 수정할 때마다 컴파일을 다시해야 해서 프로그램의 수정이 쉽지 않아진다.
또한, 컴파일을 하면서 오브젝트 코드를 만들고 이를 묶어서 실행 파일로 만들어야 하는데,
이 때문에 소스 코드 외에도 다른 파일들을 많이 남겨놓아 메모리를 많이 사용하게 된다.
마지막으로 컴파일 과정은 코드가 길어질수록 길어지게 되는데,
만약 프로젝트의 규모가 커지게 되면, 컴파일 시간이 매우 오래 걸릴 수 있다는 단점이 있다.
자바스크립트는 웹의 구조를 동적으로 나타내고 수정하기 위해 만들어진 언어이다.
따라서 앞서 말했던 것처럼 더 가볍고 실행이 빠른 인터프리터 언어로 만들어졌다.

다음 사진만 보더라도 코드 한 줄을 입력했을 때 바로 실행이 되는 것을 볼 수 있다.
그런데 2009년에 구글에서 구글 맵스를 개발하고 있었는데,
지도는 추가적인 기능이 많기 때문에 성능상의 개선이 필요하다는 문제가 있었다.
그래서 이 문제를 해결하고자 나온 것이 V8 엔진이다.

V8 엔진에서는 다음과 같이 프로파일러를 추가해 반복적으로 실행이 되는 코드가 있다면,
이 코드를 실시간으로 컴파일해서 코드를 최적화 할 수 있도록 해주었다.
따라서 V8 엔진이 추가되기 전의 자바스크립트는 인터프리터 언어지만,
V8 엔진이 추가된 후의 자바스크립트는 인터프리터 언어이자 컴파일 언어라고 할 수 있다.