Santos의 개발블로그

컴파일러의 개요 본문

CS(Computer science)/컴파일러

컴파일러의 개요

Santos 2019. 11. 24. 07:10

 

우리는 C, C++, Java 등의 고급언어를 사용하여 비교적 쉽게 프로그램을 작성하고, 이렇게 작성된 프로그램을 컴퓨터에서 실행함으로써 원하는 작업을 컴퓨터로 처리한다. 

 

그러나 고급언어로 작성된 프로그램들은 기계어가 아니므로, 컴퓨터에서 직접 실행할 수 없기 때문에 컴파일러가 이 프로그램들을 번역하여 컴퓨터가 실행할 수 있는 기계어로 변환시켜 준다. 

 

따라서 하나의 프로그램 언어가 출시되었다는 것은 그것을 번역하는 컴파일러가 만들어졌다는 뜻이 된다. 

 

컴파일러를 기록하는 첫번째 챕터에서는 아래 있는 내용들을 다룰 것이다.

 

1. 컴파일러의 필요성

2. 컴파일러와 인터프리터의 관계

3. 컴파일러의 실행순서

 


컴파일러의 필요성

컴퓨터는 0과 1로 구성된 2진법 수만 취급하므로 초기의 프로그래밍 언어는 0과 1로 작성된 기계어였다. 

프로그래밍언어: 컴퓨터 언어 중 어떤 문제를 풀기 위하여 일련의 과정을 기술하는 데 사용되는 언어

명령어를 0과 1로 나타낸다는 것이 매우 불편했기 때문에 조금 더 편리한 프로그래밍 언어를 생각하게 되었는데, 그것이 어셈블리어이다. 

 

어셈블리어는 0과 1로 구성된 명령어 대신에 A(ADD), L(LOAD) 등과 같이 그에 대응하는 기호를 사용함으로써 불편한 프로그래밍 작업을 완화시켜 주었다. 

 

작업순서는 다음과 같다. 

어셈블리어로 작성된 프로그램을 입력 -> 어셈블러가 번역 -> 기계어로 작성된 프로그램을 출력

하지만 어셈블리어도 기계어 처리방식을 알아야 하므로 프로그래밍하기가 매우 어려웠다.

 

이에 영어와 유사한 고급언어를 만들게 되었는데, 초기 프로그래밍에 자주 사용하였던 BASIC, FORTRAN, COBOL, PASCAL 뿐만 아니라 C, C++, JAVA 등이 고급언어에 포함된다. 

 

기계어에 비해 프로그램 작성이 용이하고, 디버깅이 쉬웠지만, 고급언어로 작성된 프로그램도 기계가 이해할 수 있는 기계어로 다시 바꿔줘야하는 어셈블러 같은 번역기가 필요했다. 

 

번역기의 종류를 살펴보면 어셈블러, 컴파일러, 프리프로세서, 인터프리터 등이 있는데 이 중 가장 대표적인 번역기가 컴파일러다. 

 

일반적으로 모든 컴퓨터는 어셈블러가 있다.

어셈블러: 어셈블리어로 작성된 프로그램을 그에 대응하는 기계어로 번역해 주는 번역기

컴파일러는 고급언어로 작성된 프로그램(원시 프로그램)을 어셈블리어로 작성된 프로그램으로 번역을 한다.

그러면 이를 어셈블러가 다시 기계어 프로그램으로 번역을 해준다. 

원시 프로그램 -> 컴파일러 -> 어셈블리어 -> 어셈블러 -> 기계어 -> 컴퓨터

컴파일러와 인터프리터의 관계

번역기 중에서 컴파일러와 인터프리터는 고급언어로 작성된 프로그램을 입력자료로 하여 번역하는 가장 대표적인 번역기들이다. 컴파일러를 더 자세하게 살펴보기 위해 인터프리터와 비교를 통해 알아보자.

 

컴파일러는 총 6단계 과정을 거쳐 번역을 하게 되는데, 이는 다음과 같다. 

 

1. 어휘분석 단계

2. 구문분석 단계

3. 의미분석 단계

4. 중간코드 생성 단계

5. 코드 최적화 단계

6. 목적코드 생성 단계

 

* 6단계의 과정은 추후 기록에서 자세하게 다룰 예정이다. 

 

이에 반해 인터프리터는 컴파일러와 같은 단계를 거치지 않고, 원시 프로그램을 그때그떄 번역하여 처리하는데 순서는 다음과 같다. 

 

1. 논리적인 순서에 따라 문장단위로 번역 

2. 실행

3. 다른 명령을 문장단위로 다시 번역 

4. 실행

5. 반복

 

밑에 표는 컴파일러와 인터프리터의 차이점을 분류하여 비교한 것이다. 

컴파일러 vs 인터프리터


컴파일러의 실행순서

* 추후 자세하게 기록할 예정이니, 여기서는 간략하게 기록한다. 

 

1. 어휘분석 단계 

원시프로그램을 읽어 들여서 프로그램 문장을 구성하고 있는 최소 단위인 어휘들을 떼어 내어 올바른지 분석하는 단계

 

"I love you"

 

"I love you" 라는 문장이 있다면 어휘 분석단계에서는 I", "love", "you" 하나하나의 대하여 그 단어가 올바른 단어인지를 분석한다. 

 

2. 구문분석 단계 

구문이란 문장구조란 뜻으로 구문분석은 문장구조가 올바른지를 분석하는 단계 

여기서는 I는 주어, Love는 동사 you는 목적어로 문장이 문법에 맞는 올바른 구문임을 확인하고 분석한다. 

 

3. 의미분석 단계 

구문분석 단계의 결과 어떠한 의미가 있고, 어떠한 기능을 하는지 분석하고, 이러한 기능이 올바르게 수행될 수 있도록 환경을 조성하는 단계

세번째 단계에서는 "I love you"라는 문장을 어떤 상황에서 쓸 수 있는지, 누군가에게 사용할 것인지 확인하고, 그러한 환경을 조성해 주는 단계라고 생각하면 된다. 

 

4. 중간 코드 생성

구문 분석단계에서 만들어진 결과물을 이용하여 코드를 생성하는 단계  

4번째 단계에서는 "I love you"라는 문장을 마음속에 적어내는 단계이다. 

 

5. 코드 최적화 단계

코드를 좀 더 효율적으로 만들어 코드 실행시 기억공간이나 실행기간을 절약할 수 있도록 하는 단계 

5번째 단계에서는 문장을 조금 더 다듬어 말을 뱉을 시 머릿속에 기억할 수 있는 공간이나 머리속에서 말로 나올 수 있는 전달 속도를 절약할 수 있도록 한다. 

 

6. 목적코드 생성단계 

연산을 수행할 레지스터를 선택하거나 자료구조에 기억장소의 위치를 정해주며, 실제로 기계어에 대한 코드를 생성하는 단계 

마지막 단계에서는 문장을 내뱉을 수 있도록 마음속에서 머릿속이 알아들을 수 있는 언어로 번역하고, 머릿속의 기억장소의 위치를 정해준다. 

 

다음 기록은 '형식언어와 오토마타' 이다

 

<Compiler> chapter 1, 컴파일러 개요 end

 


 

Comments