참조자료 : https://www.geeksforgeeks.org/difference-between-compiler-and-interpreter/
"자바스크립트"는 인터프리터 언어이기 때문에.."자바"는 컴파일 기반 언어이기 때문에.. 등등 공식문서와 자료들을 읽다보면 이해할 수 없는 용어들로 인해 고통받을 때가 있다. 이를 이해하기 위해 영상 및 자료를 찾다가보면 더 어려운 용어들이 등장해서 (사실은 더 근본에 가까운 기본 용어들인듯 보이지만,,) 이해하기가 더 어려워지는 경우가 많다.
적어도 이 글은 사실상 나만 볼 것이기 때문에!
내가 이해하는 가장 직관적인 방법대로 이 글에 정리해놓고자 한다.
일단 자바스크립트에 대해 알아보면, 스크립트 언어 or 인터프리터 언어로 소개한다.
두 용어는 다른 의미를 갖지만, 지금 나의 수준에서 깊게 들어가면 더 복잡해질 것 같아서 간단히만 정리한다.
1. 스크립트 언어의 개념은 프로그래밍 언어의 개념과 구별짓기 위해 등장한다. why? 동작환경이 특정되어 있기 때문에.
2. 인터프리터 언어의 개념은 컴파일 언어의 개념과 구별짓기 위해 등장한다. why? 생성되는 별도의 파일이 없고, 즉시 해석되는 엔진을 갖고 있기 때문에.
인터프리터와 컴파일
먼저 인터프리터와 컴파일은 모두 고수준의 소스코드를 저수준의 기계어로 번역하는 도구이다.
가장 큰 차이점은, 코드를 실행시키기 위해 별도의 기계어로 이뤄진 실행파일을 만드느냐, 만들지 않느냐의 차이이다.
인터프리터 언어가 실행파일을 만들지 않는 이유와, 컴파일 언어가 실행 파일을 만드는 이유는 아래의 GeeksforGeeks에서 가져온 비교 도표를 차근차근 읽어보면 이해하기가 쉽다.
컴파일러 | 인터프리터 |
프로그래밍 단계:
|
프로그래밍 단계:
|
컴파일러는 기계 언어를 기계 코드 형태로 디스크에 저장합니다. | 통역사는 기계어를 저장하지 않습니다. |
컴파일된 코드는 인터프리터보다 빠르게 실행됩니다. | 해석된 코드는 컴파일러보다 느리게 실행됩니다. |
Linking-Loading Model은 컴파일러의 기본 작업 모델입니다. | 해석 모델은 해석기의 기본 작업 모델입니다. |
컴파일러는 (.exe) 형식으로 출력을 생성합니다. | 인터프리터는 출력을 생성하지 않습니다. |
컴파일 후 소스 프로그램이 변경되면 전체 코드를 다시 컴파일해야 합니다. | 번역 중에 소스 프로그램이 변경되더라도 전체 코드를 다시 번역할 필요는 없습니다. |
현재 시간에 함께 Compiling 후 Compiler에 Error가 표시됩니다. | 오류는 모든 단일 라인에 표시됩니다. |
컴파일러는 최적화를 수행하기 때문에 코드를 더 빨리 실행하는 데 도움이 되는 코드를 미리 볼 수 있습니다. | 인터프리터는 코드의 라인 작업으로 작동하므로 최적화가 컴파일러에 비해 약간 느립니다. |
나중에 실행하기 위해 소스 코드가 필요하지 않습니다. | 나중에 실행하려면 소스 코드가 필요합니다. |
프로그램 실행은 전체 프로그램이 컴파일된 후에만 발생합니다. | 프로그램 실행은 모든 라인이 확인되거나 평가된 후에 발생합니다. |
컴파일러는 종종 소스 코드를 분석하는 데 더 많은 시간이 걸립니다. | 이에 비해 인터프리터는 소스 코드를 분석하는 데 걸리는 시간이 적습니다. |
컴파일러의 경우 CPU 사용률이 더 높습니다. | Interpreter의 경우 CPU 사용률이 적습니다. |
컴파일러의 사용은 대부분 프로덕션 환경에서 발생합니다. | 인터프리터는 주로 프로그래밍 및 개발 환경에서 사용됩니다. |
개체 코드는 나중에 사용할 수 있도록 영구적으로 저장됩니다. | 나중에 사용하기 위해 개체 코드가 저장되지 않습니다. |
C , C++ , C# 등은 컴파일러 기반의 프로그래밍 언어입니다. | Python , Ruby , Perl , SNOBOL, MATLAB 등은 인터프리터 기반 프로그래밍 언어입니다. |
직관적인 이해
위의 표와 그림을 보면, 비교적 자세하게 설명되어 있어 굳이 직관적인 이해를 덧붙일 필요가 있나 싶지만, 공식문서와 이 창을 둘 다 띄워놓고 보기에는 상당히 귀찮으니 몇 가지 특징을 중심으로 정리해보고자 한다.
- 인터프리터는 별도의 파일을 생성하지 않는다. 대신 언어 엔진이 그때그때 해석한다.
- 인터프리터는 코드를 한줄씩 읽고, 해석하며 실행한다.
- 인터프리터는 소스 코드 그대로를 해석하기에 오류가 발생할 때 상대적으로 오류를 찾기 쉽다. 다만, 컴파일 과정이 없기 때문에 오류가 있는 상태 그대로 구동되어버려 예기치 못한 버그를 일으킬 수 있다.
- 컴파일 언어들의 등장 배경을 보면 대부분 기계 동작에 필요한 코드를 작성하기 위해 개발되었고, 인터프리터 언어들의 등장배경을 보면 대부분 응용 소프트웨어 자체를 위해 개발된 경우가 많다.