본문 바로가기
컴퓨터과학[3-2]/컴파일러

컴파일러구성 - [제1장]컴파일러 개요

by boolean 2016. 6. 26.
728x90

컴파일러구성 - [제1장]컴파일러 개요


컴파일러 주요 용어

  1. 원시프로그램 : 번역기에 입력되는 프로그램
  2. 목적프로그램 : 번역기에서 출력되는 프로그램
  3. 어셈블러 : 어셈블리어로 작성된 프로그램을 그에 대응하는 기계어로 번역하여 주는 번역기
  4. 컴파일러 : 고급언어(basic, JAVA, C, C++ 등)로 작성된 프로그램을 저급언어로(어셈블리어나 기계어)로 번역해주는 번역기
  5. 프리프로세서 : 프로그래밍 언어에 유용한 기능들을 추가하여 언어를 확장시켜 주는 역할을 하는 것으로서, 원시언어와 목적언어가 모두 고급언어인 번역기
  6. 인터프리터 : 고급언어를 입력으로 받아들여서 번역과 동시에 실행을 한 후, 그 결과를 출력하기 때문에 APL SNOBOL 등과 같은 대화용 언어를 구현할 경우 사용
  7. 디버깅 : 프로그래밍의 오류를 발견하고 그 원인을 수정하는 작업
  8. 이식성 : 원시 프로그램을 다른 기종으로 옮기는 건이 얼마나 용이한가를 나타내는 정도
  9. 번역기 : 하나의 프로그래밍 언어로 작성된 프로그램을 입력으로 하여 그와 동등한 의미를 갖는 다른 프로그래밍 언어로 된 프로그램을 출력하는 하나의 프로그램
  10. 토큰 : 컴파일러나 어셈블러 등의 처리기에서 아용되는 어휘분석의 최소 단위이다. 즉 예약어, 상수, 연산자, 식별자, 구분자 등이다.
  11. 어휘분석기 : 원시 프로그램을 읽어 들여 토큰(token)이라는 의미있는 문법적 단위로 분리하여 출력하는 프로그랭
  12. 구문분석기 : 어휘분석 단계의 결과인 토큰를을 받아, 이 토큰들이 주어진 문법에 맞는지 검사하는 프로그램
  13. 파스트리 : 토큰을 단말 노드로 하여 트리 형태로 표현한 것
  14. 구문트리 : 파스트리에서 불필요한 정보들을 제거하고, 꼭 필요한 정보들만으로 구성된 트리
  15. 의미분석 : 구문트리에 대하여 어떻한 의미와 기능을 하는 것인지를 분석하고, 이러한 기능이 올바르게 수행될 수 있도록 환경을 구성한다.
  16. 코드최적화 : 코드를 좀더 효율적으로 만들어 코드 실행시 기억공간이나 실행시간을 절약한다.
  17. 지역최적화 : 부분적인 관점에서 일련의 비효율적인 코드를 구분해 내고, 좀더 효율적인 코드로 수정한다.
  18. 전역최적화 : 지역최적화와는 달리 부분적인 관점이 아니라, 전체적인 관점에서 좀더 효율적인 코드로 수정하는 방법
  19. 패스 : 컴파일러를 구현할 때 여러 논리적 단계들을 모아서 하나의 물리적 모듈로 묶는것

