GREAT CODE 세트 [하드웨어와 로우레벨 프로그래밍의 이해]
- 원서명Write Great Code: Volume 1 Understanding the Machin, Write Great Code, Volume 2: Thinking Low-Level, Writing High-Level
- 지은이랜달 하이드
- 옮긴이전동환, 이건호
- ISBN : 9788960770331
- 52,000원
- 2008년 02월 26일 펴냄
- 페이퍼백 | 1,096쪽 | 190*250mm
- 시리즈 : 프로그래밍 언어
판매처
개정판책 소개
최고 프로그래머가 되기 위한 필독서
『GREAT CODE 제1권 하드웨어의 이해』
「전자회로」, 「논리설계」, 「컴퓨터 아키텍처」, 「시스템 프로그래밍」,…
대학교에서 이미 배운 과목인데 도무지 정리도 잘 안되고, 실무에서 막상 쓰려고 하니 가물가물 생각이 떠오르지 않는다면? 최고의 프로그래머가 되기 위해 반드시 알고 넘어가야 할 하드웨어와 컴퓨터 아키텍처에 대한 내용을 이 한 권에 녹여냈다. 컴퓨터 관련 전공수업을 듣지 못했거나 내용을 모두 잊어버렸거나, 기존 서적의 난해함에 질린 독자를 위한 필독서다.
『GREAT CODE 제2권 로우레벨을 고려한 프로그램 최적화』
고급언어로 작성된 소스 코드가 컴파일러를 거쳐 어떤 식의 기계어 코드로 바뀌는지에 대해 집중적으로 다루고 있다. 우리가 흔히 사용하는 자료 구조나 상수, 변수가 실제로는 어떻게 표현되는지, 연산이나 제어 구조가 기계어로는 어떻게 구현되는지, 컴파일러는 어떤 식으로 최적화를 수행하는지 심도 있게 다룸으로써 코드상에서 나타나는 약간의 차이가 컴파일된 후의 기계어 코드에서는 얼마나 큰 차이가 되어 돌아오는지를 이해하기 쉽게 설명해준다. 컴파일러가 어떻게 동작하는지를 이해하면 아름다운 기계어 코드로 변환되는 훌륭한 소스 코드를 작성하는 것이 가능해진다.
『GREAT CODE 제1권 하드웨어의 이해』
「전자회로」, 「논리설계」, 「컴퓨터 아키텍처」, 「시스템 프로그래밍」,…
대학교에서 이미 배운 과목인데 도무지 정리도 잘 안되고, 실무에서 막상 쓰려고 하니 가물가물 생각이 떠오르지 않는다면? 최고의 프로그래머가 되기 위해 반드시 알고 넘어가야 할 하드웨어와 컴퓨터 아키텍처에 대한 내용을 이 한 권에 녹여냈다. 컴퓨터 관련 전공수업을 듣지 못했거나 내용을 모두 잊어버렸거나, 기존 서적의 난해함에 질린 독자를 위한 필독서다.
『GREAT CODE 제2권 로우레벨을 고려한 프로그램 최적화』
고급언어로 작성된 소스 코드가 컴파일러를 거쳐 어떤 식의 기계어 코드로 바뀌는지에 대해 집중적으로 다루고 있다. 우리가 흔히 사용하는 자료 구조나 상수, 변수가 실제로는 어떻게 표현되는지, 연산이나 제어 구조가 기계어로는 어떻게 구현되는지, 컴파일러는 어떤 식으로 최적화를 수행하는지 심도 있게 다룸으로써 코드상에서 나타나는 약간의 차이가 컴파일된 후의 기계어 코드에서는 얼마나 큰 차이가 되어 돌아오는지를 이해하기 쉽게 설명해준다. 컴파일러가 어떻게 동작하는지를 이해하면 아름다운 기계어 코드로 변환되는 훌륭한 소스 코드를 작성하는 것이 가능해진다.
목차
목차
- 『GREAT CODE 제1권 하드웨어의 이해』
- 1장 최고의 코드를 위해 알아야 할 것 1
- 1.1 ‘GREAT CODE’ 시리즈 1
- 1.2 이 책의 내용 2
- 1.3 이 책의 대상 5
- 1.4 최고의 코드의 특징 6
- 1.5 동작 환경 7
- 1.6 더 많은 정보를 원하면 8
- 2장 수치 표기법 9
- 2.1 수란 무엇인가? 9
- 2.2 수 체계 10
- 2.2.1 10진 위치 표기법 11
- 2.2.2 기수 12
- 2.2.3 2진법 수체계 13
- 2.2.4 16진법 수체계 15
- 2.2.5 8진법 수체계 18
- 2.3 수치/문자열 변환 19
- 2.4 내부 수치 표현법 21
- 2.4.1 비트 21
- 2.4.2 비트 스트링 22
- 2.5 부호 있는 수와 부호 없는 수 24
- 2.6 2진수의 유용한 속성 26
- 2.7 부호 확장, 0 확장과 축소 27
- 2.8 포화 31
- 2.9 2진화 10진 표기법 32
- 2.10 고정소수점 표기 33
- 2.11 스케일 수치 포맷 35
- 2.12 유리수 표기법 37
- 2.13 더 많은 정보를 원하면 38
- 3장 2진법 연산과 비트 연산 39
- 3.1 2진수, 16진수의 연산 39
- 3.1.1 2진수 덧셈 40
- 3.1.2 2진수 뺄셈 41
- 3.1.3 2진수 곱셈 42
- 3.1.4 2진수 나눗셈 44
- 3.2 비트 논리 연산 46
- 3.3 2진수와 비트 스트링에 대한 논리 연산 47
- 3.4 유용한 비트 연산 48
- 3.4.1 AND를 이용, 비트 스트링의 비트 테스트 49
- 3.4.2 AND를 이용, 여러 비트가 모두 0인지 테스트 49
- 3.4.3 비트 스트링 내부의 여러 비트 비교 50
- 3.4.4 AND를 이용, 모듈로 n 카운터 만들기 51
- 3.5 쉬프트와 로테이트 52
- 3.6 비트 필드와 묶인 데이터 55
- 3.7 데이터 묶기와 풀기 60
- 3.8 더 많은 정보를 원하면 64
- 3.1 2진수, 16진수의 연산 39
- 4장 부동소수점 표기 65
- 4.1 부동소수점 연산 소개 65
- 4.2 IEEE 부동소수점 포맷 71
- 4.2.1 단정밀도 부동소수점 포맷 71
- 4.2.2 복정밀도 부동소수 포맷 73
- 4.2.3 확정 정밀도 부동소수 포맷 73
- 4.3 정규화 74
- 4.4 라운딩 76
- 4.5 특별 부동소수점 값 77
- 4.6 부동소수점 예외 78
- 4.7 부동소수점 연산 79
- 4.7.1 부동소수점 표기 79
- 4.7.2 부동소수점 덧셈과 뺄셈 79
- 4.7.3 부동소수점 곱셈과 나눗셈 92
- 4.8 더 많은 정보를 원하면 102
- 5장 문자 표기법 103
- 5.1 문자 데이터 103
- 5.1.1 ASCII 문자셋 104
- 5.1.2 EBCDIC 문자셋 107
- 5.1.3 더블 바이트 문자셋 108
- 5.1.4 유니코드 문자셋 109
- 5.2 문자열 111
- 5.2.1 문자열 포맷 111
- 5.2.2 문자열의 유형: 정적 문자열, 유사 동적 문자열, 동적 문자열 116
- 5.2.3 문자열의 참조 횟수 118
- 5.2.4 델파이/카일릭스 문자열 119
- 5.2.5 자신만의 문자열 포맷 만들기 119
- 5.3 문자셋 120
- 5.3.1 문자셋의 멱집합 표기 120
- 5.3.2 문자셋의 문자 나열식 표기 121
- 5.4 자신만의 문자셋 설계 122
- 5.4.1 효율적인 문자셋 설계 123
- 5.4.2 숫자에 대한 문자 코드의 배치 124
- 5.4.3 알파벳 문자의 배치 124
- 5.4.4 알파벳 문자 비교하기 127
- 5.4.5 다른 문자의 배치 129
- 5.5 더 많은 정보를 원하면 132
- 5.1 문자 데이터 103
- 6장 메모리 구조와 접근 133
- 6.1 기본 시스템 구성요소 133
- 6.1.1 시스템 버스 134
- 6.1.2 주소 버스 135
- 6.1.3 제어 버스 136
- 6.2 메모리의 물리적 구조 137
- 6.2.1 8비트 데이터 버스 139
- 6.2.2 16비트 데이터 버스 140
- 6.2.3 32비트 데이터 버스 142
- 6.2.4 64비트 버스 143
- 6.2.5 80x86 프로세서가 아닌 프로세서에서의 작은 단위 메모리 접근 143
- 6.3 빅 엔디안 구조 vs. 리틀 엔디안 구조 144
- 6.4 시스템 클럭 150
- 6.4.1 메모리 접근과 시스템 클럭 151
- 6.4.2 대기 상태 152
- 6.4.3 캐쉬 메모리 154
- 6.5 CPU 메모리 접근 157
- 6.5.1 직접 지정 모드 157
- 6.5.2 간접 지정 모드 158
- 6.5.3 인덱스 지정 모드 159
- 6.5.4 스케일 인덱스 지정 모드 160
- 6.6 더 많은 정보를 원하면 160
- 6.1 기본 시스템 구성요소 133
- 7장 혼합 데이터 형과 메모리 객체 161
- 7.1 포인터 161
- 7.1.1 포인터 구현 163
- 7.1.2 포인터와 동적 메모리 할당 164
- 7.1.3 포인터 연산 164
- 7.2 배열 168
- 7.2.1 배열의 선언 169
- 7.2.2 메모리 상에서 배열의 모습 172
- 7.2.3 배열 원소에 접근하기 173
- 7.2.4 다차원 배열 174
- 7.3 레코드/구조체 181
- 7.3.1 파스칼/델파이 레코드 181
- 7.3.2 C/C++ 레코드 182
- 7.3.3 HLA 레코드 182
- 7.3.4 레코드를 위한 메모리 공간 183
- 7.4 유니온 185
- 7.4.1 C/C++ 유니온 186
- 7.4.2 파스칼/델파이/카일릭스 유니온
- 7.4.3 HLA 유니온 188
- 7.4.4 유니온을 위한 메모리 공간 188
- 7.4.5 유니온의 다른 용법 189
- 7.5 더 많은 정보를 원하면 190
- 7.1 포인터 161
- 8장 불리언 로직과 디지털 설계 191
- 8.1 불리언 대수 191
- 8.1.1 불리언 연산자 192
- 8.1.2 불리언 공리 192
- 8.1.3 불리언 연산자 우선순위 194
- 8.2 불리언 함수와 진리표 194
- 8.3 함수 번호 196
- 8.4 불리언 수식의 대수 처리 197
- 8.5 정규형 198
- 8.5.1 최소항의 합과 진리표 200
- 8.5.2 대수적으로 최소항의 합 만들기 201
- 8.5.3 최대항의 곱 정규형 202
- 8.6 불리언 함수의 단순화 204
- 8.7 결국, 이는 컴퓨터에 어떻게 적용되는가? 212
- 8.7.1 전자 회로와 불리언 함수의 관계 213
- 8.7.2 조합 회로 214
- 8.7.3 순차 로직과 클럭 로직 220
- 8.8 더 많은 정보를 원하면 224
- 8.1 불리언 대수 191
- 9장 CPU 구조 225
- 9.1 기본적인 CPU 설계 225
- 9.2 명령어의 해석과 수행: 랜덤 로직 vs. 마이크로코드 228
- 9.3 단계별 명령어수행 229
- 9.3.1 mov 명령어 230
- 9.3.2 add 명령어 231
- 9.3.3 jnz 명령어 234
- 9.3.4 loop 명령어 234
- 9.4 더 높은 성능의 비결, 병렬성 235
- 9.4.1 프리페치 큐 238
- 9.4.2 프리페치 큐의 성능 향상을 방해하는 요소들 242
- 9.4.3 파이프라이닝-여러 명령어 수행 중첩 234
- 9.4.4 명령어 캐쉬-다수의 메모리 경로 제공 247
- 9.4.5 파이프라인 해저드 249
- 9.4.6 슈퍼스칼라 오퍼레이션-명령어의 병렬적 수행 251
- 9.4.7 비순차적 수행 253
- 9.4.8 레지스터 이름 바꾸기 254
- 9.4.9 VLIW 아키텍처 255
- 9.4.10 병렬 처리 256
- 9.4.11 멀티프로세싱 257
- 9.5 더 많은 정보를 원하면 258
- 10장 명령어 집합 구조 259
- 10.1 명령어 집합 설계의 중요성 260
- 10.2 명령어 설계의 기본적인 목적 261
- 10.2.1 op코드 길이 선택 263
- 10.2.2 미래에 대한 대비 265
- 10.2.3 명령어 선택 266
- 10.2.4 명령어에 op코드 할당 266
- 10.3 가상 프로세서 Y86 267
- 10.3.1 Y86 프로세서의 제한 사항 268
- 10.3.2 Y86 명령어 268
- 10.3.3 Y86의 지정 모드 270
- 10.3.4 Y86 명령어 인코딩 272
- 10.3.5 Y86 명령어 인코딩의 예 275
- 10.3.6 Y86 명령어집합 확장 279
- 10.4 80x86 명령어 인코딩 280
- 10.4.1 명령어 오퍼런드 인코딩 282
- 10.4.2 add 명령어 인코딩-몇 가지 예제 288
- 10.4.3 상수 오퍼런드 인코딩 291
- 10.4.4 8비트, 16비트, 32비트 오퍼런드 인코딩 292
- 10.4.5 명령어의 대안, 인코딩 293
- 10.5 명령어 집합 설계가 프로그래머에게 의미하는 것 294
- 10.6 더 많은 정보를 원한다면 294
- 11장 메모리 구조와 구성 295
- 11.1 메모리 계층 295
- 11.2 메모리 계층의 동작방식 298
- 11.3 메모리 하위시스템에 존재하는 성능 차이 300
- 11.4 캐쉬의 구조
- 11.4.1 직접 사상 캐쉬 303
- 11.4.2 완전 연관 캐쉬 304
- 11.4.3 n-way 집합 연관 캐쉬 304
- 11.4.4 데이터 접근 유형에 따라 캐쉬 방식 결정 305
- 11.4.5 캐쉬 라인 교체 정책 306
- 11.4.6 메모리에 데이터 쓰기 307
- 11.4.7 캐쉬 사용과 소프트웨어 308
- 11.5 가상 메모리, 보호 장치, 페이징 309
- 11.6 스래슁 312
- 11.7 NUMA와 주변 장치들 313
- 11.8 메모리 계층을 고려한 소프트웨어 작성 314
- 11.9 실행 중 메모리의 구성 방식 316
- 11.9.1 정적/동적인 오브젝트, 결합, 수명기간 317
- 11.9.2 코드, 읽기전용, 상수 영역 318
- 11.9.3 정적 변수 영역 319
- 11.9.4 초기화되지 않은 영역 319
- 11.9.5 스택 영역 320
- 11.9.6 힙 영역과 동적인 메모리 할당 321
- 11.10 더 많은 정보를 원하면 328
- 12장 입력과 출력 329
- 12.1 CPU를 외부와 연결 329
- 12.2 포트를 시스템에 연결하는 다른 방법들 333
- 12.3 입출력 메커니즘 334
- 12.3.1 메모리맵 입출력 334
- 12.3.2 입출력과 캐쉬 335
- 12.3.3 I/O맵 입출력 335
- 12.3.4 직접 메모리 접근 336
- 12.4 입출력 속도 계층 337
- 12.5 시스템 버스와 각 데이터 전송률 338
- 12.5.1 PCI 버스의 성능 340
- 12.5.2 ISA 버스의 성능 340
- 12.5.3 AGP 버스 341
- 12.6 버퍼링 341
- 12.7 핸드쉐이킹 342
- 12.8 입출력 포트의 타임아웃 343
- 12.9 인터럽트와 폴링 345
- 12.10 보호모드 연산과 장치 드라이버 346
- 12.10.1 장치 드라이버 346
- 12.10.2 장치 드라이버 및 “파일”과 통신하기 347
- 12.11 PC 주변 장치 348
- 12.12 키보드 348
- 12.13 표준 PC 병렬 포트 349
- 12.14 직렬 포트 351
- 12.15 디스크 드라이브 352
- 12.15.1 플로피 드라이브 352
- 12.15.2 하드 드라이브 352
- 12.15.3 RAID 시스템 358
- 12.15.4 Zip 드라이브 등의 광 드라이브 359
- 12.15.5 광학 드라이브 359
- 12.15.6 CD-ROM, CD-R, CD-R/W, DVD, DVD-R, DVD-RAM,
- DVD-R/W 드라이브 360
- 12.16 테이프 드라이브 362
- 12.17 플래시 저장장치 363
- 12.18 램 디스크와 반도체 디스크 365
- 12.19 SCSI 장치와 제어기 367
- 12.20 IDE/ATA 인터페이스 372
- 12.21 대용량 저장 장치의 파일 시스템 374
- 12.21.1 자유공간 비트맵을 사용한 파일 관리 376
- 12.21.2 파일 할당 테이블 377
- 12.21.3 블록 리스트 파일 구조 381
- 12.22 대용량 장치의 데이터를 조작하는 소프트웨어 작성 386
- 12.22.1 파일 접근 속도 386
- 12.22.2 동기 I/O와 비동기 I/O 388
- 12.22.3 I/O 형식의 의미 388
- 12.22.4 메모리 맵 파일 389
- 12.23 범용 직렬 버스 390
- 12.23.1 USB 설계 390
- 12.23.2 USB 성능 392
- 12.23.3 USB 전송 형식 393
- 12.23.4 USB 장치 드라이버 395
- 12.24 마우스, 트랙패드 및 다른 포인팅 장치 396
- 12.25 조이스틱과 게임 제어기 398
- 12.26 사운드 카드 399
- 12.26.1 오디오 주변장치가 소리를 만드는 방법 400
- 12.26.2 오디오와 MIDI 파일 형식 401
- 12.26.3 오디오 장치 프로그래밍 403
- 12.27 더 많은 정보를 원하면 404
- 『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
- 8.1 실행시 메모리 구성 189
- 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
- 9.1 배열이란 무엇인가 242
- 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
- 10.1 문자열 형식 282
- 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
- 12.1 레코드 342
- 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
- 13.1 산술식과 컴퓨터 구조 386
- 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
- 15.1 while 루프 489
- 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
- 16.1 간단한 함수와 프로시저 호출 521
- 부록 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.1 RISC와 CISC의 아키텍처 차이 580
관련 블로그 글
세트 도서와 재출간판 소식
우선 책 소개를 드리기에 앞서 잠시 공지 말씀 전해드리겠습니다. 인쇄소 사정으로 인해서 오늘 출간 예정이었던 『이노베이션 게임: 고객의 숨겨진 요구를 찾아내는 12가지 전략 게임』의 출간이 2월 29일 금요일, 윤달 2월의 마지막 날로 미뤄졌습니다. 미리 구매를 하셨던 독자분들께 진심으로 죄송하다는 말씀 전합니다. 양해해주시면 감사하겠습니다. 좋은 책으로 보답하겠습니다.
여러분이 기다리시던 소식이 아닐까 싶은데요. 에이콘에서 꾸준히 사랑을 받는 두 가지 책이 세트로 묶여 선보입니다.
먼저 GREAT CODE 세트입니다.
<랜달 하이드 지음 | 전동환 이건호 외 옮김 | 52,000원 | 2008년 2월 26일 출간>
『GREAT CODE 제1권 하드웨어의 이해』
「전자회로」, 「논리설계」, 「컴퓨터 아키텍처」, 「시스템 프로그래밍」,…
대학교에서 이미 배운 과목인데 도무지 정리도 잘 안되고, 실무에서 막상 쓰려고 하니 가물가물 생각이 떠오르지 않는다면? 최고의 프로그래머가 되기 위해 반드시 알고 넘어가야 할 하드웨어와 컴퓨터 아키텍처에 대한 내용을 이 한 권에 녹여냈다. 컴퓨터 관련 전공수업을 듣지 못했거나 내용을 모두 잊어버렸거나, 기존 서적의 난해함에 질린 독자를 위한 필독서다.
『GREAT CODE 제2권 로우레벨을 고려한 프로그램 최적화』
고급언어로 작성된 소스 코드가 컴파일러를 거쳐 어떤 식의 기계어 코드로 바뀌는지에 대해 집중적으로 다루고 있다. 우리가 흔히 사용하는 자료 구조나 상수, 변수가 실제로는 어떻게 표현되는지, 연산이나 제어 구조가 기계어로는 어떻게 구현되는지, 컴파일러는 어떤 식으로 최적화를 수행하는지 심도 있게 다룸으로써 코드상에서 나타나는 약간의 차이가 컴파일된 후의 기계어 코드에서는 얼마나 큰 차이가 되어 돌아오는지를 이해하기 쉽게 설명해준다. 컴파일러가 어떻게 동작하는지를 이해하면 아름다운 기계어 코드로 변환되는 훌륭한 소스 코드를 작성하는 것이 가능해진다.
다음 책은 IDE와 RCP에서 활용하는 이클립스 플러그인 세트입니다.
<제프 맥어퍼, 에릭 클레이버그 외 지음 | 양석호 옮김 | 66,000원 | 2월 26일 출간>
이클립스 플랫폼 개발자를 위한 필독 세트라고 소개드릴 만한 책이죠.
『이클립스 실전 플러그인 개발』
이클립스를 심도 있게 이해하고 싶은 개발자,
이클립스를 확장하려는 중급 이상 개발자 모두를 위한 필독서!
상용 제품 수준의 이클립스 플러그인을 개발하는 과정을 처음부터 끝까지 상세하게 다루고 있으며, 특히 고객의 요구를 만족할 수 있도록 세련되게 다듬는 방법을 강조하고 있다. 이클립스를 처음 사용하는 독자를 위해 잘 요약된 개발도구 사용법을 제공할 뿐만 아니라, 이클립스에 익숙한 독자에게는 이클립스 플랫폼에 대한 다양한 지식이 담긴 참고서 역할을 함으로써 이클립스 기반 제품의 품질 향상을 돕는다.
『이클립스 RCP: 설계에서 구현, 배포까지, 자바 GUI 애플리케이션 개발의 모든 것』
이클립스가 제공하는 리치 클라이언트 플랫폼(RCP) 플러그인은 채팅 애플리케이션부터 기업용 소프트웨어 클라이언트까지 다양한 데스크탑 애플리케이션의 기반으로 사용할 수 있는 훌륭한 플랫폼이다. 『이클립스 RCP』에서는 이클립스 RCP 프로젝트를 이끌고 있는 두 명의 리더가 이클립스를 사용해서 빠르고 효율적으로 크로스플랫폼 데스크탑 애플리케이션을 개발하는 방법을 설명한다.
마지막으로 『플래시 MX 액션스크립트 요술램프: 코딩의 마법에 빠져볼까?』재출간판 소식입니다. 많은 분들의 사랑을 받았던 플래시 액션스크립트 책이었는데요, 잠시 절판되었다가 독자 여러분의 성원에 힘입어 조금은 날렵한 모습으로 다시 찾아뵙게 되었습니다. 이 책을 필요로 했던 독자분께 자양분을 드리는 책이 되길 바랍니다.
<샴 뱅갈 외 지음 | 김기영 옮김 | 33,000원 | 1,100쪽>
크리에이티브 커먼즈 라이센스 이 저작물은 크리에이티브 커먼즈 코리아 저작자표시 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.