컴파일러 개요

18
컴컴컴컴 컴컴

Upload: delilah-perry

Post on 02-Jan-2016

105 views

Category:

Documents


10 download

DESCRIPTION

컴파일러 개요. 원시 프로그램. 목적 프로그램. 컴파일러. 컴파일러란 ?. 컴파일러 고급 언어를 번역하는 프로그램 원시 프로그램 좁은 의미 : 고급 언어로 작성된 프로그램 (C/C++, Pascal, Ada 등 ) 넓은 의미 : 임의의 언어로 쓰여진 프로그램 ( 특정한 문법에 따라 ) 목적 프로그램 어셈블리어 프로그램 기계어 코드 ( 실존기계 , 가상기계 ) 번역기 특정한 입력을 다른 형태로 변환시켜 주는 프로그램. HTML?. 번역기. 번역기의 종류 ( 컴파일러의 사촌들 ) - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 컴파일러 개요

컴파일러 개요

Page 2: 컴파일러 개요

컴파일러란 ?

• 컴파일러– 고급 언어를 번역하는 프로그램

– 원시 프로그램• 좁은 의미 : 고급 언어로 작성된 프로그램 (C/C++, Pascal, Ada 등 )• 넓은 의미 : 임의의 언어로 쓰여진 프로그램 ( 특정한 문법에 따라 )

– 목적 프로그램• 어셈블리어 프로그램• 기계어 코드 ( 실존기계 , 가상기계 )

• 번역기– 특정한 입력을 다른 형태로 변환시켜 주는 프로그램

컴파일러원시프로그램

목적프로그램

HTML?

Page 3: 컴파일러 개요

번역기• 번역기의 종류 ( 컴파일러의 사촌들 )

– 전처리기 (preprocessor)• 입력 : 원시 프로그램• 출력 : 확장된 원시 프로그램

– 어셈블러• 입력 : 어셈블리 원시 프로그램• 출력 : 기계어 코드

– 결합기 ( 로더 / 링커 , loader/linker)• 입력 : 여러 뭉치의 기계어 코드• 출력 : 하나로 묶이고 재배치 정보가 확정된 기계어 코드

– 해석기 ( 인터프리터 , interpreter)• 입력 : 원시 프로그램 , 중간 코드• 출력 : 원시 프로그램을 실행시킨 결과

#include, #define, #ifdef 의 처리

latex

Page 4: 컴파일러 개요

언어 처리 시스템• 하나의 프로그램이 처리되는 과정

컴파일러

원시 프로그램

목적 프로그램

프리프로세서

어셈블러

로더 / 링커

확장된 원시 프로그램

재배치 가능한 목적 프로그램

어셈블리 프로그램

컴파일러

프리프로세서

어셈블러

라이브러리

Page 5: 컴파일러 개요

UNIX 의 C 컴파일러• cc sample.c

cpp sample.c .i⇒cc1 sample.i .s⇒as sample.s .o⇒ld sample.o ⇒ a.out

• 옵션-E -S -c

Page 6: 컴파일러 개요

컴파일러의 개략적 구조• 분석 - 통합 모델

• 분석 (Analysis)– 원시 코드를 분석 → 구성 단위들로 나눔 → 중간 코드로 표현– 분석 단계의 이용

• 문법지향 편집기 (structure editor, syntax directed editor)• 아름 출력기 (pretty printer)• 정적 분석기 (static checker/analyzer)• 해석기 (interpreter)

• 통합 (Synthesis)– 중간 코드 → 목적 프로그램 구성

분석(Front-End)

중간 코드 통합(Back-End)

Page 7: 컴파일러 개요

컴파일러의 일반적 구조

파스트

중간코

드토큰표

현중간코

드파스트

원시코

드목적코

드구문분

석어휘분

석 의미분

석중간코드생

성 코드최적

화 목적코드생

심볼테이블

Page 8: 컴파일러 개요

어휘 분석 단계• 어휘 분석 (Lexical Analysis)

– 入力된 프로그램을 문법적 단위로 자름+ 심볼 테이블 작성

– 문법적 단위 : 키워드 ( 예약어 ), 식별자 , 리터럴 , 연산자 , 구분자– 어휘 구조 : 어떤 것이 어휘가 될 수 있나 ? ⇒ 정규 표현– 어휘 분석기 : 스캐너 (scanner)– 어휘 분석기 생성기 : lex, scangen 등

• 입력 예제 문장position := initial + rate * 60 ;

• 어휘 분석의 결과id1 := id2 + id3 * num60

상수

Page 9: 컴파일러 개요

심볼 테이블• 심볼 테이블

– 프로그램에서 사용하는 식별자 (ID) 에 대한 정보– 구성 : 이름 + 속성 (attribute)

