logo
logo
x
바코드검색
BOOKPRICE.co.kr
책, 도서 가격비교 사이트
바코드검색

인기 검색어

일간
|
주간
|
월간

실시간 검색어

검색가능 서점

도서목록 제공

Great Code

Great Code

(제2권 로우레벨을 고려한 프로그램 최적화)

랜달 하이드 (지은이), 이건호, 안병규, 박철현, 임중근, 심지웅 (옮긴이)
에이콘출판
30,000원

일반도서

검색중
서점 할인가 할인률 배송비 혜택/추가 실질최저가 구매하기
알라딘 로딩중
yes24 로딩중
교보문고 로딩중
11st 로딩중
영풍문고 로딩중
쿠팡 로딩중
쿠팡로켓 로딩중
G마켓 로딩중
notice_icon 검색 결과 내에 다른 책이 포함되어 있을 수 있습니다.

중고도서

검색중
서점 유형 등록개수 최저가 구매하기
알라딘 판매자 배송 5개 12,000원 >
로딩중

eBook

검색중
서점 정가 할인가 마일리지 실질최저가 구매하기
로딩중

책 이미지

Great Code
eBook 미리보기

책 정보

· 제목 : Great Code (제2권 로우레벨을 고려한 프로그램 최적화)
· 분류 : 국내도서 > 컴퓨터/모바일 > 컴퓨터 공학 > 소프트웨어 공학
· ISBN : 9788960770171
· 쪽수 : 632쪽
· 출판일 : 2007-07-26

책 소개

GREAT CODE 시리즈 제 2권. 고급언어로 작성된 소스 코드가 컴파일러를 거쳐 어떤 식의 기계어 코드로 바뀌는지에 대해 집중적으로 다룬다.

목차

1장 로우레벨을 고려한 프로그램 최적화 1
1.1 컴파일러 품질에 대한 오해 2
1.2 어셈블리 언어를 배워야 하는 이유 2
1.3 어셈블리 프로그래머가 될 필요는 없다 3
1.4 로우레벨에 대한 고려 3
1.4.1 받은 만큼만 돌려주는 컴파일러 4
1.4.2 컴파일러가 좋아하는 코드의 특성 4
1.4.3 어셈블리를 고려한 고급언어 코딩 방법 5
1.5 고급언어 코딩 7
1.6 이 책을 읽기 위해 필요한 사전 지식 7
1.7 언어 중립적인 접근 방법 8
1.8 최고의 코드가 가지는 특징 8
1.9 동작 환경 9
1.10 참고 자료 10

2장 어셈블리 언어를 꼭 배워야 할까? 11
2.1 어셈블리 언어는 배우기 어렵다 11
2.2 해결책: GREAT CODE 제2권 12
2.3 해결책: 고급 어셈블러 13
2.4 고급 어셈블러 HLA 14
2.5 하이레벨로 생각하고 로우레벨로 코딩하기 15
2.6 로우레벨 프로그래밍 패러다임 16
2.7 유용한 참고 문헌 19

3장 고급언어 프로그래머를 위한 80x86 어셈블리 21
3.1 배워두면 도움되는 어셈블리 언어 21
3.2 80x86 어셈블리 문법 22
3.3 기본 80x86 아키텍처 23
3.3.1 레지스터 23
3.3.2 80x86 범용 레지스터 24
3.3.3 80x86 EFLAGS 레지스터 25
3.4 리터럴 상수 26
3.4.1 이진 리터럴 상수 26
3.4.2 십진 리터럴 상수 27
3.4.3 16진 리터럴 상수 27
3.4.4 문자와 문자열 리터럴 상수 28
3.4.5 실수 리터럴 상수 29
3.5 선언(기호) 상수 30
3.5.1 HLA에서의 선언 상수 30
3.5.2 Gas에서의 선언 상수 30
3.5.3 MASM과 TASM에서의 선언 상수 31
3.6 80x86 주소 지정 방식 31
3.6.1 80x86 레지스터 주소 지정 방식 31
3.6.2 즉시 주소 지정 방식 33
3.6.3 직접 메모리 주소 지정 방식 33
3.6.4 레지스터 간접 주소 지정 방식 35
3.6.5 인덱스 주소 지정 방식 36
3.6.6 스케일 인덱스 주소 지정 방식 38
3.7 데이터 선언 40
3.7.1 HLA에서의 데이터 선언 40
3.7.2 MASM과 TASM에서의 데이터 선언 41
3.7.3 Gas에서의 데이터 선언 41
3.8 오퍼랜드 크기 지정 44
3.8.1 HLA에서의 타입 지정 44
3.8.2 MASM과 TASM에서의 타입 지정 45
3.8.3 Gas에서의 타입 지정 45
3.9 80x86 기본 명령어 셋 46
3.10 참고 자료 46

