[컴파일러] 컴파일러 개요
👑 컴파일러란?
소프트웨어는 모두 프로그래밍 언어로 작성되며, 컴퓨터는 프로그래밍 언어로 쓰여진 그대로를
해석할 수 없다. 따라서 컴퓨터가 이해할 수 있는 형태로 번역되어야 하며, 이러한 번역을 해주는
소프트웨어 시스템을 컴파일러(compiler)라 한다. 다시 말하면, 한 언어의 프로그램을
읽어서 의미가 같은 다른 언어의 프로그램으로 번역하는 프로그램이다.
컴파일러의 중요한 역할은 번역과정에서 탐지되는 오류를 보고하는 것이다. 이 때, 저급언어로의 번역을 하면
compiler, 동일 언어로의 번역을 하면 rewriter, 고급언어로의 번역을 하면 decompiler라 한다.
💡 프로그램의 처리 과정
프로그램의 처리 과정은 기본적으로 유사하지만, 언어마다의 차이가 조금씩 존재한다.
다음은 기본적인 프로그램의 처리 과정이다.
-
전처리기C와C++같은 언어에서는#include로 헤더 파일을 포함하거나,#define으로 매크로를
정의하는 작업이 전처리 단계에서 이루어진다.
-
컴파일러C/C++은 컴파일러를 통해 소스코드를어셈블리어로 변환하며,Java의 경우바이트 코드로
불리는 중간 코드를 생성한다.
-
어셈블러-
컴파일러가 생성한 어셈블리 코드는 어셈블러를 통해
기계어로 변환된다. -
Java의 경우 전통적인 어셈블리어 생성 단계를 거치지 않는다.
-
-
링커, 로더링커는 외부 메모리 주소를 해결하며,로더는 목적 파일을 통합하여 메모리에 적재한다.
💡 컴파일러의 단계
※ 컴파일러 vs 인터프리터
인터프리터(Interpreter)는 다른 종류의 언어 처리기로, 번역으로 목표 프로그램을 생산하는 대신에
사용자의 입력에 대해서 연산을 직접 실행한다. 코드를 기계어로 변환하는 과정 없이 그때그때 해석하며,
프로그램 전체를 미리 변환하지 않는다.
일반적으로 컴파일러를 통해 생성된 목표 프로그램은 인터프리터보다 실행 속도가 빠르지만, 인터프리터는
문장 단위로 프로그램을 실행하기 때문에, 컴파일러보다 더 좋은 오류 진단을 제공한다.
JAVA의 경우 JIT (Just-In-Time) 컴파일을 사용하여 컴파일러와 인터프리터의 장점을 결합
💡 문제
1. 컴파일러와 인터프리터의 차이는 무엇인가?
-
컴파일러- 소스 코드를 한 번에 전체 번역하여 기계어 또는 바이트코드로 변환한 후 실행 파일을 생성한다.
이 실행 파일은 소스 코드가 없어도 독립적으로 실행이 가능하다.
- 소스 코드를 한 번에 전체 번역하여 기계어 또는 바이트코드로 변환한 후 실행 파일을 생성한다.
-
인터프리터- 소스 코드를 한 줄씩 해석하며 바로 실행한다. 실행 파일을 생성하지 않으며, 소스 코드를
실행 환경에서 직접 해석한다.
- 소스 코드를 한 줄씩 해석하며 바로 실행한다. 실행 파일을 생성하지 않으며, 소스 코드를
2. 컴파일러와 인터프리터의 서로의 장단점은?
-
인터프리터와 비교하여 컴파일러의 장점은 무엇인가-
실행 속도가 빠르다.
-
독립적인 실행 파일의 생성
-
-
컴파일러와 비교하여 인터프리터의 장점은 무엇인가?-
코드 수정에 용이함 (개발 속도가 빠름)
-
소스 코드를 다양한 플랫폼에서 실행 가능하므로 이식성이 높음
-
디버깅에 용이함 (더 나은 오류 메시지 제공)
-
3. 컴파일러가 기계어 대신 어셈블리 언어를 생산하는 이유는?
어셈블리어는 기계어보다 플랫폼에 덜 의존적이다. 즉, 한 시스템에서 생성된 어셈블리 코드는
다른 시스템에서 쉽게 수정하여 사용할 수 있다.
또한, 기계어는 0과 1로 이루어져 있어 이해하기 어렵지만, 어셈블리어는 기계어보다 이해하기
쉬워 가독성이 높고 디버깅이 더 용이하다.
어셈블리어는 낮은 수준에서 코드 최적화를 가능하게 하여, 성능을 개선할 수도 있다.
Leave a comment