Great Code Vol 2 (로우레벨로 생각하고 하이레벨로 코딩하기 | 2 판)

Great Code Vol 2 (로우레벨로 생각하고 하이레벨로 코딩하기 | 2 판)

$50.39
Description
오늘날의 프로그래밍 언어는 생산성과 이식성을 제공하는데, 컴파일러에 최적화되지 않은 조잡한 코드를 쉽게 작성할 수도 있다. 로우레벨로 생각하고 하이레벨 언어로 코딩하면 컴파일러로 좋은 기계어 코드를 생성해내는 소스 코드를 만들 수 있게 해준다.
저자

랜달하이드

(RandallHyde)
『TheArtofAssemblyLanguage』,『WriteGreatCode』시리즈,『Using6502AssemblyLanguage』와『P-Source』의저자며,『TheWaiteGroup’sMASM6.0Bible』의공저자다.지난40여년간원자력발전기,교통신호시스템,다양한소비자용전자제품을위한임베디드소프트웨어및하드웨어개발도구를만들었고,포모나에위치한캘리포니아폴리테크닉주립대학교(CaliforniaStatePolytechnicUniversity)와리버사이드에위치한캘리포니아대학교(UniversityofCalifornia)에서컴퓨터과학을가르쳤다.프로그래밍과소프트웨어엔지니어링에대한다양한자료를제공하는웹사이트(www.randallhyde.com)를운영한다.

목차

1장.로우레벨로생각하고고급언어로코딩하기
__1.1컴파일러품질에대한오해
__1.2어셈블리언어를배우는것이여전히좋은생각인이유
__1.3어셈블리언어를배우는것이절대적으로필요하지않은이유
__1.4로우레벨에대한고려
____1.4.1받은만큼만돌려주는컴파일러
____1.4.2컴파일러가더좋은기계어코드를생성하도록돕는방법
____1.4.3어셈블리를고려한HLL코딩방법
__1.5HLL코딩
__1.6언어중립적접근
__1.7추가팁
__1.8참고자료


2장.어셈블리언어를꼭배워야할까?
__2.1어셈블리언어학습의이점과장애물
__2.2이책이도움이되는방법
__2.3해결책:하이레벨어셈블러
__2.4고급어셈블리언어
__2.5하이레벨로생각하고로우레벨로코딩하기
__2.6어셈블리프로그래밍패러다임(로우레벨로생각하기)
__2.7참고자료


3장.HLL프로그래머를위한80X86어셈블리
__3.1배울수록도움이되는어셈블리언어
__3.280x86어셈블리문법
____3.2.1기본80x86아키텍처
____3.2.2레지스터
____3.2.380x8632비트범용레지스터
____3.2.480x86EFLAGS레지스터
__3.3리터럴상수
____3.3.1이진리터럴상수
____3.3.2십진리터럴상수
____3.3.316진리터럴상수
____3.3.4문자와문자열리터럴상수
____3.3.5실수리터럴상수
__3.4어셈블리언어에서의선언(기호)상수
____3.4.1HLA의선언상수
____3.4.2Gas의선언상수
____3.4.3MASM의선언상수
__3.580x86주소지정방식
____3.5.180x86레지스터주소지정방식
____3.5.2즉시주소지정방식
____3.5.3직접메모리주소지정방식
____3.5.4RIP관련주소지정방식
____3.5.5레지스터간접주소지정방식
____3.5.6인덱스주소지정방식
____3.5.7스케일인덱스주소지정방식
__3.6어셈블리언어에서데이터선언하기
____3.6.1HLA에서의데이터선언
____3.6.2MASM에서의데이터선언
____3.6.3Gas에서의데이터선언
__3.7어셈블리언어에서오퍼랜드크기지정
____3.7.1HLA에서의타입지정
____3.7.2MASM에서의타입지정
____3.7.3Gas에서의타입지정
__3.8참고자료


