반응형
어셈블러 : 저급언어를 저급언어로 번역하는 기능을 갖고 있는 번역기
- 어셈블러는 저급언어인 어셈블리어를 입력으로 하여 저급언어인 기계어로 번역하는 번역기
컴파일러 : 고급언어를 저급언어로 번역하는 기능을 갖고 있는 번역기
- 저급언어란 기계의 구성과 관련이 깊은 언어로 기계 중심 언어 ( low - level - language )
프리프로세서 : 고급언어를 다시 고급언어로 번역하는 번역기
- 프리프로세서는 프로그래밍 언어에 유용한 기능들을 추가하여 언어를 확장하는 경우 주로 사용된다.
- C언어에서의 표제 파일 (header), 매크로, 조건번역 등의 기능도 프리프로세서이다.
인터프리터 : 고급언어를 입력받아 실행결과를 바로 출력하는 것
- 고급언어로 작성된 원시 프로그램을 중간코드로 변환하고, 변환된 중간코드를 명령어 단위로 가져다가 디코드 하고 실행한다.
JAVA 컴파일러 : JAVA 고급언어를 JAVA 가상머신에서 실행될 수 있는 바이트코드(중간코드)로 번역한다.
번역기 종류
- 고급언어 -> 컴파일러 -> 어셈블리어 / 기계어
- 고급언어 -> 프리프로세서 -> 고급언어
- 고급언어 -> 인터프리터 -> 실행결과
- 어셈블리어 -> 어셈블러 -> 기계어
컴파일러와 인터프리터
< 컴파일러 기법 >
- 컴파일러 기법은 입출력 포맷 등 큰 기억장소를 요구한다.
- 많은 횟수로 반복처리되는 프로그램의 경우에 효율적이다.
- FORTRAN, PASCAL, C, C++, JAVA 언어 구현에 사용된 기법
< 인터프리터 기법 >
- 사용자에게 많은 융통성을 준다.
- 컴파일러에 비해 시간이 많이 소요된다.
- APL, SNOBOL, LISP 등의 언어에 사용된 기법
컴파일러의 논리적 구조
- 컴파일러는 6단계의 논리적인 구조를 갖는다.
- 논리적 구조와 물리적 구조가 일치하면 6개의 패스가 만들어진다.
논리적 구조 6단계
< 어휘분석 - 구문분석 - 의미분석 - 중간코드생성 - 최적화 - 목적코드생성 >
- 어휘분석 : 원시프로그램을 읽어 들여 프로그램 문장을 구성하고 있는 최소 단위인 어휘들을 떼어 내어 해당 어휘들이 올바른지 분석하는 일을 한다. 올바르지 않으면 오류 메시지, 올바르면 토큰으로 반환한다. 어휘, 토큰은 의미가 있는 최소의 문법적 단위를 뜻한다. 이와 같은 일을 하는 것을 어휘분석기 혹은 스캐너 라고 한다.
- 구문분석 : 파싱이라고도 하며, 어휘분석 단계의 결과인 토큰들을 입력받아 올바른 문장구조를 갖고 있는지를 검사한다. 올바른 문장에 대해서는 그 문장에 대한 구문구조를 만들어 출력하고, 올바르지 않으면 오류메시지를 출력한다. 구문분석을 담당하는 것을 구문분석기 혹은 파서 라고 한다.
구문구조는 토큰들을 단말노드로 하는 트리 형태로 표현되며 이를 파스트리 라고한다. ( 그림 1 )
파스트리는 중간코드생성 단계에서 이용되며, 불필요한 정보를 제거하고 다음 단계에서 꼭 필요한 정보만으로 구성된 트리를 만드는데 이를 구문트리 라고 한다. ( 그림 2 )
- 의미분석 : 구문트리가 어떠한 의미가 있고 어떠한 기능을 하는지를 분석하고 , 해당 기능이 올바르게 수행될 수 있도록 환경을 조성한다. 구문트리를 보며 산술식과 각 문장의 연산자 및 피연산자를 인식하고 유형 검사 등을 한다. 유형검사란 각 연산자들이 원시 프로그램 규칙에 의해 허용된 피연산자를 가졌는지를 검사하는 것을 뜻한다.
- 중간코드생성 : 문법규칙이 reduce될 때 그 규칙에 알맞은 코드생성 루틴을 부름으로써 중간코드를 생성한다. 중간코드생성을 담당하는 도구를 중간코드 생성기 라고 한다. 위의 구문분석에서 얻어진 파스트리에 의하여 다음과 같은 중간코드 열을 얻는다.
- 코드최적화 : 코드를 좀 더 효율적으로 만들어 코드 실행 시 기억공간이나 실행시간을 절약하기 위한 단계. 최적화 방법에 따라 지역최적화, 전역최적화로 나눌 수 있다.
- 목적코드생성 : 컴파일 과정의 마지막 단계, 연산을 수행할 레지스터를 선택하거나 자료에 기억장소의 위치를 정해주며 실제로 목적기계어에 대한 코드를 생성한다. 중간코드들을 기계명령어로 바꾸어주는 역할을 한다.
컴파일러의 물리적 구조
- 1-패스 컴파일러
- backpatching이 요구된다. ( 전진분기의 처리를 위해 빈칸으로 남겨져 있다가 정보를 얻었을 때 채워 넣는 것 )
- 초창기에 컴파일러를 만들 때 사용했던 방법
- 원시 프로그램을 중간코드 생산 없이 직접 목적코드로 번역하므로 효율성이 좋고 실행속도가 빠르다.
- 2-패스 컴파일러
- 이식성이 좋다.
- 실행속도가 늦다.
- 중간코드를 기점으로 하여 전반부와 후반부로 구성하는 방법
- 하나의 패스가 사용했던 공간을 다시 사용하므로 기억장소를 절약할수 있다.
- 직접 목적코드로 번역하지 못하기 때문에 기계코드 표현에 제약을 받는다.
반응형