180 likes | 494 Views
컴파일러 개요. 원시 프로그램. 목적 프로그램. 컴파일러. 컴파일러란 ?. 컴파일러 고급 언어를 번역하는 프로그램 원시 프로그램 좁은 의미 : 고급 언어로 작성된 프로그램 (C/C++, Pascal, Ada 등 ) 넓은 의미 : 임의의 언어로 쓰여진 프로그램 ( 특정한 문법에 따라 ) 목적 프로그램 어셈블리어 프로그램 기계어 코드 ( 실존기계 , 가상기계 ) 번역기 특정한 입력을 다른 형태로 변환시켜 주는 프로그램. HTML?. 번역기. 번역기의 종류 ( 컴파일러의 사촌들 )
E N D
원시 프로그램 목적 프로그램 컴파일러 컴파일러란? • 컴파일러 • 고급 언어를 번역하는 프로그램 • 원시 프로그램 • 좁은 의미: 고급 언어로 작성된 프로그램 (C/C++, Pascal, Ada 등) • 넓은 의미: 임의의 언어로 쓰여진 프로그램 (특정한 문법에 따라) • 목적 프로그램 • 어셈블리어 프로그램 • 기계어 코드 (실존기계, 가상기계) • 번역기 • 특정한 입력을 다른 형태로 변환시켜 주는 프로그램 HTML?
번역기 • 번역기의 종류(컴파일러의 사촌들) • 전처리기(preprocessor) • 입력: 원시 프로그램 • 출력: 확장된 원시 프로그램 • 어셈블러 • 입력: 어셈블리 원시 프로그램 • 출력: 기계어 코드 • 결합기(로더/링커, loader/linker) • 입력: 여러 뭉치의 기계어 코드 • 출력: 하나로 묶이고 재배치 정보가 확정된 기계어 코드 • 해석기(인터프리터, interpreter) • 입력: 원시 프로그램, 중간 코드 • 출력: 원시 프로그램을 실행시킨 결과 #include, #define, #ifdef의 처리 latex
프리프로세서 컴파일러 라이브러리 어셈블러 언어 처리 시스템 • 하나의 프로그램이 처리되는 과정 원시 프로그램 프리프로세서 확장된 원시 프로그램 컴파일러 어셈블리 프로그램 어셈블러 재배치 가능한 목적 프로그램 로더/링커 목적 프로그램
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
컴파일러의 개략적 구조 • 분석-통합 모델 • 분석 (Analysis) • 원시 코드를 분석 → 구성 단위들로 나눔 → 중간 코드로 표현 • 분석 단계의 이용 • 문법지향 편집기 (structure editor, syntax directed editor) • 아름 출력기 (pretty printer) • 정적 분석기 (static checker/analyzer) • 해석기 (interpreter) • 통합 (Synthesis) • 중간 코드 → 목적 프로그램 구성 분석 (Front-End) 통합 (Back-End) 중간 코드
중간코드생성 목적코드생성 코드최적화 어휘분석 구문분석 의미분석 원시코드 목적코드 컴파일러의 일반적 구조 토큰표현 파스트리 파스트리 중간코드 중간코드 심볼테이블
어휘 분석 단계 • 어휘 분석 (Lexical Analysis) • 入力된 프로그램을 문법적 단위로 자름 + 심볼 테이블 작성 • 문법적 단위: 키워드(예약어), 식별자, 리터럴, 연산자, 구분자 • 어휘 구조: 어떤 것이 어휘가 될 수 있나? ⇒ 정규 표현 • 어휘 분석기: 스캐너(scanner) • 어휘 분석기 생성기: lex, scangen 등 • 입력 예제 문장 position := initial + rate * 60 ; • 어휘 분석의 결과 id1 := id2 + id3 * num60 상수
이 름 속 성 1 position ... 2 initial ... 3 rate ... 4 심볼 테이블 • 심볼 테이블 • 프로그램에서 사용하는 식별자(ID)에 대한 정보 • 구성: 이름 + 속성(attribute) • 속성: 형(type), 영역(scope), 상대주소(offset) 등 • 초기 생성: 어휘 분석시 (이름만 있음) • 내용 추가: 구문/의미 분석시 (속성을 추가) • 사용: 컴파일러의 전 단계 • 심볼 테이블의 예 이름
:= id1 + id2 * id3 num60 구문 분석 단계 • 구문 분석 (Syntax Analysis) • 入力된 프로그램의 문법 구조를 완성 • 문법 구조: 파스 트리(Parse tree), 유도 트리(Derivation tree),구문 트리(Abstract Syntax Tree; AST) • 문법 구조: 올바른 구조란 어떤 것인가 ⇒ 문맥 무관 문법 • 구문 분석기: 파서(parser) • 구문 분석기 생성기: yacc, pgs, ecp, jack 등 • 구문 분석의 결과
++ ( if > id ) ; id 1 if ++ > ida idj 1 파싱 • if (a > 1) j++; 파서
오류 • 오류의 발생 위치 • 어휘 분석 시 • 어휘 오류: 허용되지 않는 문자의 입력 • 예: posi8ion := ini8ial; • 구문 분석 시 • 구문 오류: 문법에 맞지 않는 문장 • 예: if (a >+ b) while a < b • 실행 시 • 논리 오류: 의도한대로 계산치 않음 • 예: circum := 2 + PI * r • 의미 분석 시
:= id1 + id2 * id3 inttoreal num60 의미 분석 단계 • 의미 분석 (Semantic Analysis) • 의미상의 오류를 검사 (문법적으로는 이상이 없음) • 의미 오류의 예: 선언되지 않은 변수의 사용, 자료형의 불일치,매개변수의 갯수와 형 • 의미 분석의 결과
중간 코드 생성 • 중간 코드 • 후단부에서 사용할 코드 • 전단부에서 파스트리를 순회하면서 생성함 • 종류: 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 등
코드 최적화 • 최적화(optimization)란? • 효율적인 코드의 생성 • 크기가 작고 빠르고 기억장소 요구량이 작은 코드 • 최적화의 중요성 • 컴파일은 한번, 컴파일된 목적코드의 실행은 ∞ • 컴파일 시 많은 시간이 소요되어도 무방 • gcc의 경우, 소스 코드의 80~90%가 코드 최적화 부분 • 최적화의 단계 • 컴파일 전 최적화: 정적 분석을 이용 • 중간 코드 최적화: 기계와는 무관 • 목적 코드 최적화: 기계 종속적인 최적화
코드 최적화의 종류 (I) • 중간코드 최적화 • 지역 최적화 공통 부분식의 제거(common subexpression elimination),연산 강도 경감(strength reduction),상수 계산(constant folding),복사 전파(copy propagation),대수학적 간소화(algebraic simplification) 등 • 전역 최적화 공통 부분식의 제거,도달할 수 없는 코드(unreachable/dead code)의 제거 등 • 루프 최적화 루프 불변 코드(loop invariant)의 이동,루프 풀어 헤치기(loop unrolling),루프 붙이기(loop fusion) 등
코드 최적화의 종류 (II) • 목적 코드 최적화 • 효율적인 레지스터 할당 • 효율적인 명령어의 선택 • 메모리 접근의 최적화 • 연산순서 조정 • 핍홀(peephole) 최적화 등 • 코드 최적화의 결과 temp1 = id3 * 60.0 id1 = id2 + temp1
목적 코드 생성 • 목적 코드 • 재배치 가능한 코드를 생성 • 기계어 또는 어셈블리어 • 목적 코드 생성의 예 MOVF id3,R2 MULF #60.0,R2 MOVF id2,R1 ADDF R2,R1 MOVF R1,id1