4장.컴파일러동작및코드생성
__4.1프로그래밍언어가사용하는파일유형
__4.2소스파일
____4.2.1토큰화소스파일
____4.2.2특화된소스파일
__4.3컴퓨터언어프로세서의유형
____4.3.1순수인터프리터
____4.3.2인터프리터
____4.3.3컴파일러
____4.3.4증분컴파일러
__4.4변환프로세스
____4.4.1스캐닝(어휘분석)
____4.4.2파싱(구문분석)
____4.4.3중간코드생성
____4.4.4최적화
____4.4.5컴파일러벤치마킹
____4.4.6네이티브코드생성
__4.5컴파일러출력
____4.5.1컴파일러출력으로HLL코드내보내기
____4.5.2컴파일러출력으로어셈블리언어내보내기
____4.5.3컴파일러출력으로오브젝트파일내보내기
____4.5.4컴파일러출력으로실행파일내보내기
__4.6오브젝트파일형식
____4.6.1COFF파일헤더
____4.6.2COFF옵션헤더
____4.6.3COFF섹션헤더
____4.6.4COFF섹션
____4.6.5재배치섹션
____4.6.6디버깅및심벌정보
__4.7실행파일형식
____4.7.1페이지,세그먼트,파일크기
____4.7.2내부단편화
____4.7.3왜공간최적화를하는가?
__4.8오브젝트파일의데이터및코드정렬
____4.8.1섹션정렬크기선택
____4.8.2섹션결합
____4.8.3섹션정렬값제어
____4.8.4라이브러리모듈내섹션정렬
__4.9링커가코드에미치는영향
__4.10참고자료


5장.컴파일러출력물을분석하기위한툴
__5.1배경지식
__5.2컴파일러에서어셈블리코드를출력하는법
____5.2.1GNU컴파일러의어셈블리코드결과물
____5.2.2비주얼C++의어셈블리코드결과물
____5.2.3어셈블리코드결과물예제
____5.2.4어셈블리코드결과물분석
__5.3오브젝트코드유틸리티를사용해컴파일러출력분석하기
____5.3.1마이크로소프트의dumpbinexe유틸리티
____5.3.2FSF/GNUobjdump유틸리티
__5.4역어셈블러를사용해컴파일러출력분석하기
__5.5자바바이트코드역어셈블러를사용해자바출력분석하기
__5.6IL역어셈블러를사용해마이크로소프트C#및비주얼베이직코드결과물분석하기
__5.7디버거를사용해컴파일러출력분석하기
____5.7.1IDE에내장된디버거를사용하는방법
____5.7.2독립된디버거를사용하는방법
__5.8두컴파일의출력비교
____5.8.1diff를이용한코드의전과후비교
__5.9참고자료


6장.상수와HLL
__6.1리터럴상수와프로그램효율성
__6.2바인딩시간
__6.3리터럴상수와선언상수
__6.4상수식
__6.5선언상수와읽기전용메모리객체
__6.6스위프트let문
__6.7열거형
__6.8부울상수
__6.9실수상수
__6.10문자열상수
__6.11복합데이터타입상수
__6.12상수는변하지않는다
__6.13참고자료


7장.HLL의변수
__7.1런타임메모리구성
____7.1.1코드,상수,읽기전용섹션
____7.1.2정적변수섹션
____7.1.3스토리지변수섹션
____7.1.4스택섹션
____7.1.5힙섹션과동적메모리할당
__7.2변수란?
____7.2.1속성
____7.2.2바인딩
____7.2.3정적객체
____7.2.4동적객체
____7.2.5범위
____7.2.6수명
____7.2.7변수정의
__7.3변수저장공간
____7.3.1정적바인딩과정적변수
____7.3.2의사정적바인딩과자동변수
____7.3.3동적바인딩및동적변수
__7.4공통기본데이터타입
____7.4.1정수변수
____7.4.2부동소수점/실수변수
____7.4.3문자변수
____7.4.4부울변수
__7.5변수주소와HLL
____7.5.1전역변수와정적변수의저장공간할당
____7.5.2자동변수를사용해오프셋크기줄이기
____7.5.3중간변수를위한저장공간할당
____7.5.4동적변수와포인터를위한스토리지할당
____7.5.5레코드/구조체를사용해명령어오프셋크기줄이기
____7.5.6레지스터에변수저장
__7.6메모리의변수정렬하기
____7.6.1레코드와정렬
__7.7참고자료


