서브메뉴

본문

컴파일러 구조와 원리 (컴파일러로 배우는 언어 처리 시스템)
컴파일러 구조와 원리 (컴파일러로 배우는 언어 처리 시스템)
저자 : 아오키 미네로우
출판사 : 한빛미디어
출판년 : 2010
ISBN : 9788979147681

책소개


컴파일러, 어셈블러, 링커, 하드웨어, 런타임 환경 등의 언어 처리 시스템의 동작원리를 해부한다. C 언어를 축소한 C♭ 언어를 통해 컴파일러 구현 원리를 이해한다. C♭ 컴파일러를 중심으로 프로그래밍 언어의 실행 환경이 어떻게 구현되어 있는지 설명한다. 컴파일러, 어셈블러, 링커, 하드웨어, 런타임 환경에 대해 이해할 수 있다.

어휘 해석, JavaCC로 파서를 작성, 구문 해석, x86 아키텍처, x86 어셈블러 프로그래밍, 함수 호출과 변수, 식과 문의 컴파일, 스택 프레임 할당, 최적화 방법, 오브젝트 파일의 생성, 링크와 라이브러리, 프로그램의 로드, 위치독립코드의 생성 등이 수록되어 있다.

목차


1 컴파일러를 만들어 보자
1.1 이 책의 개요
1.2 컴파일 과정
1.3 C♭ 컴파일러로 컴파일하기

2 C♭과 cbc
2.1 C♭ 언어의 개요
2.2 C♭ 컴파일러 cbc의 구성

1부 소스 코드 해석
3 구문 해석의 개요
3.1 구문 해석 방법
3.2 파서 제너레이터
3.3 JavaCC의 개요

4 어휘 해석
4.1 JavaCC에 의한 스캐너 작성
4.2 구조가 없는 단어의 스캔
4.3 토큰을 생성하지 않는 단어의 스캔
4.4 구조를 포함한 단어의 스캔

5 JavaCC로 파서 작성하기
5.1 EBNF로 문법 작성하기
5.2 애매한 문법과 토큰 미리 보기

6 구문 해석
6.1 정의의 해석
6.2 문장의 해석
6.3 식의 해석
6.4 항의 해석

2부 추상 구문 트리와 중간 표현
7 JavaCC의 Action과 추상 구문 트리
7.1 JavaCC의 액션
7.2 추상 구문 트리와 노드

8 추상 구문 트리 작성
8.1 식의 추상 구문 트리
8.2 문장의 추상 구문 트리
8.3 선언의 추상 구문 트리
8.4 cbc 파서의 실행

9 의미 해석(1) 참조 해결
9.1 의미 해석의 개요
9.2 변수 참조의 해결
9.3 타입 참조의 해결

10 의미 해석(2) 정적 타입 체크
10.1 타입 정의 체크
10.2 식의 타당성 체크
10.3 정적 타입 체크

11 중간 표현의 변환
11.1 cbc의 중간 표현
11.2 IRGenerator 클래스의 개요
11.3 제어 구조의 변환
11.4 부작용이 없는 식의 변환
11.5 좌변값의 변환
11.6 부작용이 있는 식의 변환

3부 어셈블리 코드의 생성
12 x86 아키텍처의 개요
12.1 컴퓨터 구조
12.2 x86계 CPU의 역사
12.3 IA-32의 개요
12.4 데이터 표현과 배치

13 x86 어셈블러 프로그래밍
13.1 GNU 어셈블러에 의한 프로그래밍
13.2 GNU 어셈블러의 문법
13.3 전송 명령
13.4 산술 연산 명령
13.5 비트 연산 명령
13.6 연산의 제어

14 함수 호출과 변수
14.1 호출 규약
14.2 Linux/x86에서의 함수 호출
14.3 Linux/x86에서 함수 호출의 상세

15 식과 문의 컴파일
15.1 컴파일 결과 확인
15.2 x86 어셈블리의 오브젝트 표현과 DSL
15.3 cbc의 x86 어셈블리 DSL
15.4 CodeGenerator 클래스의 개요
15.5 단순한 식의 컴파일
15.6 2항 연산의 컴파일
15.7 변수 참조와 대입
15.8 점프문의 컴파일

16 스택 프레임 할당
16.1 머신 스택의 실행
16.2 인수와 로컬 변수의 메모리 참조 할당
16.3 가상 스택으로 임시 변수 할당
16.4 머신 스택 액세스의 오프셋 조정
16.5 프롤로그·에필로그의 생성
16.6 alloca의 구축

17 최적화 방법
17.1 최적화의 의미
17.2 최적화의 분류
17.3 cbc에서의 최적화
17.4 더욱 강력한 최적화

4부 링크와 로드
18 오브젝트 파일의 생성
18.1 ELF 파일의 구조
18.2 ELF 파일에서의 글로벌 변수 표현
18.3 글로벌 변수의 컴파일
18.4 오브젝트 파일의 생성

19 링크와 라이브러리
19.1 링크의 개요
19.2 링크
19.3 다이내믹 링크와 스태틱 링크
19.4 라이브러리의 작성

20 프로그램의 로드
20.1 ELF 세그먼트의 로드
20.2 다이내믹 링크의 과정
20.3 동적 로드
20.4 GNU ld에 의한 링크

21 위치 독립 코드의 생성
21.1 위치 독립 코드
21.2 글로벌 변수 참조의 구축
21.2 링커 호출의 구축
21.3 프로그램 해석부터 실행까지

22 이 책을 모두 읽고 나서
22.1 서적 소개
22.2 링크·로드에 대해
22.3 다양한 언어 기능

부록
A.1 참고 문헌
A.2 온라인 도큐먼트
A.3 소스 코드
찾아보기

QuickMenu