728x90
컴파일러구성 - [제14강] 의미분석과 중간언어
기호표 ·의미분석, 중간언어 ·중간코드 종류 ·구문지시적 변환
컴파일러 용어정리
- 의미분석
구문분석 단계로부터 얻어진 파스트리를 중심으로 의미를 부여하여 코드 생성이 가능하게 하는 일 - 기호표
식별자에 대한 자료구조 선형리스트, 트리, 해쉬표의 3가지 방법을 이용하여 구성할 수 있다. - 중간코드
중간코드를 이용하여 기계와 독립적인 최적화가 가능하고 기계코드로 바뀐 상태에서 행하는 것보다 훨씬 효율적인 최적화 수행이 가능. 후위표현, 3-주소 코드, 트리구조, 가상적인 기계코드 등 여러 종류가 있음 - 구문지시적 변환
구문분석을 하면서 중간코드를 생성하는 방법
context-free문법의 각 생성규칙들과 그와 결합하여 쓰여지는 부프로그램이나 의미수행 코드들로 구성
요점정리
- 의미분석을 통하여 구문분석 단계로부터 얻어진 파스트리를 중심으로 의미를 부여하여 중간코드 생성이 가능하게 한다. 의미분석 과정에서는 상수정의, 유형정의, 변수의 유형선언, 프로시저 선언 등이 이루어진다.
- 기호표는 의미분석 단계에서 기호표에 수집된 속성과 참조된 식별자의 사용이 타당한지를 검사하는 역할을 한다. 기호표에서 식별자와 관련될 수 있는 자료는 식별자 이름, 유형, 레벨, 오프셋, 차원수 등이며 특히 기호의 유형은 의미분석시 유형검사를 위해 중요한 요소가 된다.
- 기호표의 구성은 전체적인 컴파일 시간에 많은 영향을 끼치며, 기호표는 크게 선형리스트, 트리, 해쉬표의 3가지 방법을 이용하여 구성할 수 있다. 이 중에서 해쉬 기호표 구성방법이 가장 효율이 좋은 검색법을 갖는 것으로 알려지고 있다.
- 중간코드를 이용하면 기계와 독립적인 최적화가 가능하고, 기계코드로 바뀐 상태에서 행하는 것보다 훨씬 효율적인 최적화를 수행할 수 있다. 이러한 중간코드는 후위표현, 3-주소 코드, 트리구조, 가상적인 기계코드 등 여러 종류가 있다.
- 후위표현은 산술연산자를 괄호 사용없이 표현할 수 있는 형식으로 구문트리의 선형화된 표현방법이다. 인터프리터를 사용하는 언어의 중간언어로 적합하지만 최적화를 위해서는 부적합한 중간언어이다.
- 3-주소 코드는 상용 컴파일러에서 가장 많이 사용하는 중간언어로서 코드를 재구성하기에 편리하기 때문에 코드를 최적화하는 컴파일러에서 주로 사용된다. 이 3-주소 코드는 연산자와 피연산자를 위한 필드와 함께 레코드로 구현될 수 있는데, triple, quadruple 혹은 간접 triple의 형태로 구현된다.
- 구문지시적 변환(syntax-directed translation)은 구문분석을 하면서 중간코드를 생산하는 방법이다. 이는 context-free 문법의 각 생성규칙들과 그와 결합하여 쓰여지는 부 프로그램이나 의미수행(semantic action) 코드들로 구성된다. 구문지시적 변환의 장점은 컴파일러의 설계자가 원시언어의 구문구조에 따라 직접 중간언어 생성을 표현할 수 있다는 것이다.
연습문제
- 다음은 의미분석 과정에서 하는 일들에 대한 설명이다. 틀린 것은?
- 정답 :
- ④
- 4번은 중간코드 생성 방법 중에서 구문지시적 변환에 대한 설명이다.
- 다음은 의미분석에 대한 설명이다. 빈칸 ‘가’, ‘나’, ‘다’ 에 각각 알맞은 것을 순서대로 나열한 것은?
- 연습문제 설명
- ( 가 ) 이외의 ( 나 )의 의미분석은 ( 다 ) 를 이용하여 중간코드를 생산하는 일을 하게 된다. 여러 가지 형태의 문들을 원래 뜻과 같은 중간코드로 생산하는 것이 의미분석의 목표가 된다.
- 정답 :
- ①
- 선언문 이외의 실행문의 의미분석은 기호표를 이용하여 중간코드를 생산하는 일을 하게 된다. 여러 가지 형태의 문들을 원래 뜻과 같은 중간코드로 생산하는 것이 의미분석의 목표가 된다.
- 다음은 기호표 구성에 관한 설명이다. 틀린 것은?
- 정답 :
- ④
- 시간은 (m+n) 에 비례한다.
- 번역과정에서 중간언어를 사용함으로써 얻어지는 장점이 아닌 것은?
- 정답 :
- ④
- 목적코드로 직접 번역하는 것보다 중간코드 생성과정을 거치므로 컴파일 시간이 더 소요되고 비효율적인 코드를 생산한다.
- 다음 중 인터프리터에서 많이 사용되며 코드 이동을 할 수가 없어서 최적화에는 부적합한 중간언어는?
- 정답 :
- ①
- 후위표현은 산술연산자를 괄호 사용 없이 표현할 수 있는 형식으로서 연산자 스택을 이용하여 쉽게 연산할 수 있고 원시프로그램으로부터 변환이 비교적 쉽고 빠르게 이루어질 수 있기 때문에 인터프리터를 사용하는 언어의 중간 언어로 적합하다. 그러나 코드 이동을 할 수가 없어서 최적화에는 부적합한 중간언어이다.
- 다음은 A := -B*(C+D)를 3 주소 코드로 표현한 것이다. 이 방법의 이름은?
- 연습문제 설명
번호 op 피연산자 1 피연산자 2 결과 (0) uminus B T1 (1) + C D T2 (2) * T1 TZ T3 (3) := T3 A
- 정답 :
- ④
- quadruple 방법이다.
- 구문분석을 하면서 중간코드를 생성하는 방법은?
- 정답 :
- ②
- 구문지시적 변환(syntax-directed tanslation)은 구문분석을 하면서 중간코드를 생산하는 방법이다. 이는 context-free 문법의 각 생성규칙들과 그와 결합하여 쓰여지는 부프로그램이나 의미수행(semantic action) 코드들로 구성된다. 장점은 컴파일러의 설계자가 원시언어의 구문구조에 따라 직접 중간언어 생성을 표현할 수 있다는 것이다.
'컴퓨터과학[3-2] > 컴파일러' 카테고리의 다른 글
컴파일러 구성 - 2016 출석시험 요약 (0) | 2016.10.05 |
---|---|
컴파일러구성 - [제15강] 코드의 최적화와 코드의 생성 (0) | 2016.07.18 |
컴파일러구성 - [제13강] YACC와 LALRGen (실습과정 소개) (0) | 2016.07.18 |
컴파일러구성 - [제12강] Top-down 구문분석 (0) | 2016.07.18 |
컴파일러구성 - [제11강] LALR 구문분석 (0) | 2016.07.18 |
댓글