컴파일러와 인터프리터 - 컴퓨터의 번역기
(얄팍한 지식..)
컴퓨터도 번역기를 사용한다 |
저희는 대한민국 사람이기 때문에 한국어를 사용하죠?
그러다 보니 영어, 스페인어, 중국어 등은 잘 이해하지 못합니다. 우리가 사용하는 언어가 아니기 때문이죠.
그래서 우리는 파파고와 같은 번역기를 이용해 다른 언어를 받아들입니다.
이러한 특징은 컴퓨터에게도 마찬가지입니다. 컴퓨터 세상의 언어는 0과 1로 이루어진 이진수입니다.
우리가 명령하는 영어나 한국어를 알아듣지 못한다는 뜻입니다.
그래서 우리가 컴퓨터에 명령한 내용을 기계어로 번역해주는 컴퓨터만의 번역기가 필요합니다.
그러면 그 번역기가 프로그래밍 언어를 CPU가 이해할 수 있는 언어로 변환해주는 것입니다.
우리에게 파파고가 있다면 컴퓨터엔 컴파일러와 인터프리터가 있습니다.
이 두 가지는 같은 목적이 있지만 약간의 차이점이 있습니다. 컴파일러부터 알아보죠.
컴파일러 |
컴파일러는 프로그램 전체를 스캔하여 이를 모두 기계어로 한 번에 번역합니다.
전체를 스캔하기 때문에 컴파일러는 초기 스캔 시간은 오래 걸리지만
이 초기 스캔을 마치면 실행파일을 만들어 놓고 계속 사용합니다.
따라서 다음번에 실행할 때는 다시 스캔할 필요 없이
이미 만들어진 실행파일을 사용하여 실행 속도가 빠르다는 장점이 있습니다.
또한 컴파일러는 전체적인 코드를 검사한 후에 오류 메시지를 생성하여
실행 전에 오류를 발견할 수 있다는 특징을 가지고 있습니다.
하지만 컴파일러는 이 과정에서 오브젝트 코드(Object Code)라는 파일을 만들고
이 오브젝트 코드를 다시 묶어서 하나의 실행 파일로 만드는 링킹(Linking) 작업을 해야 합니다.
그래서 메모리를 많이 사용하게 된다는 단점이 있습니다.
방금 위에서 언급된 오브젝트 코드는 소스 코드를 컴파일한 결과물입니다.
오브젝트 파일은 링커를 통해 최종 실행 가능한 파일로 연결되는 과정을 거쳐 실행 파일을 만들고 CPU가 그 실행 파일을 실행하게 됩니다. 이 과정을 간단하게 정리하면 아래와 같습니다.
인터프리터 |
인터프리터는 프로그램을 실행할 때 한 번에 한 문장만 기계어로 번역합니다.
기계어로 컴파일하는 과정을 거치지 않고 코드를 한 줄 한 줄 읽어
다른 중간 코드나 기계어로 변환하여 임시 파일에 저장하고 변환한 것을 바로 실행하는 방식입니다.
그래서 프로그램을 실행하기 전에는 오류를 발견할 수 없다는 특징을 가지고 있기도 합니다.
프로그램이 실행되고 한 문장씩 번역되다가 중간에 오류를 만나면 프로그램이 중지되는 방식이죠. (생방송 중단)
번역하고 실행하는 과정을 계속 반복하다 보니 실행 시간이 컴파일러에 비해 더 느립니다.
그러나 컴파일러와 달리 오브젝트 코드나 링크, 실행 파일을 따로 만들지 않고
메모리에 바로 로드시켜 실행하기 때문에 메모리 효율은 높습니다.
또한 코드를 변경해도 바로 실행할 수 있기 때문에 개발 속도 측면에서도 장점이 있습니다.
컴파일러와 인터프리터의 작동방식을 정리하자면 다음과 같습니다.
- 총정리
컴파일러를 사용하는 대표적인 언어로는 C, C++, C#, JAVA 등이 있고
인터프리터를 사용하는 대표적인 언어로는 Python, R, Ruby, Javascript 등이 있습니다.
각각의 언어의 특징, 목적, 환경에 맞게 그 언어에 알맞은 번역기를 사용합니다.
C언어와 파이썬의 작동 방식이 약간 다르다고 느껴지는 이유가 바로 이 번역기의 차이 때문입니다.
지금까지 컴파일러와 인터프리터에 대한 아주 얄팍한 이야기를 해보았습니다. 이에 대해 흥미가 생기셨다면 다른 자료들을 참고해보시면 좋을 것 같습니다.