출고예상일 안내
주문하신 상품이 한국에서 현지 배송을 위한 출고단계가 이루어질 것으로 예상되는 날짜입니다. 상품을 준비하는 과정에서 내부적인 사정으로 인해 출고예상일에 다소 오차가 생길 수 있습니다.
여러 상품(예약상품포함)을 함께 주문하신 경우 출고예상일이 가장 늦은 날짜에 맞춰 함께 배송됩니다.

GREAT CODE 1 [재출간판] 효율적인 코드 작성의 기초, 하드웨어의 이해
원제 : Write Great Code: Volume 1: Understanding the Machine
랜달 하이드 저 | 전동환, 최재식, 강승훈 외 역 | 에이콘 | 2019년 04월
ISBN : 9791161752471 / 460쪽 189 x 236 (㎜)
이 상품에 궁금하신점이 있으세요? 1:1상담문의

-
코리아교육그룹 교육연구소
-
칼릭스(손윤석)
-
서길원, 김운호, 허상훈, 박재상, 박경규, 김종욱, 오윤우, 유지영
-
김현철, 신은경, 이민정, 박선우, 정기민, 곽소아, 정문수
- 19,800
- 19,800
- 31,500
- 21,420
반디앤루니스 리뷰
「전자회로」, 「논리설계」, 「컴퓨터 아키텍처」, 「시스템 프로그래밍」…
대학교에서 이미 배운 과목인데 도무지 정리도 잘 안 되고, 막상 실무에서 사용하려고 하니 가물가물 생각이 잘 떠오르지 않는다면? 최고의 프로그래머가 되기 위해 반드시 알고 넘어가야 할 하드웨어와 컴퓨터 아키텍처에 대한 내용을 이 한 권에 녹여냈다. 컴퓨터 관련 전공 수업을 듣지 못했거나, 내용을 모두 잊어버렸거나, 기존 서적의 난해함에 질린 독자를 위한 필독서다.
출판사 리뷰
★ 이 책에서 다루는 내용 ★ ■ 숫자나 문자열, 고급 자료구조 등을 표기하는 방법을 익혀, 컴퓨터가 각 데이터 타입을 사용하는 데 드는 비용을 파악한다. ■ 컴퓨터가 데이터를 구성하는 방법을 익혀, 데이터를 효율적으로 처리하는 방법을 알아낸다. ■ CPU가 동작하는 방식을 익혀, 컴퓨터가 처리하는 방식대로 동작하는 프로그램 코드를 작성한다. 입출력 장치가 동작하는 방식을 이해하면, 그러한 장치에 접근하는 애플리케이션의 성능을 최대화할 수 있다. ■ 메모리 계층 구조를 최적화해 사용하는 방법을 익혀, 최대한 빠른 프로그램을 작성할 수 있다. ★ 이 책의 대상 독자 ★ 이 책을 효과적으로 이용하기 위해서 적어도 한 가지 이상의 절차적 프로그램 언어를 다룰 줄 알아야 한다. C/C++, 파스칼(Pascal), 베이직(BASIC), 어셈블리 언어처럼 많이 사용되는 언어뿐 아니라 에이다(Ada), 모듈러2(Modula-2), 포트란(FORTRAN) 같은 언어여도 괜찮다. 또 작은 문제에 대한 명세를 받아서 그 문제에 대한 소프트웨어를 설계하거나 구현할 능력이 있어야 한다. 보통 대학 강의를 한 학기 정도 수강하거나, 독학으로 몇 달만 노력하면 이 책을 공부하는 데 큰 불편함은 없을 것이다. 이 책은 특별한 프로그램 언어를 위한 책은 아니다. 이 책에서 설명하는 개념은 프로그래밍 언어의 종류와 관계없이 적용할 수 있는 것들이다. 여러분의 편의를 위해서 프로그램 예문은 몇 가지 언어(C/C++, 파스칼, 베이직, 어셈블리 등)를 번갈아 가면서 사용할 것이다. 이 책을 쓸 때 여러분이 특정 언어를 알 것이라고 가정하지 않았다. 따라서 이 책에서 예시를 제시할 때는 코드에 대한 정확한 설명을 덧붙일 것이므로, 비록 그 언어에 익숙하지 않더라도 관련 설명을 통해서 프로그램의 동작을 충분히 이해할 수 있을 것이다. 이 책은 다양한 예시에서 다음 언어와 컴파일러를 사용했다. ■ C/C++: GCC, 마이크로소프트 비주얼 C++, 볼랜드 C++ ■ 파스칼(Pascal): 볼랜드 델파이(Delphi)/카일릭스(Kylix) ■ 어셈블리: 마이크로소프트 MASM, HLA(the High Level Assembler), Gas(파워 PC용) ■ 베이직(BASIC): 마이크로소프트 비주얼 베이직 ★ 이 책의 구성 ★ 이 책에서는 프로그래머에게 직접 영향을 줄 수 있거나, 시스템 아키텍트의 의도를 이해하는 데 도움을 줄 수 있는 내용을 주로 다룬다. 컴퓨터 구조를 배우는 궁극적인 목적은 자신만의 CPU나 컴퓨터 시스템을 설계할 능력 배양이 아니라, 기존의 컴퓨터 설계를 가장 잘 활용하는 법을 아는 것이다. 그래도 컴퓨터 구조가 어떤 것인지 감이 오지 않는다면 책의 목차를 살펴보며 생각해 보자. 2장, 4장, 5장에서는 컴퓨터의 기본적인 데이터 표기법을 다룰 것이다. 예를 들어 컴퓨터가 어떠한 방법으로 부호 있는 정수와 부호 없는 정수, 문자, 문자열, 문자 집합, 실수, 분수와 같은 값들을 표현하는지 알아본다. 컴퓨터가 다양한 자료를 어떻게 표현하는지를 충분히 이해하지 못한다면, 특정 작업이 왜 그렇게도 비능률적인지 알 수 없을 것이다. 또 그 이유를 이해하지 못한다면 코드에서 데이터를 제대로 다루지 못할 가능성이 높고, 그 결과 최고의 코드와는 멀어지게 될 것이다. 3장에서는 대부분의 현대적인 컴퓨터 시스템에서 사용하는 이진법의 계산과 비트 오퍼레이션을 다룰 것이다. 대부분의 프로그램 언어가 이진법과 비트 오퍼레이션을 지원하기 때문에 이 책에서는 일반적인 프로그래밍 개론 과정에서 잘 다루지 않는 이진법과 논리 오퍼레이션을 통해 코드를 향상시키는 법에 대해서 알아볼 것이다. 최고의 코드를 작성하는 강력한 프로그래머가 되기 위해서는 널리 시용되는 이런 기법을 익숙하게 구사할 수 있어야 한다. 6장에서는 ‘메모리 계층과 접근’이라는 중요한 주제를 다룬다. 메모리 접근 문제는 현대 컴퓨터에서 시스템 성능 문제를 일으키는 주범이다. 6장은 메모리에 대한 소개를 시작으로 컴퓨터가 메모리에 접근하는 방법 메모리의 성능상 특징에 관해 상세히 설명하겠다. 또 CPU가 메모리에 있는 다양한 자료구조에 접근할 때 사용하는 메모리 지정모드(addressing mode)에 대해서도 알아볼 것이다. 요즘 프로그램 중에서도 프로그램의 세부적인 메모리 접근에 대한 고려가 부족해서 프로그램의 완성도가 떨어지는 경우가 많다. 6장에서는 여러 문제를 해결할 수 있는 기반지식을 제공할 것이다. 7장은 다시 데이터 표현으로 돌아가서 복합 데이터 타입과 메모리 객체를 다룬다. 여기서는 앞 부분의 여러 장에서 다뤘던 내용과는 다르게 포인터, 배열 레코드, 구조체, 공용체 등과 같이 하이 레벨 데이터 타입에 관해 공부하게 된다. 많은 프로그래머가 메모리, 성능상의 문제를 고려하지 않은 채 커다란 복합 데이터 구조를 사용하고 있다. 7장에서는 이런 하이 레벨 복합 데이터 타입을 로우 레벨의 관점으로 설명함으로써 프로그램에서 이 기법을 사용할 때 지불해야 할 비용이 어느 정도인지 알려준다. 결국 이 기법을 좀 더 신중하고 현명하게 사용할 수 있게 될 것이다. 8장에서는 불리언 로직(boolean logic)과 디지털 설계에 관해 다룰 것이다. 8장에서는 CPU 설계와 그 외의 컴퓨터 시스템 요소를 이해하기 위해 필요한 수학적, 논리적 배경 지식을 제공한다. 주로 하드웨어적인 소재를 다루지만, 진정한 최고의 코드를 작성할 때 사용할 수 있는 몇 가지 아이디어도 얻을 수 있다. 특히 if, while 등과 같이 일반적인 고급 언어에서 사용되는 불리언 식을 최적화하는 방법은 유용하게 사용할 수 있다. 9장 역시 8장에 이어 하드웨어적인 내용으로 CPU의 구조에 관해 다룬다. 이 책의 궁극적인 목적이 자신의 CPU를 디자인하는 법을 가르치는 것이 아님에도 불구하고, 기본적인 CPU 설계와 동작을 제대로 이해해야 최고의 코드를 작성할 수 있다. CPU가 코드를 수행하는 방식에 맞춰서 코드를 작성하면, 더 적은 시스템 자원을 사용해서 더 좋은 성능을 얻을 수 있다. 반면에 코드 작성을 CPU 동작에 맞추지 않는다면, 느리고 자원을 많이 사용하는 프로그램이 될 것이다. 10장에서는 CPU 명령어 집합구조(instruction set architecture)에 대해 알아볼 것이다. 모든 CPU에서 명령어는 CPU 동작에 가장 기본이 되는 부분이고, 프로그램 수행시간은 수행되는 명령어의 종류와 수에 직접적인 영향을 받는다. 컴퓨터 구조에서 명령어를 설계하는 방법을 이해하게 되면, 어떤 오퍼레이션이 다른 오퍼레이션보다 시간이 더 걸리는 이유를 알 수 있게 된다. 뿐만 아니라 명령어의 한계와 CPU가 명령어를 해석하는 방식을 이해하면, 형편없는 일련의 코드를 최고의 코드로 탈바꿈시킬 수도 있다. 11장에서는 메모리 이야기로 돌아와서 메모리 아키텍처와 구조에 대해 알아본다. 이 장은 빠른 코드를 작성하는 데 큰 도움이 될 것이다. 여기서는 메모리의 계층에 대해 설명하고 캐시의 성능을 극대화하는 방법, 다른 고속 메모리 구성 요소 등을 알아본다. 최고의 코드는 현대 컴퓨터 애플리케이션의 일반적인 문제인 스래싱(thrashing)을 피해야만 한다. 이 장에서 스래싱을 배우며 애플리케이션에서 낮은 성능의 메모리 접근을 피하는 방법을 알게 될 것이다. ★ 지은이의 말 ★ 이 책 한 권이면 어셈블리 프로그래밍 언어를 익혀야 하는 부담 없이도 컴퓨터 구조에 관한 내용을 공부할 수 있다. C++, VB, 파스칼, 자바 등 여러 고급 언어 프로그래머를 위해 저술됐으며, 컴퓨터 교육과정에서 흔히 다루지 않는 컴퓨터 구조의 기계적인 수준까지 자세하게 다루고 있다.
★ 지은이의 말 ★
이 책 한 권이면 어셈블리 프로그래밍 언어를 익혀야 하는 부담 없이도 컴퓨터 구조에 관한 내용을 공부할 수 있다. C++, VB, 파스칼, 자바 등 여러 고급 언어 프로그래머를 위해 저술됐으며, 컴퓨터 교육과정에서 흔히 다루지 않는 컴퓨터 구조의 기계적인 수준까지 자세하게 다루고 있다.
★ 옮긴이의 말 ★
예상컨대 이 책을 선택한 독자 여러분들은 프로그래밍을 처음 배운 이후로 지금까지 “어떻게 하면 프로그래밍을 더 잘할 수 있을까?”라는 고민을 끊임없이 해왔을 것이다. 물론 나도 마찬가지다. 계속해서 새로운 언어를 익혀야 한다는 중압감에 이 책, 저 책 구입해서 열심히 공부했던 기억이 난다. 그 당시에는 그저 또 다른 프로그래밍 언어를 익히고 새로운API에 익숙해져야 ‘진도가 나가는 것’으로 생각했었다. 하지만 여전히2% 부족한 느낌을 지울 수가 없었다. 개발자로서 내공이 늘고 있는지에 대한 확신이 서지 않았던 것이다.
어떻게 해야 좀 더 좋은 프로그램을 설계하고 구현할 수 있을까? 무엇을 더 공부해야 ‘최고의 코드’를 작성하는 ‘최고의 개발자’가 될 수 있을까?
저자는 『GREAT CODE』 시리즈에서 최고의 코드라는 다소 거창한 용어를 사용해 이에 대한 해답을 제시하고 있다. 제1권인 「하드웨어의 이해」에 나온 저자의 생각을 굳이 한마디로 요약하자면, 최고의 코드란 컴퓨터의 동작 원리를 이해하고, 이를 고려해 설계하고 구현한 프로그램이다. 비록 고급 언어를 사용하는 개발자라 하더라도 컴퓨터가 어떤 과정을 거쳐서 주어진 프로그램을 실행하고 원하는 결과를 생성하는지, 그 전체 과정과 뒤에 숨겨진 배경 이론을 이해해야 한다는 것이 저자인 랜달 하이드의 지론이다.
이쯤되면 ‘GREAT CODE’라는 다소 자극적인 제목을 보고 책을 골랐거나 쉽게 익혀 바로 이용할 수 있는 프로그래밍 기법만을 원하는 독자들은 조금 실망하거나 생각이 앞서 책 내용이 지루할 거라고 예상할지도 모르겠다. 왜냐하면 이 책은 특수한 프로그래밍 기법을 다루고 있지 않기 때문이다. 그보다는 철저히 컴퓨터의 동작 원리에 대한 이론적인 내용에 초점을 맞추고 있다. 현대 컴퓨터가 수행하는 이진 연산의 이론적 바탕이 되는 수학 원리에서부터 시작해, 수치 표기법, 문자 표기법 디지털 회로, 메모리 구조. CPU 구조, 기계어 인코딩, 입출력에 이르기까지 방대한 내용이 이 한 권에 모두 담겨 있다. 또 각 장마다 이런 이론적인 내용이 실제 프로그래밍 과정과 어떻게 연관되는지에 대해 자세히 설명하고 있다. 따라서 지겹게 느끼기는커녕 진흙 속에서 찾아낸 보석처럼 여겨질 것이다.
최고의 개발자는 동시에 최고의 문제 해결사가 돼야 한다. 주어진 제약조건 하에서 최대한의 효용을 창출해내는 프로그램을 작성하기 위해서는, 그 제약 조건에 대한 이해가 필수적이다. 이런 이해가 선행돼야 어떤 상황에서든 자신만의 알고리즘을 개발하고 최적화된 설계를 할 수 있다. 이 때 필요한 것이 컴퓨터의 동작 원리에 대한 이해다. 단순히 ‘관련된 변수들은 함께 선언하는 것이 좋다’고 기억하는 사람에 비해서 ‘왜 관련된 변수들은 함께 선언하는 것이 효율적인가’를 이해하는 사람은 자신에게 주어진 상황에 맞게 가장 최적화된 프로그램을 작성할 수 있다.
이 책은 그동안 개발자들이 신경 쓰지 않았던 분야에 대한 통찰력을 제공해줄 것이라 약속한다. 개발자에게 새로운 시야를 갖게 해줄 것이다. 이 책을 읽고 난 후에 여러분은 현재 작성하고 있는 프로그램이 어떻게 메모리에 적재되며CPU에 의해 수행되고 외부와 통신하는지를 상세히 이해하게 될 것이다. 그리고 전체 시스템의 관점에서 최적화된 최고의 프로그램을 작성할 수 있을 것이다. 독자 여러분이 최고의 코드를 작성하는 데 이 책의 내용이 도움이 되기를 진심으로 바란다.
1장. 최고의 코드를 위해 알아야 할 것
__1.1 ‘GREAT CODE’ 시리즈
__1.2 이 책의 내용
__1.3 이 책의 대상
__1.4 최고의 코드의 특징
__1.5 동작 환경
__1.6 더 많은 정보를 원한다면
2장. 수치 표기법
__2.1 수란 무엇인가?
__2.2 수 체계
__2.3 수치/문자열 변환
__2.4 내부 수치 표현법
__2.5 부호 있는 수와 부호 없는 수
__2.6 2진수의 유용한 속성
__2.7 부호 확장, 0 확장과 축소
__2.8 포화
__2.9 2진화 10진 표기법
__2.10 고정소수점 표기
__2.11 스케일 수치 포맷
__2.12 유리수 표기법
__2.13 더 많은 정보를 원한다면
3장. 2진법 연산과 비트 연산
__3.1 2진수, 16진수의 연산
__3.2 비트 논리 연산
__3.3 2진수와 비트 스트링에 대한 논리 연산
__3.4 유용한 비트 연산
__3.5 쉬프트와 로테이트
__3.6 비트 필드와 묶인 데이터
__3.7 데이터 묶기와 풀기
__3.8 더 많은 정보를 원한다면
4장. 부동소수점 표기
__4.1 부동소수점 연산 소개
__4.2 IEEE 부동소수점 포맷
__4.3 정규화
__4.4 라운딩
__4.5 특별 부동소수점 값
__4.6 부동소수점 예외
__4.7 부동소수점 연산
__4.8 더 많은 정보를 원한다면
5장. 문자 표기법
__5.1 문자 데이터
__5.2 문자열
__5.3 문자셋
__5.4 자신만의 문자셋 설계
__5.5 더 많은 정보를 원한다면
6장 메모리 구조와 접근
__6.1 기본 시스템 구성 요소
__6.2 메모리의 물리적 구조
__6.3 빅 엔디안 구조 vs. 리틀 엔디안 구조
__6.4 시스템 클럭
__6.5 CPU 메모리 접근
__6.6 더 많은 정보를 원한다면
7장. 혼합 데이터 타입과 메모리 객체
__7.1 포인터
__7.2 배열
__7.3 레코드/구조체
__7.4 유니온
__7.5 더 많은 정보를 원한다면
8장. 불리언 로직과 디지털 설계
__8.1 불리언 대수
__8.2 불리언 함수와 진리표
__8.3 함수 번호
__8.4 불리언 수식의 대수 처리
__8.5 정규형
__8.6 불리언 함수의 단순화
__8.7 결국, 불리언 로직은 컴퓨터에 어떻게 적용되는가?
__8.8 더 많은 정보를 원한다면
9장. CPU 구조
__9.1 기본적인 CPU 설계
__9.2 명령어의 해석과 수행: 랜덤 로직 vs. 마이크로코드
__9.3 단계별 명령어 수행
__9.4 더 높은 성능의 비결, 병렬성
__9.5 더 많은 정보를 원한다면
10장. 명령어 집합 구조
__10.1 명령어 집합 설계의 중요성
__10.2 명령어 설계의 기본적인 목적
__10.3 가상 프로세서 Y86
__10.4 80x86 명령어 인코딩
__10.5 명령어 집합 설계가 프로그래머에게 의미하는 것
__10.6 더 많은 정보를 원한다면
11장. 메모리 구조와 구성
__11.1 메모리 계층
__11.2 메모리 계층의 동작방식
__11.3 메모리 하위시스템에 존재하는 성능 차이
__11.4 캐쉬의 구조
__11.5 가상 메모리, 보호 장치, 페이징
__11.6 스래싱
__11.7 NUMA와 주변 장치들
__11.8 메모리 계층을 고려한 소프트웨어 작성
__11.9 실행 중 메모리의 구성 방식
__11.10 더 많은 정보를 원한다면
12장. 입력과 출력
__12.1 CPU를 외부와 연결
__12.2 포트를 시스템에 연결하는 다른 방법들
__12.3 입출력 메커니즘
__12.4 입출력 속도 계층
__12.5 시스템 버스와 각 데이터 전송률
__12.6 버퍼링
__12.7 핸드쉐이킹
__12.8 입출력 포트의 타임아웃
__12.9 인터럽트와 폴링
__12.10 보호모드 연산과 장치 드라이버
__12.11 PC 주변 장치
__12.12 표준 PC 병렬 포트
__12.13 직렬 포트
__12.14 동기 I/O 와 비동기 I/O
__12.15 I/O 형식의 의미
__12.16 메모리 맵 파일






