4장 고급언어 프로그래머를 위한 파워PC 어셈블리 47
4.1 배워두면 도움되는 어셈블리 언어 48
4.2 어셈블리 문법 48
4.3 기본 파워PC 아키텍처 48
4.3.1 범용 정수 레지스터 49
4.3.2 범용 실수 레지스터 49
4.3.3 유저 모드용 특수 목적 레지스터 49
4.4 리터럴 상수 52
4.4.1 이진 리터럴 상수 52
4.4.2 십진 리터럴 상수 53
4.4.3 16진 리터럴 상수 53
4.4.4 문자와 문자열 리터럴 상수 53
4.4.5 실수 리터럴 상수 53
4.5 선언(기호) 상수 54
4.6 파워PC 주소 지정 방식 54
4.6.1 파워PC 레지스터 접근 54
4.6.2 즉시 주소 지정 방식 54
4.6.3 파워PC 메모리 주소 지정 방식 55
4.7 데이터 정의 57
4.8 오퍼랜드 크기 지정 59
4.9 기본 명령어 셋 59
4.10 참고 자료 60

5장 컴파일러 동작과 코드 생성 61
5.1 프로그래밍 언어가 사용하는 파일 유형 62
5.2 프로그래밍 언어 소스 파일 62
5.2.1 토큰화 형식 소스 파일 62
5.2.2 특화된 소스 파일 포맷 63
5.3 컴퓨터 언어 처리기의 유형 63
5.3.1 순수 인터프리터 63
5.3.2 인터프리터 64
5.3.3 컴파일러 64
5.3.4 증분 컴파일러 65
5.4 번역 과정 66
5.4.1 어휘 분석과 토큰 67
5.4.2 파싱(구문 분석) 69
5.4.3 중간 코드 생성 70
5.4.4 최적화 70
5.4.5 컴파일러 옵션 비교 81
5.4.6 네이티브 코드 생성 81
5.5 컴파일러의 출력물 81
5.5.1 고급언어 코드로 된 컴파일러 출력 82
5.5.2 어셈블리 언어로 된 컴파일러 출력 83
5.5.3 오브젝트 파일로 된 컴파일러 출력 84
5.5.4 실행 파일로 된 컴파일러 출력 85
5.6 오브젝트 파일 포맷 85
5.6.1 COFF 파일 헤더 86
5.6.2 COFF 옵션 헤더 88
5.6.3 COFF 섹션 헤더 91
5.6.4 COFF 섹션 93
5.6.5 재배치 섹션 93
5.6.6 디버깅과 심벌 정보 94
5.6.7 오브젝트 파일 포맷에 대해 더 공부하려면 94
5.7 실행 파일 포맷 94
5.7.1 페이지, 세그먼트, 파일 크기 95
5.7.2 내부 단편화 97
5.7.3 공간 최적화를 하는 이유 98
5.8 오브젝트 파일 안의 데이터와 코드 정렬 99
5.8.1 섹션 정렬 크기 선택 100
5.8.2 섹션 연결 101
5.8.3 섹션 정렬 값 제어 101
5.8.4 섹션 정렬 값과 라이브러리 모듈 102
5.9 링커와 링커가 코드에 주는 영향 110
5.10 참고 자료 113

6장 컴파일러 출력물 분석 툴 115
6.1 배경 지식 116
6.2 컴파일러에서 어셈블리 코드를 출력하게 하는 법 117
6.2.1 GNU와 볼랜드 컴파일러의 어셈블리 코드 출력물 117
6.2.2 비주얼 C++의 어셈블리 코드 출력물 118
6.2.3 어셈블리 코드 출력물 예제 118
6.2.4 컴파일러의 어셈블리 코드 출력물 분석 128
6.3 컴파일러 출력물 분석을 위한 오브젝트 코드 유틸리티 129
6.3.1 마이크로소프트의 dumpbin.exe 유틸리티 129
6.3.2 FSF/GNU의 objdump.exe 도구 142
6.4 컴파일러 출력물 분석을 위한 역어셈블러 사용법 146
6.5 컴파일러 출력물 분석을 위한 디버거 사용법 149
6.5.1 통합 환경에 내장된 디버거를 사용하는 법 150
6.5.2 독립 디버거를 사용하는 법 152
6.6 컴파일러 출력물 비교 153
6.6.1 diff를 이용한 코드의 수정 전/후 비교 153
6.6.2 수작업을 통한 비교 162
6.7 참고 자료 163

