728x90
컴파일러구성 - [제15강] 코드의 최적화와 코드의 생성
실행시간 최적화 ·기억용량 최적화 ·산술식의 코드생성 ·논리식의 코드생성
컴파일러 용어정리
- 상수전파
컴파일 시에 상수를 포함하는 연산이 계산될 수 있으면 계산을 함으로써 코드를 줄이는 방법 - 프로시저 호출의 전개
프로시저 호출의 실행에는 실인자가 전달이 필요하고, 호출된 프로시저에서는 레지스터의 교체라든가 자료영역의 확보, 복귀 때의 레지스터의 회복 등 많은 처리를 필요로 함. 어떤 경우에는 이런 처리보다 프로시저를 호출하는 곳에서 호출되는 프로시저의 본체를 전개하면 그들 처리를 생략할 수 있음 - 복사전파
치환문을 삭제하고 삭제된 치환문의 1-value 대신에 r-value를 사용하는 방법 - 제어흐름의 최적화
불필요한 jump문을 제거하는 것 - 레지스터
레지스터는 마이크로프로세서의 일부분으로서 아주 적은 데이터를 잠시 저장할 수 있는 공간이며, 하나의 명령어에서 다른 명령어 또는 운영체계가 제어권을 넘긴 다른 프로그램으로 데이터를 전달하기 위한 장소를 제공한다. - 누산기
accumulator, 누산기는 CPU 내에서 계산의 중간 결과를 저장하는 레지스터를 가리킨다. 누산기는 ALU로 직접 통하는 통로를 가지고 있기 때문에, 주기억장치에 읽고 쓰는 것보다 훨씬 빠르다. - ALU
arithmetic-logic unit: 산술논리 연산장치 : ALU는 CPU의 일부로서 컴퓨터 명령어 내에 있는 연산자들에 대해 연산과 논리동작을 담당한다. 몇몇 프로세서들에서는 ALU가 연산장치(AU)와 논리장치(LU)의 두 부분으로 나뉘어져있는 경우도 있다.
요점정리
- 코드최적화란 보다 효율적인 실행코드를 만드는 것으로서 최적화 과정은 최적화 관점에 따라 여러 가지로 분류된다. 주로 실행시간을 짧게 하기 위한 최적화와 소요기억 용량을 작게 하는 최적화로 나누는 방법을 많이 사용한다.
- 실행 시간을 짧게 하기 위한 최적화 방법으로는 공통 부분식의 제거, 상수전파, 코드이동, 루프의 융합, 루프전개, 프로시저 호출의 전개, 불필요한 코드의 제거, 복사전파, 식의 연산순서 변경, 중복된 로드∙저장 명령문 제거, 식의 대수학적 간소화, 연산의 세기 경감, 결합변경, 귀납변수 최적화 및 기타의 방법들이 있다.
- 소요 기억용량의 최적화를 위한 방법으로는 상수전파, 루프의 융합, 복사전파, 중첩된 로드, 저장 명령문 제거, 연산의 세기경감, 레지스터 할당 등의 방법 이외에도 부프로그램화와 부분식 끌어올리기 등의 방법이 있다.
- 컴파일러의 마지막단계는 코드생성이다. 목적코드 생성은 중간코드를 입력으로 받아 그 기계에 맞는 기계어로 생성할 수도 있으며, 어셈블리어로도 생성할 수 있다. 좋은 코드를 생산하려면 해당되는 기계의 하드웨어나 운영체제에 대해서 잘 알아야 한다.
- 산술식에 대한 목적코드의 생성은 레지스터에 따라 생성하는 방법이 다르다.
- 논리식은 ∧(AND),∨(OR),¬(NOT)등의 논리연산자를 사용한다. 또한 논리식의 값은 특별한 기능을 갖는데 논리식에 대한 목적코드를 생성할 때 이러한 특성을 이용하면 좀더 효율적으로 목적코드를 생성할 수 있다.
연습문제
- 다음은 최적화의 분류에 관한 설명이다. 틀린 것은?
- 정답 :
- ④
- 최적화란 실행속도를 높이고 기억장소를 절약하는 방법으로 구체적으로 보면
- 지역최적화(local)와 전역최적화(global).
- 단일문에서의 최적화와 루프(loop)에서의 최적화
- 실행속도 면에서의 최적화와 기억장소 절약면에서의 최적화
등으로 구분해 볼 수 있다.
- 최적화를 위하여 치환문을 삭제하고 삭제된 치환문의 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 이다.
- 다음 중 코드최적화를 하기 위한 소요 기억용량의 최적화 방법과 거리가 먼 것은?
- 정답 :
- ①
- 소요 기억용량의 최적화를 위한 방법으로는 상수전파, 루프의 융합, 복사전파, 중복된 로드, 저장 명령문 제거, 연산의 세기 경감, 레지스터 할당 등의 방법 이외에도 부프로그램화와 부분식 끌어올리기 등의 방법이 있다.
- 다음 중 목적코드를 생성하는 데 고려사항으로서 적합하지 않은 것은?
- 정답 :
- ③
- 목적코드를 생성하는 데는 어떤 명령어를 생산할 것이냐, 계산과정을 어떤 순서로 할 것이냐, 피연산자를 레지스터에 어떻게 배정할 것이냐 하는 세가지 사항을 고려해야 한다.
- 다음 중 목적코드 설계상 중요한 것으로 볼 수 없는 것은?
- 정답 :
- ④
- 목적코드의 설계상 중요한 것으로 산술식, 논리식 이외에 프로시저의 입구/출구의 목적 프로그램, 프로시저 호출의 목적 프로그램, 변수의 기억영역 할당과 로드(load)/저장(store)의 목적 프로그램 등이 있다.
- 산술식에 대한 목적코드를 생성하기 위해서 우선적으로 알아야 하는 것은?
- 정답 :
- ①
- 산술식에 대한 목적코드를 생성해 내기 위해서는, 먼저 누산기(accumulator)의 개수가 얼마인지를 알아야 한다.
'컴퓨터과학[3-2] > 컴파일러' 카테고리의 다른 글
컴파일러 구성 - 2016 출석시험 요약 (0) | 2016.10.05 |
---|---|
컴파일러구성 - [제14강] 의미분석과 중간언어 (0) | 2016.07.18 |
컴파일러구성 - [제13강] YACC와 LALRGen (실습과정 소개) (0) | 2016.07.18 |
컴파일러구성 - [제12강] Top-down 구문분석 (0) | 2016.07.18 |
컴파일러구성 - [제11강] LALR 구문분석 (0) | 2016.07.18 |
댓글