Post

컴파일러 - 컴파일러의 개요

컴파일러

1. 프로그래밍 언어

어떤 일을 컴퓨터로 처리하기 위해서 일련의 과정을 기술할 때 사용되는 언어를 말한다.
이런 프로그래밍 언어는 저급 언어와 고급 언어로 나뉠 수 있다.

1) 저급 언어

  • 모든 컴퓨터 구조에 관한 지식을 요구하며 프로그래머의 생각을 자연스럽게 표현할 수 있는 언어 구조를 갖추고 있지 못한 언어
  • 자기 자신에 대한 고유의 컴퓨터에서만 실행될 수 있음 (아키텍처 종속적)

ex) 어셈블리어, 기계어 등

2) 고급 언어

  • 특정한 컴퓨터 구조에 대한 지식이 없어도 프로그래머의 생각을 자연스럽게 표현할 수 있도록 저급 언어에서는 제공되지 않은 다양한 언어의 기능을 갖추고 있는 언어
  • 자연 언어와 비슷한 형태로 설계되어 언어 번역기만 갖추면 모든 기종에서 수행될 수 있는 특징을 갖고 있음
  • 저급 언어에 비해 배우기가 쉽고 프로그래머의 생산성(productivity)을 높일 수 있을 뿐만 아니라 한 기종에서 다른 기종으로 프로그램을 쉽게 가져갈 수 있는 이식성(portability)이 우수함
  • 저급 언어보다 디버깅이 용이하며 기계 독립적이기 때문에 특정한 컴퓨터의 구조를 모르고도 프로그래밍을 할 수 있음

ex) c, c++, cobol, fortran 등

2. 번역기

한 프로그래밍 언어로 작성된 프로그램을 입력으로 받아 그와 동등한 의미를 갖는 다른 프로그래밍 언어로 된 프로그램을 출력하여 주는 시스템 프로그램을 말한다. 이때 입력되는 프로그램을 소스 프로그램이라 하고 이 프로그램을 기술한 언어를 소스 언어라 함 출력되는 프로그램을 목적 프로그램이라 하고 이 프로그램을 기술한 언어를 목적 언어(objective language 또는 target language)라 함 이러한 번역기에는 아래와 같은 종류가 있다.

1) 컴파일러

고급 언어에 속한 프로그래밍 언어를 이용해서 코드를 작성했다면 해당 코드를 컴퓨터에서 구동할 수 있게끔 변환해주어야한다. 이를 컴파일이라고 하며 변환해주는 프로그램을 컴파일러라고 한다. 이 컴파일의 목적어는 어셈블리어나 혹은 기계어이다.

a. 크로스 컴파일러

소스 프로그램을 컴파일러가 실행되고 있는 기계에 대한 기계어가 아닌 다른 기종에서 구동 가능한 기계어로 번역하는 컴파일러
ex) 윈도우에서 컴파일하지만 linux에서 구동가능한 기계어로 만드는 것

b. 바이트코드 컴파일러

Java를 예시로 들 수 있는데, 자바 코드를 실행하기 위해서 컴파일을 하면 어셈블리어나 기계어가 아닌 바이트코드라고 불리는 중간 코드로 컴파일 되는데 이 바이트 코드는 자바 가상 기계에서 인터프리터 되어 실행된다. 때문에 자바 언어 처리기를 컴파일러와 인터프리터 방식 두가지가 혼합되었다고 해서 혼합형 컴파일러라고 한다.

3) 어셈블러

기계어를 보기 편한 형태로 바꿔준게 어셈블리어다. 이러한 어셈블리어의 경우에도 컴퓨터에서 바로 구동은 할 수 없다. 모든 컴퓨터는 기계어만 구동가능하기 때문이다. 이러한 어셈블리어를 기계어로 바꿔주는 프로그램이 어셈블러이다.

4) 인터프리터

컴파일러는 프로그램 전체를 스캔하여 이를 모두 기계어 혹은 어셈블리어로 변역하지만 인터프리터의 경우 한번에 한 문장씩 스캔하여 번역 후 실행한다. 전체 문장을 실행한다고 할 때 한 문장 번역 후 실행하고 한 문장 번역 후 실행하고를 반복하기에 실행시간이 느리나(일반적으로 10배 이상!)
한번에 작은 단위를 번역하고 실행하기때문에 메모리 효율이 좋다.
더불어 컴파일러는 실행 이전에 문법 오류를 알 수 있지만 인터프리터의 경우 실행해보고 나서야 문법 오류를 알 수 있다.

5) 프리프로세서/전처리기

프로그래밍 언어에 유용한 기능들을 추가시킴으로써 언어를 확장, 이 경우 프로그래밍 언어를 프리프로세서의 기본 언어라 부른다.
c언어 프리프로세서의 경우 아래의 3가지 기능을 제공한다.

  • 파일 포함 기능
    프로그램에 헤더 파일들을 포함한다.

  • 매크로 처리 기능
    c언어의 경우 #define으로 정의 된 매크로를 확인하여 미리 정의된 값으로 바꾸어줌

  • 조건부 컴파일
    조건에 따라 소스 프로그램의 일부분을 선택적으로 삽입 혹은 삭제하는 기능

참고자료

This post is licensed under CC BY 4.0 by the author.