컴파일 (Compile) vs 인터프릿 (Interpret)
개발자들이 코드를 작성할 때 사용하는 고급 언어는 사람이 이해하기 쉽지만, 컴퓨터는 0과 1로 이루어진 기계어만을 이해할 수 있다. 이러한 상황에서 고급 언어로 작성된 코드를 컴퓨터가 이해할 수 있는 형태로 변환하는 과정이 필요하다. 이 변환은 주로 컴파일과 인터프리트라는 두 가지 방식으로 이루어진다.
컴파일(Complie)
런타임 이전에 소스 코드를 검사하고 기계어로 해석하는 방식이다. 특징은 아래와 같다.
- 전체 코드를 검사하고 실행하기 때문에 실행 전에 오류를 발견할 수 있다.
- 구동 시간은 오래 걸리지만, 이후에는 매우 빠르게 동작한다.
- 구동 시 시스템으로부터 메모리를 할당 받아 사용한다.
- 대체로 컴파일 결과물이 바로 기계어로 전환 => OS 및 환경에 종속적이다.
- 대표적인 컴파일 언어는 C/C++ 등이 있다.
인터프릿(Interpret)
런타임 이후에 한 행씩 읽어가며 해석하는 방식이다. 특징은 아래와 같다
- 런타임에 즉시 해석하기 때문에 실행 시간은 오래 걸리지만 실시간 디버깅 및 코드 수정이 가능하다.
- 한 줄씩 실행하다가 오류가 나면 중지된다.
- 메모리를 별도로 할당 받지 않고, 필요할 때 할당하여 사용한다.
- 대표적인 언어는 Javascript, Python, Ruby 등이 있다.
컴파일(Complie)과 인터프릿(Interpret)을 모두 사용하는 경우
보통 프로그래밍 언어는 두 방식 중 하나를 사용하지만 두 가지를 모두 사용하는 언어도 있다.
1. Java
- javac 로 컴파일 하고 java 로 실행 시 중간 언어(.class 파일)를 한 줄씩 자바 인터프리터가 번역
2. TypeScript
- TypeScript 코드를 작성하면 TypeScript 컴파일러(tsc)가 해당 코드를 JavaScript로 변환
- 컴파일 과정을 통해 타입 체크 및 코드 최적화가 가능함
- 이후, JavaScript 코드가 브라우저나 Node.js와 같은 런타임 환경에서 인터프리터 방식으로 실행
- 런타임에서는 JavaScript와 같이 동작하여 실행 환경에 따라 유연하게 사용될 수 있음
런타임 (Runtime) vs 컴파일 타임 (Compile Time)
- 컴파일 : 개발자가 고급 언어로 작성한 소스코드를 기계어로 변환하여 실행 가능한 프로그램으로 만드는 과정
- 런타임 : 이런 응용 프로그램이 사용자에 의해 동작될 때
- 컴파일 오류 : 컴파일 시 소스 코드를 먼저 확인하기 때문에 에러가 있으면 컴파일을 실패
- 런타임 오류 : 컴파일은 문제 없이 되었는데 실행 중 예상하지 못한 오류로 동작하지 않는 경우
- ex) 잘못된 null참조, 잘못된 자료형 사용