요점정리

  • 컴파일러와 인간이 의사 전달을 하기 위해서는 BASIC, FORTRAN, COBOL, PASCAL, C,C++, JAVA, Delphi 와 같은 고급언어가 필요하고, 이러한 고급언어로 작성된 프로그램을 컴퓨터가 인식할 수 있도록 저급언어로 번역해 주기 위해 번역기가 필요하게 된다. 번역기에는 어셈블러(assembler), 컴파일러(compiler), 인터프리터(interpreter), 프리프로세서(preprocessor) 등이 있는데 이들 중 가장 대표적인 번역기가 컴파일러이다.
  • 번역기들 중에서 고급언어로 작성된 프로그램을 입력 자료로 하여 번역하는 가장 대표적인 번역기는 컴파일러와 인터프리터이다. 컴파일러는 일반적으로, 어휘분석(lexical analysis) 단계, 구문분석(syntax analysis) 단계, 의미분석(semantic analysis) 단계, 중간코드 생성(intermediate code generation) 단계, 코드최적화(code optimization) 단계, 목적코드 생성(code generation) 단계를 거쳐 저급언어로 번역되며, 인터프리터는 컴파일러와는 달리 원시 프로그램을 입력 프로그램의 논리적인 순서에 따라 문장단위로 번역한 후, 곧바로 실행한다. 이러한 차이로 인해 번역기들은 각각의 특성을 갖게 된다.
  • 어휘분석 단계에서 원시 프로그램을 읽어 들여 토큰단위로 분리하여 출력하며, 구문분석단계에서 이 토큰들이 주어진 문법에 맞는지를 검사하고, 구문분석 단계의 결과인 구문트리에 대하여 어떠한 의미와 기능을 하는 것인지를 분석하고, 이러한 기능이 올바르게 수행될 수 있도록 환경을 조성하는 일을 하는 것이 의미 분석이다.
  • 의미분석 단계까지의 내용으로 코드를 생성해도 되지만 좀더 효율적으로 만들어 실행시 기억공간이나 실행시간을 절약하는 것이 필요한데 이를 수행하는 것이 코드최적화이고 코드최적화가 되기 위해서 먼저 중간코드가 생성되어야 한다. 마지막 단계인 목적코드 생성 단계에서는 최적화된 코드를 그대로 레지스터나 기억장소 위치를 정해서 목적코드로 생성해준다.
  • 컴파일러는 위에서 말한 6단계의 논리적인 구조를 가지고 있다. 논리적인 구조를 실제 구현하게 되는 경우 1-패스 컴파일러(one-pass compiler) 또는 2-패스 컴파일러(two-pass compiler) 방법을 이용한다. 1-패스 컴파일러는 초창기에 컴파일러를 만들 때 사용했던 방법으로 컴파일러의 전 과정을 하나의 패스로 구현하는 방법이고, 2-패스 컴파일러는 컴파일러의 구성을 중간코드를 기점으로 하여 앞 단계를 전반부, 뒷 단계를 후반부로 구성하는 방법이다.
  • 컴파일러를 구현하는 것은 일반 소프트웨어의 구현과 비슷하지만, 설계상의 문제, 컴퓨터의 소프트웨어 시스템, 사용자의 요구사항 및 개발에 참여하는 인적 자원 등을 고려하여 구현해야 한다.
  • 연습문제

    • 연습문제1
      다음 중 저급언어를 저급언어로 번역하는 기능을 갖고 있는 번역기는?
      답을 체크하세요
      정답 :
      어셈블리어는 저급언어를 저급언어인 기계어로 번역한다. 
    • 연습문제2
      다음 중 컴파일러 기법에 대한 설명 중 옳지 않은 것은?
      답을 체크하세요


      정답 :
      인터프리터 기법은 사용자에게 많은 융통성을 준다. 
    • 연습문제3
      다음 중 프로그래밍 언어에 유용한 기능들을 추가하여 언어를 확장하는 경우 주로 사용되는 것은?
      답을 체크하세요
      정답 :
      프리프로세서에 대한 설명이다. 
    • 연습문제4
      혼합형 연산을 하는 경우 정수를 실수로 바꾸어 주어야 한다. 다음 중 어느 단계와 관계 있는가?
      답을 체크하세요
      정답 :
      의미분석 단계에서 혼합형연산의 형을 동일한 형으로 변환해 준다. 
    • 연습문제5
      다음은 컴파일러의 물리적 구조에 대한 설명이다. 틀린 것은?
      답을 체크하세요
      정답 :
      컴파일러의 논리적 구조를 구현한 것이 패스이다. 따라서 논리적 구조와 순서가 같을 필요는 없다. 
    • 연습문제6
      컴파일러의 논리적 구조가 올바르게 나열된 것은?
      답을 체크하세요
      정답 :
      어휘분석-구문분석-의미분석-중간코드 생성-코드최적화-코드생성


    댓글