컴파일러와 인터프리터의 특징을 알아보기 전에 고급 언어와 저급 언어에 대해 알아보자. 앞서 말한 급은 난이도가 아닌 어떤 주체에 가까운지를 말한다. 높은 수준의 프로그래밍 언어일수록 인간 친화적이고, 낮은 수준의 프로그래밍 언어일수록 컴퓨터 친화적이다. 대표적으로 고급 언어에는 Python, Ruby, JAVA, C 등이 있고, 저급 언어에는 기계어, 어셈블리어가 있다.
컴퓨터는 기계어를 인식하지만, 고급 언어는 이해하지 못한다. 따라서, 고급 언어는 컴퓨터가 이해할 수있는 기계어로 변환되어야 한다.
번역에 사용되는 방식이 컴파일러와 인터프리터이다.
컴파일러의 경우, 프로그램을 컴파일 하기 위해서는 모든 프로그램 소스를 한꺼번에 번역을 해서 목적코드를 제작한다.
인터프리터의 경우, 필요한 부분을 행단위 구문으로 번역을 하여 바로 실행시킨다.
이와 같은 특징 때문에, 컴파일러는 모든 부분을 번역 후 실행하기 때문에 속도가 빠르다.
반면에 인터프리터는 프로그램을 실행하면서 컴파일을 동시에 수행하여 컴파일 속도는 빠르지만, 프로그램 실행 속도는 느리다.
예를 들어 프로젝트 코드를 완성했다. 근데 컴파일에 하루가 걸렸지만 오타로 인해 오류가 발생했다.
컴파일러 방식의 경우, 오타 수정 후 하루걸려 다시 컴파일을 해야한다. 로직의 문제가 아닌 단순 오류인데 시간낭비가 심하다는 단점이 있다.
인터프리터 방식은 전체 컴파일을 하지 않고 각 행을 바로 실행한다. 마찬가지로 오타로 인해 오류가 발생한다면, 오타를 수정하고 다시 프로그램을 실행하면 된다. 앞의 예시처럼 인터프리터는 디버깅에 유리한 이점이 있다.
컴파일러 방식과 인터프리터 방식은 명확한 장단점이 있다.
컴파일러는 “개발 편의성은 떨어지지만, 실행 속도는 빠르다.”
인터프리터는 “개발 편의성이 높지만, 실행 속도는 느리다.”
코드의 실행 방식은, 프로그래밍 언어의 특징과도 매칭이 된다.
저수준 언어는 개발 편의성은 떨어지지만 실행 속도는 빠르고, 고수준 언어는 개발 편의성이 높지만, 실행 속도는 느리다.
고수준 언어는 개발 편의성이 생명인 언어인데, 컴파일 과정을 매번 거쳐야 한다면, 그 장점을 다 잃어버린다. 그래서 Python, Ruby같은 고수준 언어는 인터프리터 방식을 주로 사용한다.
반면, 저수준 언어는 개발 과정이 좀 힘들더라도, 어떻게든 최고의 성능, 효율, 속도를 만들어내고자 했다. 그런데 그게 인터프리터 방식으로 실행되어서, 느린 환경에서 실행된다면, 저수준 언어로 개발한 이유가 사라진다. 그래서 C, C++ 같은 저수준에 비교적 가까운 언어들은 컴파일 방식으로 실행되는 경우가 많다.
[은핑]님의 글이 한 번에 정리가 잘 되어 가져왔다.
[출처]