컴파일러, 인터프리터 차이
영문으로 쓰여진 프로그래밍 언어를 컴퓨터는 어떻게 이해할까? 컴퓨터는 0과 1의 이진수만 이해할 수 있다. 이진수로 이해한다는 것을 더 정확히 말하면 프로그램의 연산을 실행하고 처리하는 장치인 CPU에 전기가 들어오면, 전압의 강도(전압의 크기가 작으면 0, 크면 1)에 따라 0과 1의 조합에 따라 명령을 수행한다.
그럼 프로그래밍 언어로 작성된 영문 글자를 CPU가 이해할 수 있는 기계어(0과 1의 연속으로 구성된 비트 단위의 저급 언어)로 번역해줄 번역기가 필요하다.
컴파일러와 인터프리터는 둘 다 프로그래밍 언어를 기계어로 변환해주지만 차이점이 있다.
컴파일
1) 좁은 의미: 특정 프로그램 소스 코드를 기계어로 변환하는 것
2) 넓은 의미: 특정 프로그램 소스 코드를 다른 언어(혹은 형태)로 변환하는 것
컴파일러
프로그래밍 언어로 쓰여 있는 소스 코드를 다른 언어로 변환(컴파일)하고 그 결과를 목적 파일에 써놓는 프로그램
컴파일러에 의해 컴파일된 목적 파일은 링크(최종 실행 가능한 파일(.exe)로 연결하는 과정)를 통해 실행 파일을 만드는 과정인 빌드(Build)를 거쳐 CPU가 실행 파일을 실행한다.
인터프리터
인터프리터(Interpreter)는 전통적인 의미에서 실행 전에 기계어로의 컴파일 과정을 거치지 않고 소스코드를 바로 실행하는 일종의 가상머신이나 실행 환경(runtime environment)이다. 그러나 인터프리터 방식도 내부적으로 소스 코드를 기계가 이해할 수 있는 형태로 변환이 되어야 한다.
- 컴파일러와 다른 점은 전체 소스 코드를 한 번에 기계어로 변환하는 것이 아니라, 코드를 한 줄씩 읽어들여 다른 중간 코드나 기계어로 변환해서 임시 파일(*.pyc)에 저장하고, 변환한 것을 바로 실행하는 프로그램이다.
인터프리터 작동 방식을 하드웨어 관점에서 보면,
인터프리터는 기계어로 변환된 코드를 실행 파일로 작성하지 않고, Memory에 바로 로드시켜 실행한다.
흔히 Python이 인터프리터라고 하지만 실제로 Python(CPython)이 작동하는 방식은 전통적인 인터프리터와는 다르다. 표준 파이썬 구현체인 CPython은 우리가 작성하는 Python 코드를 bytecode로 컴파일하고 난 뒤, Python Virtual Machine(PVM)으로 실행한다.
파이썬도 내부적으로 소스 코드를 기계어로 변환하기 때문에 그럼 컴파일 언어인 것인가?
인터프리터와 컴파일의 구분은 사실 구현체의 문제이다. 만약 다른 파이썬 구현체가 기계어로 된 실행 파일까지 생성한다면 컴파일 언어라고도 부를 수 있는 것이다. 그래서 엄밀히 말하면 표준 파이썬 구현체(CPython)는 기계어 실행 파일을 생성하지는 않지만 인터프리터 안에 컴파일러를 내장하고 있다고 볼 수 있다.
컴파일러, 인터프리터 장/단점
컴파일러는 개발 편의성은 떨어지지만, 실행 속도는 빠르다. 컴파일러는 한꺼번에 컴파일을 하기 때문에 컴파일 시간은 오래 걸리지만 실행 단계에서 이미 기계어로 변환된 목적 파일을 실행만 하면 되므로 속도가 월등히 빠르다.
단점은 전체 코드를 컴파일 후에 에러를 알려주므로 수정이 용이하지 않다는 것이다. 수정 사항이 발생하면 다시 컴파일을 해야 되는데, 컴파일이 몇 시간씩 걸리는 큰 프로그램에서는 문제가 된다.
컴파일 오류발생 -> 코드 수정 -> 컴파일 -> 실행 후 확인 |
인터프리터는 개발 편의성이 높지만, 실행 속도는 느리다. 인터프리터는 바이너리 파일만 실행시키면 되는 컴파일러와 달리, 변환과 실행을 동시에 진행해야 하므로 프로그램 자체 속도는 느리다. 소스 코드 한 줄을 변환해서 바로 실행하기 때문에 실행 시작 시간은 빠르지만 전체 실행 속도는 컴파일러가 훨씬 빠르다.
장점은 소스 코드를 한줄씩 실행하므로 에러를 바로 알려줘서 실시간 코드 수정이 가능하다.
인터프리터 오류발생 -> 코드 수정 -> 실행 후 확인 |