8장.배열자료형
__8.1배열
____8.1.1배열선언
____8.1.2메모리에서의배열표현
____8.1.3스위프트배열구현
____8.1.4배열원소에접근하기
____8.1.5패딩vs패킹
____8.1.6다차원배열
____8.1.7동적배열과정적배열
__8.2참고자료


9장.포인터자료형
__9.1포인터의정의
__9.2HLL에서의포인터구현
__9.3포인터와동적메모리할당
__9.4포인터연산과포인터산술
____9.4.1포인터에정수더하기
____9.4.2포인터에서정수빼기
____9.4.3포인터에서포인터빼기
____9.4.4포인터비교
____9.4.5포인터와논리AND/OR연산
____9.4.6포인터의다른연산
__9.5단순메모리할당자예제
__9.6가비지컬렉션
__9.7운영체제와메모리할당
__9.8힙메모리오버헤드
__9.9일반적인포인터문제
____9.9.1초기화되지않은포인터사용
____9.9.2잘못된값을포함하는포인터사용
____9.9.3포인터해제후스토리지계속사용
____9.9.4프로그램을사용한후,저장공간해제실패
____9.9.5잘못된자료형을사용해간접데이터액세스
____9.9.6포인터에대한잘못된연산수행
__9.10현대언어의포인터
__9.11관리포인터
__9.12참고자료


10장.문자열자료형
__10.1문자열형식
____10.1.10으로끝나는문자열
____10.1.2길이접두사문자열
____10.1.37비트문자열
____10.1.4HLA문자열
____10.1.5설명자기반문자열
__10.2정적,가상동적,동적문자열
____10.2.1정적문자열
____10.2.2가상동적문자열
____10.2.3동적문자열
__10.3문자열의참조카운트
__10.4델파이문자열
__10.5HLL에서문자열사용
__10.6문자열의유니코드문자데이터
____10.6.1유니코드문자집합
____10.6.2유니코드코드포인트
____10.6.3유니코드코드플레인
____10.6.4서로게이트코드포인트
____10.6.5글리프,문자,그래핌클러스터
____10.6.6유니코드일반및정규동등성
____10.6.7유니코드인코딩
____10.6.8유니코드조합문자
__10.7유니코드문자열함수및성능
__10.8참고자료


11장.레코드,유니온,클래스자료형
__11.1레코드
____11.1.1다양한언어에서의레코드선언
____11.1.2레코드인스턴스생성
____11.1.3컴파일타임에레코드데이터초기화하기
____11.1.4메모리에레코드저장
____11.1.5레코드를사용해메모리성능향상
____11.1.6동적레코드타입과데이터베이스
__11.2판별자유니온
____11.2.1다양한언어에서

출판사 서평

◈추천의글◈

“아직서점에있다면,친구에게부탁하거나돈을모아이책을구입하라.집에도착하면,
그안에담긴내용을마스터할수있도록읽고또읽어라.”
-데브시티(DevCity)

“이책은HLL로애플리케이션을작성할때개발자가애플리케이션성능에더많은주의
를기울이도록충분히도와준다.모든하이레벨애플리케이션개발자에게필수도서다.”
-「FreeSoftwareMagazine」

“HLL프로그래머로서,프로그램에서실제로무슨일이일어나고있는지알고싶다면어
셈블리언어를배워라.그보다더쉬운방법은없다.”
-데브엑스(DevX)

“좋은책이다.매우매우훌륭한책이다.솔직히글의퀄리티가엄청나다.”
-토론토루비사용자그룹(TorontoRubyUserGroup)

◈이책에서다루는내용◈