– 속성 : 형 (type), 영역 (scope), 상대주소 (offset) 등– 초기 생성 : 어휘 분석시 ( 이름만 있음 )

– 내용 추가 : 구문 / 의미 분석시 ( 속성을 추가 )

– 사용 : 컴파일러의 전 단계

• 심볼 테이블의 예position

initial

rate

...

...

...

1

2

3

4

이 름 속 성

이름

Page 10: 컴파일러 개요

구문 분석 단계• 구문 분석 (Syntax Analysis)

– 入力된 프로그램의 문법 구조를 완성– 문법 구조 : 파스 트리 (Parse tree), 유도 트리 (Derivation tree),

구문 트리 (Abstract Syntax Tree; AST)

– 문법 구조 : 올바른 구조란 어떤 것인가 ⇒ 문맥 무관 문법– 구문 분석기 : 파서 (parser)

– 구문 분석기 생성기 : yacc, pgs, ecp, jack 등

• 구문 분석의 결과

id1

:=

+

*id2

id3 num60

Page 11: 컴파일러 개요

파싱

• if (a > 1) j++;

파서

;) ++1>idif ( id

if

++>

1ida idj

Page 12: 컴파일러 개요

오류• 오류의 발생 위치• 어휘 분석 시

– 어휘 오류 : 허용되지 않는 문자의 입력– 예 : posiion := iniial;

• 구문 분석 시– 구문 오류 : 문법에 맞지 않는 문장– 예 : if (a >+ b) while a < b

• 실행 시– 논리 오류 : 의도한대로 계산치 않음– 예 : circum := 2 + PI * r

• 의미 분석 시

Page 13: 컴파일러 개요

의미 분석 단계• 의미 분석 (Semantic Analysis)

– 의미상의 오류를 검사 ( 문법적으로는 이상이 없음 )

– 의미 오류의 예 : 선언되지 않은 변수의 사용 , 자료형의 불일치 ,

매개변수의 갯수와 형

• 의미 분석의 결과id1

:=

+

*id2

id3 inttoreal

num60

Page 14: 컴파일러 개요

중간 코드 생성• 중간 코드

– 후단부에서 사용할 코드– 전단부에서 파스트리를 순회하면서 생성함– 종류 : Polish 표기 , N- 튜플 표기 , 트리 코드 , 가상기계 코드 등– 가상기계 코드 : P- 코드 , EM- 코드 , U- 코드 등– 예 1: GNU 의 gcc 는 N- 튜플 표기법의 하나인 RTL 을 사용– 예 2: ACK(Amsterdam Compiler Kit) 에서는 EM- 코드를 사용

• 중간 코드의 생성 예temp1 = inttoreal(60)

temp2 = id3 * temp1

temp3 = id2 + temp2

id1 = temp3

postorder traversal 등

Page 15: 컴파일러 개요

코드 최적화• 최적화 (optimization) 란 ?

– 효율적인 코드의 생성– 크기가 작고 빠르고 기억장소 요구량이 작은 코드

• 최적화의 중요성– 컴파일은 한번 , 컴파일된 목적코드의 실행은 ∞– 컴파일 시 많은 시간이 소요되어도 무방– gcc 의 경우 , 소스 코드의 80~90% 가 코드 최적화 부분

• 최적화의 단계– 컴파일 전 최적화 : 정적 분석을 이용– 중간 코드 최적화 : 기계와는 무관– 목적 코드 최적화 : 기계 종속적인 최적화

Page 16: 컴파일러 개요

코드 최적화의 종류 (I)

• 중간코드 최적화– 지역 최적화

공통 부분식의 제거 (common subexpression elimination),연산 강도 경감 (strength reduction),상수 계산 (constant folding),복사 전파 (copy propagation),대수학적 간소화 (algebraic simplification) 등

– 전역 최적화공통 부분식의 제거 ,도달할 수 없는 코드 (unreachable/dead code) 의 제거 등

– 루프 최적화루프 불변 코드 (loop invariant) 의 이동 ,루프 풀어 헤치기 (loop unrolling),루프 붙이기 (loop fusion) 등

Page 17: 컴파일러 개요

코드 최적화의 종류 (II)

• 목적 코드 최적화– 효율적인 레지스터 할당– 효율적인 명령어의 선택– 메모리 접근의 최적화– 연산순서 조정– 핍홀 (peephole) 최적화 등

• 코드 최적화의 결과temp1 = id3 * 60.0

id1 = id2 + temp1

Page 18: 컴파일러 개요

목적 코드 생성• 목적 코드

– 재배치 가능한 코드를 생성– 기계어 또는 어셈블리어

• 목적 코드 생성의 예MOVF id3,R2

MULF #60.0,R2

MOVF id2,R1

ADDF R2,R1

MOVF R1,id1