7장 상수와 고급언어 165
7.1 리터럴 상수와 프로그램 효율성 166
7.2 리터럴 상수와 선언 상수 168
7.3 상수식 169
7.4 선언 상수와 읽기 전용 메모리 객체 171
7.5 열거형 172
7.6 불리언 상수 174
7.7 실수 상수 176
7.8 문자열 상수 182
7.9 복합 데이터 타입 상수 186
7.10 참고 자료 188

8장 고급언어의 변수 189
8.1 실행시 메모리 구성 189
8.1.1 코드, 상수, 읽기 전용 섹션 190
8.1.2 정적 변수 섹션 192
8.1.3 BSS 섹션 193
8.1.4 스택 섹션 195
8.1.5 힙 섹션과 동적 메모리 할당 195
8.2 변수란 무엇인가 196
8.2.1 속성 196
8.2.2 바인딩 196
8.2.3 정적 객체 197
8.2.4 동적 객체 197
8.2.5 범위 197
8.2.6 수명 198
8.2.7 그래서 변수가 뭔데? 198
8.3 변수 저장 공간 198
8.3.1 정적 바인딩과 정적 변수 199
8.3.2 유사 정적 바인딩과 자동 변수 203
8.3.3 동적 바인딩과 동적 변수 206
8.4 공통 기본 데이터 타입 210
8.4.1 정수 변수 210
8.4.2 부동 소수점/실수 변수 213
8.4.3 문자 변수 214
8.4.4 불리언 변수 215
8.5 변수 주소와 고급언어 216
8.5.1 전역 변수와 정적 변수의 저장 공간 할당 216
8.5.2 자동 변수 사용을 통한 옵셋 크기 줄이기 217
8.5.3 중간 변수를 위한 저장 공간 할당 223
8.5.4 동적 변수와 포인터를 위한 저장 공간 할당 224
8.5.5 레코드/구조체 사용을 통한 명령 옵셋 크기 줄이기 226
8.5.6 레지스터 변수 227
8.6 메모리에서 변수 정렬하기 229
8.6.1 레코드와 정렬 235
8.7 참고 자료 239

9장 배열 자료형 241
9.1 배열이란 무엇인가 242
9.1.1 배열 선언 242
9.1.2 메모리에서 배열 표현 246
9.1.3 배열 원소에 접근하기 250
9.1.4 패딩과 패킹 252
9.1.5 다차원 배열 255
9.1.6 동적 배열과 정적 배열 270
9.2 참고 자료 279

10장 문자열 자료형 281
10.1 문자열 형식 282
10.1.1 0으로 끝나는 문자열 282
10.1.2 길이로 시작하는 문자열 300
10.1.3 7비트 문자열 302
10.1.4 HLA 문자열 303
10.1.5 서술자 기반 문자열 306
10.2 정적, 유사 동적, 동적 문자열 307
10.2.1 정적 문자열 308
10.2.2 유사 동적 문자열 308
10.2.3 동적 문자열 309
10.3 문자열의 참조 카운팅 309
10.4 델파이/카이릭스 문자열 310
10.5 고급 언어에서의 문자열 사용 311
10.6 문자열의 문자 데이터 312
10.7 참고 자료 314

11장 포인터 자료형 315
11.1 포인터의 정의와 오해 316
11.2 고급언어에서의 포인터 구현 317
11.3 포인터와 동적 메모리 할당 320
11.4 포인터 동작과 포인터 연산 320
11.4.1 포인터에 정수 더하기 321
11.4.2 포인터에서 정수 빼기 323
11.4.3 포인터에서 포인터 빼기 324
11.4.4 포인터 비교 325
11.4.5 논리 AND/OR와 포인터 327
11.4.6 포인터의 다른 연산 328
11.5 단순 메모리 할당자 예제 329
11.6 가비지 콜렉션 331
11.7 운영체제와 메모리 할당 332
11.8 힙 메모리 오버헤드 333
11.9 일반적인 포인터 문제 335
11.9.1 포인터를 초기화하지 않은 채로 사용하는 것 335
11.9.2 잘못된 값이 있는 포인터를 사용하는 것 337
11.9.3 포인터를 해제한 후에 그 공간을 사용하는 것 337
11.9.4 프로그램이 공간을 전부 사용한 후에 해제하지 않는 것 338
11.9.5 잘못된 자료형으로 간접 참조하는 것 339
11.10 참고 자료 340