◆코드가좋은기계어코드를생성하는지컴파일러의출력물을분석해확인하는방법
◆컴파일러가생성하는기계어코드명령문의유형을이해하고,하이레벨언어로코딩할때최선의명령문을선택
◆컴파일러출력을읽기에충분한어셈블리언어
◆컴파일러가다양한상수및변수오브젝트를기계어데이터로변환하는방법

◈이책의대상독자◈

독자들이어느정도의사전지식을갖추고있다는가정을바탕으로한다.다음과같은스킬을갖고있다면,이책에서최대한도움을얻을수있다.

◆적어도하나이상의명령형(절차적)프로그래밍언어나객체지향프로그래밍언어에상당히능숙하다.(예를들면,C,C++,파스칼(Pascal),자바(Java),스위프트(Swift),베이직(BASIC),파이썬(Python),어셈블리(assembly),에이다(Ada),모듈라-2(Modula-2),포트란(FORTRAN)등)
◆간단한문제에대한설명을듣고해당문제에대한소프트웨어솔루션을설계하고구현할수있어야한다.대학에서한학기정도관련과목을수강했거나몇개월정도독학했다면,충분히준비될수있다.
◆컴퓨터구조나데이터표현에대한기본적인이해가있어야한다.16진수와이진수시스템을알아야한다.부호있는정수,문자,문자열등다양한하이레벨데이터유형이컴퓨터메모리에어떻게표현되는지이해하고있어야한다.

◈이책의구성◈

효율적인코드를작성하기위해전문어셈블리언어프로그래머가될필요는없지만,이책의컴파일러출력을이해하려면최소한이에대한기본지식은필요하다.1장과2장에서는어셈블리언어학습의여러측면을살펴보고,일반적인오해,컴파일러에대한고려사항,사용가능한리소스를다룬다.3장에서는80x86어셈블리언어에대한빠른입문가이드를제공한다.온라인부록(http://www.randallhyde.com/)은파워PC,ARM,자바바이트코드,CIL(CommonIntermediateLanguage)어셈블리언어에대한입문가이드를제공한다.
4장과5장에서는컴파일러출력을검사해HLL구문의품질을결정하는방법에대해배운다.또한디스어셈블러,오브젝트코드덤프툴,디버거,어셈블리언어코드를표시하기위한다양한HLL컴파일러옵션과기타유용한소프트웨어툴에대해설명한다.
이책의나머지부분인6~15장에서는컴파일러가다양한HLL구문과데이터유형에대한기계어코드를생성하는방법에대해설명한다.이지식들로무장하면,가장적절한데이터유형,상수,변수,제어구조를선택해효율적인애플리케이션을생성할수있다.

◈옮긴이의말◈

이책은무려40여년전에소프트웨어개발자로일을시작했던랜달하이드의『WriteGreatCode』시리즈의두번째책으로,지난40여년간소프트웨어개발산업에존재해왔던방법론,전략,실무이론,체계를집대성했다.저자는『WriteGreatCode』시리즈1,3편에서하드웨어와효과적으로소통하는방법과개발자가어떻게소프트웨어를완성하는지소개했으며,이책(2편)에서는로우레벨로생각하고하이레벨로코딩하는방법을설명한다.
저자랜달하이드의시대에각광받던개발주제는현재클라우드,인공지능,양자컴퓨팅,블록체인등과같은주제로바뀌었고,개발접근전략이나방법론또한좀더세분화되거나아예달라지기도했다.하지만더좋은소프트웨어를만들기위한열정은개발자모두의공통된마음이아닐까한다.
이책은소프트웨어개발자들이하이레벨과로우레벨사이의모든것을이해하고,프로그램개발에적극활용하고자할때읽기좋을것이다.지난수십년간존재해온개발담론을확인하며앞으로수년간개발자로서자신의경력을어떤방식으로관리할것인지계획을세우고싶을때참고할수있을것이다.이런독자들에게저자는다양한예제와코드를활용해체계적으로자세히설명한다.
지난프로젝트보다더좋은코드를좀더효율적으로만들어내기위해고민하는개발자에게도추천한다.