[Interview] CS fundamentals - 컴파일러와 인터프리터의 차이

Park, Jinyong·2021년 6월 3일

특별심화반

목록 보기
3/8

Interview는 면접 주제 블로깅으로 자신 있는 주제를 정해서, 이해한 바를 깊고 자세하게 작성한 글이다.

Q. 컴파일러와 인터프리터의 차이는 무엇인가요?

짧은 대답

컴파일의 경우, 어떤 언어로 작성된 코드를 다른 언어로 변환하는 과정을 뜻하지만, 여기서는 고수준 언어로 작성된 코드를 기계가 이해할 수 있는 저수준 언어인, 기계어로 변환하는 과정이라고 정의하겠습니다. 둘의 가장 큰 차이는 목적 프로그램을 생성하느냐, 안하느냐라고 할 수 있습니다. 컴파일러는 말 그대로 고수준 언어를 저수준 언어로 변환하는 도구입니다. 컴파일러를 통해 소스코드를 전부 컴파일해서 하나의 실행 가능한 프로그램을 만들 수 있습니다. 인터프리터의 경우, 컴파일러와는 달리 소스 코드에서 기계어로 변환하지 않고, 하나의 명령 단위로 수행한 결과를 바로 실행해서 결과를 확인할 수 있습니다. 보통, 컴파일된 프로그램이 인터프리터를 통해 실행하는 것보다 더 빠르게 실행됩니다. 하지만, 인터프리터는 모든 명령에 대해 컴파일이 이뤄지지 않아도 중간에 결과를 확인할 수 있다는 장점이 있습니다.

꼬리 질문

Q. 컴파일러가 필요한 언어와 인터프리터가 필요한 언어의 종류

컴파일러를 통해 하나의 프로그램을 만드는 언어를 컴파일 언어라고 하고, 인터프리터를 통해 단계적으로 실행되는 언어를 인터프리터 언어라고 합니다. 컴파일 언어의 경우, 대표적으로 C언어나 C++이 있습니다. 자바 또한 컴파일 언어지만 앞서 말한 언어와는 다르게 JVM 이라는 가상 머신에 의해 실행되기 위한 바이트코드로 변환됩니다. 인터프리터 언어로는 파이썬이나 자바스크립트가 있습니다. 자바스크립트의 경우에는 컴파일이 필요하면 내부에서 엔진 내부에서 컴파일될 수 있습니다.

Q. 컴파일이 수행되는 과정

C언어가 컴파일되는 과정을 예시로 하여 설명해보겠습니다. 순서대로 전처리, 컴파일, 어셈블러, 링커 과정이 있습니다. 전처리 과정은 소스 코드 내에서 include된 헤더 파일의 내용을 소스 코드에 가져오는 역할을 수행합니다. 그 외 전처리 매크로를 처리하는 과정입니다. 전처리가 끝난 파일은 *.i 확장자를 가진 파일이 생성됩니다. 이 파일은 다시 컴파일 과정을 거칩니다. 이 과정에서는 작성된 코드의 어휘나 구문을 분석하고 오류는 없는지 확인합니다. 컴파일 과정이 종료되면 *.s 확장자를 가진 어셈블리어 파일로 변환됩니다. 이렇게 생성된 파일은 어셈블 과정에서 어셈블러에 의해 기계어로 변환됩니다. 링커는 이렇게 생성된 기계어 파일과 C 라이브러리를 링크합니다. 링킹 과정이 종료되면 실행 가능한 실행 파일이 만들어지고 전체 과정이 종료됩니다.

Q. 자바스크립트 엔진과 컴파일

자바스크립트 언어를 해석하기 위한 엔진은 브라우저마다 다르지만, Chrome 브라우저나 node 런타임 환경에서의 V8 엔진을 예로 들어보겠습니다. 이 엔진은 Just-In-Time 컴파일러가 내장되어 있어 속도가 느린 인터프리터의 단점과 빌드가 오래 걸리는 컴파일러의 단점을 보완하였습니다. Just-In-Time 컴파일러는 runtime 시점에 기계어로 번역하는 컴파일 기법입니다. 기본적으로 인터프리터 방식으로 실행하다가 엔진에 있는 프로파일러가 호출 빈도가 높은 함수나 반복되는 코드를 발견하면 이 부분에 대해 JIT 컴파일로 최적화를 진행하여 더 빠르고 효율적인 코드로 변환하게 됩니다.

예시

C언어의 경우 다양한 컴파일러가 있지만, gcc 컴파일러를 예로 들겠습니다. source.c라는 소스 파일이 존재할 때, 우리는 gcc 컴파일러를 통해 실행 가능한 프로그램을 만들기 위해서 다음과 같은 명령어로 컴파일을 수행합니다.

$ gcc source.c -o source

source.c를 컴파일하여 source라는 실행 가능한 바이너리 파일을 만들었습니다. source를 실행하면 source.c에서 작성한 소스 코드의 동작을 수행합니다. source.c를 수정했으면 다시 컴파일 과정을 거쳐야 합니다.

자바스크립트의 경우, chrome의 개발자 도구 콘솔에 인터프리터가 있어 우리가 입력한 자바스크립트 코드가 명령 단위로 실행되는 것을 확인할 수 있습니다. 수정이 있더라도 명령 단위로 수행하므로 새로 컴파일을 수행하거나 할 필요가 없습니다.

References

1개의 댓글

comment-user-thumbnail
2021년 6월 3일

헤헿

답글 달기