12장 레코드, 유니온, 클래스 자료형 341
12.1 레코드 342
12.1.1 여러 언어에서의 레코드 선언 342
12.1.2 레코드의 인스턴스 생성 344
12.1.3 컴파일시에 레코드 데이터 초기화 350
12.1.4 레코드의 메모리 저장소 355
12.1.5 메모리 효율을 높이기 위한 레코드 사용 358
12.1.6 동적 레코드 타입과 데이터베이스 359
12.2 판별자 유니온 360
12.3 여러 언어에서의 유니온 선언 361
12.3.1 C/C++의 유니온 선언 361
12.3.2 파스칼/델파이/카이릭스의 유니온 선언 361
12.3.3 HLA의 유니온 선언 362
12.4 유니온의 메모리 저장소 363
12.5 유니온의 또 다른 사용법 364
12.6 가변형 365
12.7 네임스페이스 369
12.8 클래스와 객체 371
12.8.1 클래스와 객체의 비교 371
12.8.2 C++의 간단한 클래스 선언 372
12.8.3 가상 메소드 테이블 373
12.8.4 VMT의 공유 377
12.8.5 클래스의 상속 377
12.8.6 클래스의 다형성 380
12.8.7 클래스, 객체, 성능 381
12.9 참고 자료 382

13장 산술 연산과 논리 연산 385
13.1 산술식과 컴퓨터 구조 386
13.1.1 스택 기반 컴퓨터 386
13.1.2 누산기 기반 컴퓨터 391
13.1.3 레지스터 기반 컴퓨터 393
13.1.4 산술식의 대표적인 형태 394
13.1.5 3주소 구조 394
13.1.6 2주소 구조 395
13.1.7 구조의 차이점과 코드 395
13.1.8 복잡한 수식 다루기 396
13.2 산술문 최적화 397
13.2.1 상수 접기 397
13.2.2 상수 전달 398
13.2.3 죽은 코드 제거 400
13.2.4 공통 부분식 제거 402
13.2.5 연산 대체 406
13.2.6 귀납 410
13.2.7 루프 불변식 413
13.2.8 최적화 도구와 프로그래머 416
13.3 산술식에서의 부수효과 417
13.4 부수효과 떼어내기: 시퀀스 포인트 421
13.5 부수효과로 인한 문제점 회피 425
13.6 계산 순서 강제 지정 425
13.7 단축 연산 427
13.7.1 단축 연산과 불리언 표현식 428
13.7.2 단축 연산 혹은 완전 연산 강제하기 430
13.7.3 효율성 문제 432
13.8 산술 연산의 상대 비용 436
13.9 참고 자료 437

14장 분기 제어 구조 439
14.1 제어 구조는 계산에 비해 느리다! 439
14.2 로우레벨 제어 구조에 대한 소개 440
14.3 goto문 443
14.4 break, continue, next, return문 447
14.5 if문 448
14.5.1 특정 if/else문의 효율성 향상 450
14.5.2 if문에서 완전 불리언 연산 강제하기 453
14.5.3 if문에서 단축 불리언 연산 강제하기 460
14.6 switch/case문 466
14.6.1 switch/case문의 의미 467
14.6.2 점프 테이블과 연속 비교 468
14.6.3 switch/case문의 기타 구현 방법 475
14.6.4 switch문에 대한 컴파일러의 출력물 487
14.7 참고 자료 487

15장 반복 제어 구조 489
15.1 while 루프 489
15.1.1 while 루프에서 완전 불리언 연산 강제하기 492
15.1.2 while 루프에서 단축 불리언 연산 강제하기 501
15.2 repeat..until(do..until/do..while) 루프 504
15.2.1 repeat..until 루프에서 완전 불리언 연산 강제하기 507
15.2.2 repeat..until 루프에서 단축 불리언 연산 강제하기 510
15.3 forever..endfor 루프 515
15.3.1 forever 루프에서 완전 불리언 연산 강제하기 518
15.3.2 forever 루프에서 단축 불리언 연산 강제하기 518
15.4 유한 루프(for 루프) 518
15.5 참고 자료 520

16장 함수와 프로시저 521
16.1 간단한 함수와 프로시저 호출 521
16.1.1 반환 주소 저장 525
16.1.2 오버헤드의 다른 원인 529
16.2 리프 함수와 리프 프로시저 530
16.3 매크로와 인라인 함수 534
16.4 함수나 프로시저로 인자 전달 540
16.5 활성화 레코드와 스택 547
16.5.1 활성화 레코드의 구성 550
16.5.2 지역 변수에 옵셋 할당 553
16.5.3 옵셋과 인자 555
16.5.4 지역 변수와 인자에 접근 560
16.6 인자 전달 방법 568
16.6.1 값에 의한 전달 569
16.6.2 참조에 의한 전달 569
16.7 함수의 반환 값 571
16.8 참고 자료 578

