책 소개개정판을 내면서 역점을 둔 사항은 실험용 컴파일러(Experimental Compiler)를 위한 언어를 미니 파스칼 언어에서 미니 C(Mini C) 언어로 변경한 것이다. 최근에 사용되고 있는 프로그래밍 언어들이 대부분 C로부터 영향을 받아 C 언어의 중요성이 더욱 부각되는 상황에서 실험용 언어(Experimental Language)를 C의 개념을 근본적으로 이해할 수 있는 미니 C 언어로 대치하였으며 그에 따른 수록된 프로그램들을 수정하였다.
이 책의 특징을 요약하면 다음과 같다. 첫째, 컴파일러의 전 과정을 체계적으로 실습할 수 있도록 골격 프로그램을 수록하였다. 둘째, 컴파일러 이론과 개념을 쉽게 이해할 수 있도록 설명했으며 특히 용어의 정의와 개념, 그리고 기호 등을 보다 일관성 있게 다루어 독자로 하여금 일관성 있는 개념이 확립될 수 있도록 노력하였다. 셋째, 많은 연습 문제를 제공하여 스스로 학습한 내용을 검증할 수 있도록 하였다. 넷째, 컴파일러 자동화 도구인 Lex와 YACC의 내용을 보강하여 실험용 컴파일러를 Lex와 YACC을 이용하여 구현할 수 있도록 하였다.
이 책에 수록된 스캐너, 파서, 문법-지시적 변환기, 중간 코드 생성기를 상호 통합함으로써 컴파일러의 전단부를 구현할 수 있으며 여기서 생성된 중간 언어인 U-코드는 부록 B에 수록된 U-코드 인터프리터를 사용하여 실행시킬 수 있다. 실제로 이 과정을 실습해 보면 이 책의 전반적인 내용을 더 잘 이해할 수 있다고 판단된다.
컴퓨터의 응용 범위가 넓어짐에 따라 수많은 프로그래밍 언어가 등장하고 이에 따라 컴파일러에 관한 지식이 더욱 요구되고 있는 실정이다. 더욱이 문서 형식을 정규 표현으로 기술하고 사용자 접속 언어를 설계하는 경우가 빈번해 짐에 따라 컴파일러에 관한 이론과 개념이 중요시되고 있으며 컴파일러에서 처리하는 핵심 기법들이 응용 프로그래밍의 중요한 방법이 되고 있다. 이 책에서 설명한 컴파일러에 관한 여러 가지 개념과 실습을 한번만 따라가 보면 활용 영역은 많이 있을 것이라고 사료된다.
|
컴파일러 입문 [개정판]
지은이 : 오세만
ISBN : 978-89-353-0467-7
금액 : 36,000원
● 발행날짜 : 2018년 3월 3일
● 페이지 : 660페이지
● 판매처 : 온라인 서점
● 강의자료 제공
책 소개
책 소개
개정판을 내면서 역점을 둔 사항은 실험용 컴파일러(Experimental Compiler)를 위한 언어를 미니 파스칼 언어에서 미니 C(Mini C) 언어로 변경한 것이다. 최근에 사용되고 있는 프로그래밍 언어들이 대부분 C로부터 영향을 받아 C 언어의 중요성이 더욱 부각되는 상황에서 실험용 언어(Experimental Language)를 C의 개념을 근본적으로 이해할 수 있는 미니 C 언어로 대치하였으며 그에 따른 수록된 프로그램들을 수정하였다.이 책의 특징을 요약하면 다음과 같다. 첫째, 컴파일러의 전 과정을 체계적으로 실습할 수 있도록 골격 프로그램을 수록하였다. 둘째, 컴파일러 이론과 개념을 쉽게 이해할 수 있도록 설명했으며 특히 용어의 정의와 개념, 그리고 기호 등을 보다 일관성 있게 다루어 독자로 하여금 일관성 있는 개념이 확립될 수 있도록 노력하였다. 셋째, 많은 연습 문제를 제공하여 스스로 학습한 내용을 검증할 수 있도록 하였다. 넷째, 컴파일러 자동화 도구인 Lex와 YACC의 내용을 보강하여 실험용 컴파일러를 Lex와 YACC을 이용하여 구현할 수 있도록 하였다.
이 책에 수록된 스캐너, 파서, 문법-지시적 변환기, 중간 코드 생성기를 상호 통합함으로써 컴파일러의 전단부를 구현할 수 있으며 여기서 생성된 중간 언어인 U-코드는 부록 B에 수록된 U-코드 인터프리터를 사용하여 실행시킬 수 있다. 실제로 이 과정을 실습해 보면 이 책의 전반적인 내용을 더 잘 이해할 수 있다고 판단된다.
컴퓨터의 응용 범위가 넓어짐에 따라 수많은 프로그래밍 언어가 등장하고 이에 따라 컴파일러에 관한 지식이 더욱 요구되고 있는 실정이다. 더욱이 문서 형식을 정규 표현으로 기술하고 사용자 접속 언어를 설계하는 경우가 빈번해 짐에 따라 컴파일러에 관한 이론과 개념이 중요시되고 있으며 컴파일러에서 처리하는 핵심 기법들이 응용 프로그래밍의 중요한 방법이 되고 있다. 이 책에서 설명한 컴파일러에 관한 여러 가지 개념과 실습을 한번만 따라가 보면 활용 영역은 많이 있을 것이라고 사료된다.
저자소개
목차
CHAPTER 01 컴파일러 개론1.1 프로그래밍 언어
1.2 번역기와 컴파일러
1.3 컴파일러의 일반적 구조
1.4 컴파일러 자동화 도구
1.4.1 어휘 분석기 생성기
1.4.2 파서 생성기
1.4.3 코드 생성의 자동화
1.4.4 컴파일러-컴파일러 시스템
연습문제
CHAPTER 02 형식 언어
2.1 언어
2.2 문법
2.3 문법의 분류
연습문제
CHAPTER 03 정규 언어
3.1 정규 문법과 정규 언어
3.2 정규 표현
3.3 유한 오토마타
3.3.1 결정적 유한 오토마타
3.3.2 비결정적 유한 오토마타
3.3.3 NFA에서 DFA로의 변환
3.3.4 DFA의 상태수 최소화
3.3.5 유한 오토마타의 닫힘 성질
3.4 정규 언어의 속성
3.4.1 정규 문법과 유한 오토마타
3.4.2 유한 오토마타와 정규 표현
3.4.3 정규 언어의 닫힘 성질
3.4.4 정규 언어에 대한 펌핑 렘마
연습문제
CHAPTER 04 어휘 분석
4.1 서론
4.2 토큰 인식
4.2.1 명칭의 인식
4.2.2 정수 상수의 인식
4.2.3 실수 상수의 인식
4.2.4 스트링 상수의 인식
4.2.5 주석의 처리
4.3 어휘 분석기의 구현
4.4 렉스
4.4.1 렉스의 입력
4.4.2 렉스의 정규 g표현
4.4.3 렉스의 액션 코드
4.4.4 스캐너의 생성 및 동작
연습문제
CHAPTER 05 Context-free 문법
5.1 서론
5.2 유도와 유도 트리
5.2.1 유도
5.2.2 유도 트리
5.2.3 모호성
5.3 문법 변환
5.3.1 필요 없는 생성 규칙 제거
5.3.2 ε-생성 규칙 제거
5.3.3 단일 생성 규칙의 제거
5.3.4 문법의 기본적인 형태
5.4 CFG 표기법
5.5 푸시다운 오토마타
5.6 Context-free 언어와 PDA 언어
연습문제
CHAPTER 06 구문 분석
6.1 구문 분석 방법
6.2 구문 분석기의 출력
6.2.1 파스
6.2.2 파스 트리
6.2.3 추상 구문 트리
6.3 Top-down 방법
6.3.1 일반적인 top-down 방법
6.3.2 Left-recursion
6.3.3 Left-factoring
6.3.4 No-backtracking의 조건
6.4 Bottom-up 방법
6.4.1 Reduce
6.4.2 Shift-reduce 구문 분석
6.4.3 트리 생성
연습문제
CHAPTER 07 LL 구문 분석
7.1 결정적 구문 분석
7.1.1 FIRST
7.1.2 FOLLOW
7.1.3 LL 조건
7.2 Recursive-descent 파서
7.3 Predictive 파서
7.4 Predictive 파싱 테이블의 구성
7.5 Strong LL(k) 문법과 LL(k) 문법
연습문제
CHAPTER 08 LR 구문 분석
8.1 LR 파서
8.2 LR(0) 아이템의 집합
8.3 SLR 파싱 테이블 구성 방법
8.4 CLR 파싱 테이블 구성 방법
8.5 LALR 파싱 테이블 구성 방법
8.6 모호한 문법
8.6.1 모호한 문법에서 구문 분석 행동의 순위
8.6.2 모호한 문법에서의 구문 분석
8.6.3 YACC에서 모호한 문법의 정의 방법
8.7 구문 분석기의 작성
연습문제
CHAPTER 09 중간 언어
9.1 소개
9.2 Polish 표기법
9.3 3-주소 코드
9.4 트리 구조 코드
9.5 가상 기계 코드
9.5.1 P-코드
9.5.2 EM-코드
9.5.3 U-코드
9.5.4 바이트코드
9.5.5 .NET IL
9.6 중간 언어의 선택
연습문제
CHAPTER 10 중간 언어의 생성
10.1 소개
10.2 문법-지시적 변환
10.2.1 문법-지시적 변환의 모델
10.2.2 의미 규칙
10.2.3 문법-지시적 변환기의 구현
10.2.4 AST의 구성
10.3 AST의 설계 및 생성
10.3.1 AST의 설계
10.3.2 AST 노드의 구조
10.3.3 AST의 생성
10.4 중간 코드 생성
10.4.1 중간 코드 생성기
10.4.2 선언문
10.4.3 식
10.4.4 문장
10.4.5 함수
10.5 U-코드 번역기
연습문제
CHAPTER 11 코드 최적화
11.1 기본 블록
11.2 지역 최적화
11.2.1 공통 부분식의 제거
11.2.2 연산 강도 경감
11.2.3 상수 폴딩과 전파
11.2.4 대수학적 간소화
11.3 루프 최적화
11.3.1 루프 불변 코드 이동
11.3.2 연산 강도 경감
11.3.3 루프 언롤링
11.3.4 루프 융합
11.3.5 영으로의 카운트
11.4 전역 최적화
11.4.1 공통 부분식의 제거
11.4.2 전역 상수 폴딩과 전파
11.4.3 도달될 수 없는 코드의 제거
11.4.4 조건문의 재구성
11.4.5 연속된 GOTO의 축약
11.5 기계 종속적 최적화
11.5.1 중복된 load의 제거
11.5.2 효율적인 명령어 선택
11.5.3 레지스터 할당
11.5.4 연산 순서
11.5.5 핍홀 최적화
연습문제
CHAPTER 12 심벌 테이블
12.1 심벌 테이블의 기능
12.2 심벌 테이블의 내용
12.3 심벌 테이블의 운영
12.4 심벌 테이블의 구성
12.4.1 비정렬된 심벌 테이블
12.4.2 정렬된 심벌 테이블
12.4.3 트리 구조 심벌 테이블
12.4.4 해시 심벌 테이블
12.5 블록 구조 언어에 대한 심벌 테이블
12.5.1 스택 심벌 테이블
12.5.2 스택 구현 트리 구조 심벌 테이블
12.5.3 스택 구현 해시 구조 심벌 테이블
연습문제
CHAPTER 13 에러 처리
13.1 에러의 종류
13.2 에러 탐지 및 보고
13.3 단계별 에러 처리
13.3.1 어휘 분석 단계 에러
13.3.2 구문 단계 에러
13.3.3 의미 에러
연습문제
CHAPTER 14 컴파일러 자동화 도구
14.1 스캐너 생성기
14.2 파서 생성기
14.2.1 YACC
14.2.2 스탠포드 파서 제작 시스템
14.2.3 위스콘신 파서 제작 시스템
14.3 코드 생성의 자동화
14.3.1 해석적 코드 생성
14.3.2 패턴 매칭 코드 생성
14.3.3 테이블을 이용한 코드 생성
14.4 컴파일러-컴파일러 시스템
14.4.1 PQCC
14.4.2 ACK
연습문제
APPENDIX A Mini C
APPENDIX B U-코드 인터프리터