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

컴파일러구성 - [제15강] 코드의 최적화와 코드의 생성

by boolean 2016. 7. 18.
728x90

컴파일러구성 - [제15강] 코드의 최적화와 코드의 생성

실행시간 최적화 ·기억용량 최적화 ·산술식의 코드생성 ·논리식의 코드생성

컴파일러 용어정리

  • 상수전파
    컴파일 시에 상수를 포함하는 연산이 계산될 수 있으면 계산을 함으로써 코드를 줄이는 방법
  • 프로시저 호출의 전개
    프로시저 호출의 실행에는 실인자가 전달이 필요하고, 호출된 프로시저에서는 레지스터의 교체라든가 자료영역의 확보, 복귀 때의 레지스터의 회복 등 많은 처리를 필요로 함. 어떤 경우에는 이런 처리보다 프로시저를 호출하는 곳에서 호출되는 프로시저의 본체를 전개하면 그들 처리를 생략할 수 있음
  •  복사전파
    치환문을 삭제하고 삭제된 치환문의 1-value 대신에 r-value를 사용하는 방법
  • 제어흐름의 최적화
    불필요한 jump문을 제거하는 것
  • 레지스터
    레지스터는 마이크로프로세서의 일부분으로서 아주 적은 데이터를 잠시 저장할 수 있는 공간이며, 하나의 명령어에서 다른 명령어 또는 운영체계가 제어권을 넘긴 다른 프로그램으로 데이터를 전달하기 위한 장소를 제공한다. 
  • 누산기
    accumulator, 누산기는 CPU 내에서 계산의 중간 결과를 저장하는 레지스터를 가리킨다. 누산기는 ALU로 직접 통하는 통로를 가지고 있기 때문에, 주기억장치에 읽고 쓰는 것보다 훨씬 빠르다.
  •  ALU
    arithmetic-logic unit: 산술논리 연산장치 : ALU는 CPU의 일부로서 컴퓨터 명령어 내에 있는 연산자들에 대해 연산과 논리동작을 담당한다. 몇몇 프로세서들에서는 ALU가 연산장치(AU)와 논리장치(LU)의 두 부분으로 나뉘어져있는 경우도 있다. 

요점정리

  1. 코드최적화란 보다 효율적인 실행코드를 만드는 것으로서 최적화 과정은 최적화 관점에 따라 여러 가지로 분류된다. 주로 실행시간을 짧게 하기 위한 최적화와 소요기억 용량을 작게 하는 최적화로 나누는 방법을 많이 사용한다.
  2. 실행 시간을 짧게 하기 위한 최적화 방법으로는 공통 부분식의 제거, 상수전파, 코드이동, 루프의 융합, 루프전개, 프로시저 호출의 전개, 불필요한 코드의 제거, 복사전파, 식의 연산순서 변경, 중복된 로드∙저장 명령문 제거, 식의 대수학적 간소화, 연산의 세기 경감, 결합변경, 귀납변수 최적화 및 기타의 방법들이 있다.
  3. 소요 기억용량의 최적화를 위한 방법으로는 상수전파, 루프의 융합, 복사전파, 중첩된 로드, 저장 명령문 제거, 연산의 세기경감, 레지스터 할당 등의 방법 이외에도 부프로그램화와 부분식 끌어올리기 등의 방법이 있다.
  4. 컴파일러의 마지막단계는 코드생성이다. 목적코드 생성은 중간코드를 입력으로 받아 그 기계에 맞는 기계어로 생성할 수도 있으며, 어셈블리어로도 생성할 수 있다. 좋은 코드를 생산하려면 해당되는 기계의 하드웨어나 운영체제에 대해서 잘 알아야 한다.
  5. 산술식에 대한 목적코드의 생성은 레지스터에 따라 생성하는 방법이 다르다.
  6. 논리식은 ∧(AND),∨(OR),¬(NOT)등의 논리연산자를 사용한다. 또한 논리식의 값은 특별한 기능을 갖는데 논리식에 대한 목적코드를 생성할 때 이러한 특성을 이용하면 좀더 효율적으로 목적코드를 생성할 수 있다. 

연습문제

  • 연습문제1
    다음은 최적화의 분류에 관한 설명이다. 틀린 것은?
    답을 체크하세요
    정답 :
    최적화란 실행속도를 높이고 기억장소를 절약하는 방법으로 구체적으로 보면
       - 지역최적화(local)와 전역최적화(global).
       - 단일문에서의 최적화와 루프(loop)에서의 최적화
       - 실행속도 면에서의 최적화와 기억장소 절약면에서의 최적화
    등으로 구분해 볼 수 있다.
  • 연습문제2
    최적화를 위하여 치환문을 삭제하고 삭제된 치환문의 l-value 대신에 r-value를 사용하는 것은?
    답을 체크하세요
    정답 :
    복사전파란
    A := B
    C:= A+B에서 C:=B+D 와 같이 하나의 치환문으로 구성하는 것
    참고로 l-value 는 기억장소의 주소이고 r-value 는 기억장소에 있는 값을 뜻한다.
    이 경우 A := B에서 A 는 l-value 이지만
    C:= A+B 에서 A 는 값을 나타내는 r-value 이다. 
  • 연습문제3
    다음 중 코드최적화를 하기 위한 소요 기억용량의 최적화 방법과 거리가 것은?
    답을 체크하세요
    정답 :
    소요 기억용량의 최적화를 위한 방법으로는 상수전파, 루프의 융합, 복사전파, 중복된 로드, 저장 명령문 제거, 연산의 세기 경감, 레지스터 할당 등의 방법 이외에도 부프로그램화와 부분식 끌어올리기 등의 방법이 있다. 
  • 연습문제4
    다음 중 목적코드를 생성하는 데 고려사항으로서 적합하지 않은 것은?
    답을 체크하세요
    정답 :
    목적코드를 생성하는 데는 어떤 명령어를 생산할 것이냐, 계산과정을 어떤 순서로 할 것이냐, 피연산자를 레지스터에 어떻게 배정할 것이냐 하는 세가지 사항을 고려해야 한다.
  • 연습문제5
    다음 중 목적코드 설계상 중요한 것으로 볼 수 없는 것은?
    답을 체크하세요


    정답 :
    목적코드의 설계상 중요한 것으로 산술식, 논리식 이외에 프로시저의 입구/출구의 목적 프로그램, 프로시저 호출의 목적 프로그램, 변수의 기억영역 할당과 로드(load)/저장(store)의 목적 프로그램 등이 있다. 
  • 연습문제6
    산술식에 대한 목적코드를 생성하기 위해서 우선적으로 알아야 하는 것은?
    답을 체크하세요
    정답 :
    산술식에 대한 목적코드를 생성해 내기 위해서는, 먼저 누산기(accumulator)의 개수가 얼마인지를 알아야 한다. 


댓글