부록 A 80x86 계열 CPU와 파워PC 계열 CPU의 간단한 비교 579
A.1 RISC와 CISC의 아키텍처 차이 580
A.1.1 명령어당 수행 작업 580
A.1.2 명령어의 크기 581
A.1.3 클록 속도와 명령어당 클록 수 581
A.1.4 메모리 접근과 주소 지정 방식 582
A.1.5 레지스터 583
A.1.6 즉시(상수) 오퍼랜드 583
A.1.7 스택 584
A.2 컴파일러와 애플리케이션 바이너리 인터페이스 문제 585
A.3 양쪽 아키텍처에서 훌륭한 코드를 작성하려면 585

저자소개

랜달 하이드 (지은이)    정보 더보기
Randall Hyde는 Art of 64-Bit Assembly, ‘The Art of 64-Bit Assembly; The Art of Assembly Language’(No Starch Press 출판사) 그리고 ‘Write Great Code, 1, 2, 3권’(No Starch Press 출판사)의 저자입니다. 뿐만 아니라 6502 어셈블리 언어 및 P-소스(Datamost) 사용, Microsoft Macro Assembler 6.0 Bible(The Waite Group)의 공동 저자이기도 한 그는 지난 40년 동안 원자로, 교통 제어 시스템 및 기타 소비자 전자 장치용 기기를 개발하는 임베디드 소프트웨어 및 하드웨어 엔지니어로 일했습니다. 그는 캘리포니아 주립 폴리테크닉 대학교(Pomona)와 캘리포니아 리버사이드 대학교(Riverside)에서 컴퓨터 과학을 가르쳤으며, 그의 웹사이트는 https://www.randallhyde.com입니다.
펼치기
이건호 (옮긴이)    정보 더보기
서울대학교 컴퓨터공학과 학부와 석사를 졸업했다. 각종 경시대회 참가를 취미로 삼다 또 다른 취미인 게임을 직접 만들기로 하고 게임업계에 투신. 엔씨소프트에서 리니지2 서버 프로그래머 등으로 6년 여간 열심히 일하다가 뒤늦게 UC버클리에서 공부를 다시 시작하기 직전에 번역을 마쳤다.
펼치기
안병규 (옮긴이)    정보 더보기
서울대학교 컴퓨터공학과를 졸업하고 ㈜넥슨, ㈜제이투엠, ㈜네오위즈 등에서 게임을 개발했다. 서울과학고 재학 중에 국제정보올림피아드에서 금메달을 수상하고, 서울대학교 재학 중에는 세계대학생프로그래밍대회에 출전해 아시아 지역 예선 1위를 하기도 했다. 6년간의 게임 회사 생활을 정리하고 미국 존스홉킨스 대학 박사과정으로 자연언어처리를 공부하고 있다. 번역서로는 『GREAT CODE 제2권 로우레벨을 고려한 프로그램 최적화』가 있다.
펼치기
박철현 (옮긴이)    정보 더보기
한국과학기술원 전산학과 학부를 마치고 서울대학교 컴퓨터공학부에서 석사과정으로 네트워크를 공부하고 있다. 빠른 은퇴와 유유자적한 삶을 꿈꾸며 연구와 프로젝트에 매진하고 있다.
펼치기
임중근 (옮긴이)    정보 더보기
한국과학기술원 전산학과 학부와 석사를 졸업했다. 다수의 프로그래밍 컨테스트에 참가해 수상한 경력이 있는 슈퍼 프로그래머이다. 주 언어는 파스칼과 C++이다.
펼치기
심지웅 (옮긴이)    정보 더보기
9살 때 LOGO 언어를 시작으로 프로그래밍의 세계에 발을 들여놓은 후 국제정보올림피아드와 ACM ICPC World Final에 진출했다. 서울대학교 동기들과 함께 게임 개발사 헥스플렉스 엔터테인먼트를 창업, "더 보스"로 2003 대한민국 게임대상 최우수상을 수상했고, 현재는 미국의 University of Pennsylvania에서 컴퓨터공학 석사과정을 밟으며 인공지능 로봇 연구라는 새로운 목표에 도전 중이다.
펼치기

추천도서

이 포스팅은 쿠팡 파트너스 활동의 일환으로,
이에 따른 일정액의 수수료를 제공받습니다.
이 포스팅은 제휴마케팅이 포함된 광고로 커미션을 지급 받습니다.
도서 DB 제공 : 알라딘 서점(www.aladin.co.kr)
최근 본 책