로버트 나이스트롬의 인터프리터 in Java, C (내 손으로 직접 밑바닥부터 만들며 배우는 리얼 인터프리터와 컴파일러의 세계)

로버트 나이스트롬의 인터프리터 in Java, C (내 손으로 직접 밑바닥부터 만들며 배우는 리얼 인터프리터와 컴파일러의 세계)

$55.00
Description
프로그래밍 언어 디자인에 관한 최고의 책! Dragon Book보다 재미있다!
OOP와 함수형 프로그래밍을 모두 지원하는, 현대 프로그래밍 언어의 실용적 구현!
매일 사용하고 있는 프로그래밍 언어가 어떻게 설계되고 구현되는지 알고 싶은가? 프로그래밍 언어가 어떻게 작동하고, 바이트 코드로 컴파일되고, 가상 머신에서 실행되는지에 관심이 있는가? 프로그래밍 언어가 어떻게 구축되었는지 더 깊이 이해해서 더 강력하고 유능한 소프트웨어 개발자가 되고 싶은가? 그렇다면 이 책은 당신을 위한 것이다. 이 책은 모든 기능을 갖춘 효율적인 스크립팅 언어를 구현하기 위해 알아야 할 모든 것을 담고 있다.
로버트 나이스트롬은 이 책에서 자신이 디자인한 작은 동적 언어인 Lox에 대해 두 가지 인터프리터를 구축한다. 첫 번째, 제이록스(jlox)는 Java 기반 인터프리터로 스캐닝, 재귀 하강을 사용한 표현식 구문 분석, 표현식, 제어 흐름, 함수 및 클로저, 클래스 및 상속을 평가한다. 아무것도 없는 밑바닥부터 시작하여 각 장의 주제를 구현해내는 모든 코드를 작성, 수정, 추가하며 설명한다.
두 번째, 씨록스(clox)는 C 기반으로 추상 구문 트리를 따라가는 느린 인터프리터 대신 스택 기반 가상 머신을 개발하며 관련 이론과 실제로 고려해야 할 사항을 다룬다. 위 두 가지를 구현하면서 비슷한 주제에 다르게 접근한다. 예를 들어 제이록스에서는 Java의 HashMap을 사용하여 식별자를 관리하고 Java의 가비지 수집에 의존했다면, 씨록스에서는 해시 테이블과 가비지 수집기를 직접 구현한다. 새로운 프로그래밍 언어를 구축하는 쉽지 않은 길을 위해, 책 전반에 걸쳐 복잡한 주제를 쉽게 이해할 수 있도록 세심하게 설명하고, 코드 역시 명확하고 따라하기 쉽게 넣고자 했다.
저자

로버트나이스트롬

(RobertNystrom)
20년간전문프로그래머로활동해왔으며,그중절반정도는게임분야에서일했다.일렉트로닉아츠(ElectronicArts)에서대작'매든(Madden)'부터'헨리하츠워스(HenryHatsworth)의괴상한모험'같은소규모타이틀까지다양한게임을개발했고,이시절『게임프로그래밍패턴』(한빛미디어,2016)을집필했다.개인블로그를방문하면재치와기지가넘치는흥미로운그의글을접할수있다.

-지은이블로그:https://journal.stuffwithstuff.com
-이책의블로그:https://craftinginterpreters.com

목차

1부|환영한다!

1장들어가기
__1.1왜이런걸배우는가?
____1.1.1미니언어는곳곳에있다
____1.1.2언어는훌륭한연습이다
____1.1.3한가지더
__1.2이책의구성
____1.2.1코드
____1.2.2스니펫
____1.2.3어사이드
____1.2.4연습문제
____1.2.5디자인노트
__1.3첫번째인터프리터
__1.4두번째인터프리터
연습문제
디자인노트|언어이름짓기

2장인터프리터원정대
__2.1언어의구성요소
____2.1.1스캐닝
____2.1.2파싱
____2.1.3정적분석
____2.1.4중간표현
____2.1.5최적화
____2.1.6코드생성
____2.1.7가상머신
____2.1.8런타임
__2.2지름길과대체경로
____2.2.1싱글패스컴파일러
____2.2.2트리탐색인터프리터
____2.2.3트랜스파일러
____2.2.4JIT컴파일
__2.3컴파일러와인터프리터
__2.4여행을떠나자!
연습문제

3장록스언어
__3.1안녕,록스
__3.2하이레벨언어
____3.2.1동적타이핑
____3.2.2자동메모리관리
__3.3데이터타입
__3.4표현식
____3.4.1산술
____3.4.2비교와동등성
____3.4.3논리연산자
____3.4.4우선순위와그룹핑
__3.5문장
__3.6변수
__3.7제어흐름
__3.8함수
____3.8.1클로저
__3.9클래스
____3.9.1객체지향언어를추구해야할이유가있을까?
____3.9.2록스는왜객체지향언어로만들었나?
____3.9.3클래스냐프로토타입이냐
____3.9.4록스의클래스
____3.9.5인스턴스화및초기화
____3.9.6상속
__3.10표준라이브러리
연습문제
디자인노트|표현식과문장

2부|트리탐색인터프리터

4장스캐닝
__4.1인터프리터프레임워크
____4.1.1에러처리
__4.2렉심과토큰
____4.2.1토큰타입
____4.2.2리터럴값
____4.2.3위치정보
__4.3정규언어와표현식
__4.4스캐너클래스
__4.5렉심식별하기
____4.5.1렉시컬에러090
____4.5.2연산자091
__4.6길이가긴렉심
____4.6.1문자열리터럴
____4.6.2숫자리터럴
__4.7예약어와식별자
연습문제
디자인노트|암묵적세미콜론

5장코드표현
__5.1컨텍스트자유문법
____5.1.1문법규칙
____5.1.2표기법개선
____5.1.3록스표현식문법
__5.2구문트리구현
____5.2.1무지향성객체
____5.2.2트리메타프로그래밍
__5.3트리다루기
____5.3.1표현식문제
____5.3.2비지터패턴
____5.3.3표현식에비지터를적용
__5.4(적당히)예쁜출력기
연습문제

6장표현식파싱
__6.1모호함과파싱게임
__6.2재귀하향파싱
____6.2.1파서클래스
__6.3구문에러
____6.3.1패닉모드에러복구
____6.3.2패닉모드진입
____6.3.3재귀하향파서동기화
__6.4파서연결
연습문제
디자인노트|로직vs역사

7장표현식평가
__7.1값을표현하기
__7.2표현식평가
____7.2.1리터럴평가
____7.2.2괄호평가
____7.2.3단항식평가
____7.2.4참과거짓
____7.2.5이항연산자평가
__7.3런타임에러
____7.3.1런타임에러감지
__7.4인터프리터연결
____7.4.1런타임에러리포팅
____7.4.2인터프리터실행
연습문제
디자인노트|정적타이핑과동적타이핑

8장문장과상태
__8.1문장
____8.1.1문장구문트리
____8.1.2문장파싱
____8.1.3문장실행
__8.2글로벌변수
____8.2.1변수구문
____8.2.2변수파싱
__8.3환경
____8.3.1글로벌변수의인터프리팅
__8.4할당
____8.4.1할당구문
____8.4.2할당시맨틱
__8.5스코프
____8.5.1중첩과섀도잉
____8.5.2블록구문과시맨틱
연습문제
디자인노트|암묵적변수선언

9장제어흐름
__9.1튜링기계(개요)
__9.2조건부실행
__9.3논리연산자
__9.4while루프
__9.5for루프
____9.5.1디슈가링
연습문제
디자인노트|구문슈가범벅

10장함수
__10.1함수호출
____10.1.1최대인수개수
____10.1.2함수호출인터프리팅
____10.1.3호출타입에러
____10.1.4애리티체크
__10.2네이티브함수
____10.2.1시간측정
__10.3함수선언
__10.4함수객체
____10.4.1함수선언인터프리팅
__10.5리턴문
____10.5.1호출에서리턴
__10.6로컬함수와클로저
연습문제

11장리졸빙과바인딩
__11.1정적스코프
____11.1.1스코프와가변환경
____11.1.2영속적환경
__11.2시맨틱분석
____11.2.1변수레졸루션패스
__11.3리졸버클래스
____11.3.1블록리졸빙
____11.3.2변수선언리졸빙
____11.3.3변수식리졸빙
____11.3.4할당식리졸빙
____11.3.5함수선언리졸빙
____11.3.6기타구문트리노드의리졸빙
__11.4리졸브된변수의인터프리팅
____11.4.1리졸브된변수액세스
____11.4.2리졸브된변수할당
____11.4.3리졸버실행
__11.5레졸루션에러
____11.5.1잘못된리턴에러
연습문제

12장클래스
__12.1OOP와클래스
__12.2클래스선언
__12.3인스턴스생성
__12.4인스턴스프로퍼티
____12.4.1겟표현식
____12.4.2셋표현식
__12.5클래스메서드
__12.6this
____12.6.1잘못된this용례
__12.7생성자와초기자
____12.7.1init()직접호출
____12.7.2init()에서리턴
연습문제
디자인노트|프로토타입과파워

13장상속
__13.1수퍼클래스와서브클래스
__13.2메서드상속
__13.3수퍼클래스메서드호출
____13.3.1구문
____13.3.2시맨틱
____13.3.3잘못된super용례
__13.4마무리
연습문제

3부|바이트코드가상머신

14장바이트코드청크
__14.1바이트코드란?
____14.1.1AST탐색의문제점은?
____14.1.2그냥네이티브코드로컴파일하면?
____14.1.3바이트코드란?
__14.2시작하기
__14.3명령어청크
____14.3.1동적명령어배열
__14.4청크디셈블링
__14.5상수
____14.5.1값표현
____14.5.2값배열
____14.5.3상수명령어
__14.6줄정보
____14.6.1줄정보디셈블링
연습문제
디자인노트|개발중인언어를테스트

15장가상머신
__15.1명령어실행머신
____15.1.1명령어실행
____15.1.2실행추적
__15.2값스택조작기
____15.2.1VM의스택
____15.2.2스택트레이스
__15.3산술계산기
____15.3.1이항연산자
연습문제
디자인노트|레지스터기반의바이트코드

16장온디맨드스캐닝
__16.1인터프리터시동걸기
____16.1.1컴파일파이프라인열기
____16.1.2스캐너의스캐닝
__16.2한번에토큰하나씩
____16.2.1토큰스캐닝
__16.3록스의렉시컬문법
____16.3.1공백문자
____16.3.2주석
____16.3.3리터럴토큰
__16.4식별자와키워드
____16.4.1트라이와상태기계
연습문제

17장표현식컴파일
__17.1싱글패스컴파일
__17.2토큰파싱
____17.2.1구문에러처리
__17.3바이트코드내보내기
__17.4전위식파싱
____17.4.1토큰파서
____17.4.2괄호로그룹핑
____17.4.3단항음수화
__17.5중위식파싱
__17.6프랫파서
____17.6.1우선순위에따라파싱
__17.7청크덤프
연습문제
디자인노트|파싱은파싱일뿐

18장값타입
__18.1태그있는공용체
__18.2록스의값과C의값
__18.3동적타입숫자
____18.3.1단항부정과런타임에러
____18.3.2이항산술연산자
__18.4두가지새로운타입
____18.4.1논리not과거짓
____18.4.2동등/비교연산자
연습문제

19장문자열
__19.1값과객체
__19.2구조체상속
__19.3문자열
__19.4문자열연산
____19.4.1문자열연결
__19.5객체해제
연습문제
디자인노트|문자열인코딩

20장해시테이블
__20.1버킷배열
____20.1.1로드팩터및래핑된키
__20.2충돌해결
____20.2.1개별체이닝
____20.2.2오픈어드레싱
__20.3해시함수
__20.4해시테이블
____20.4.1문자열해싱
____20.4.2엔트리삽입
____20.4.3할당및크기조정
____20.4.4값조회
____20.4.5엔트리삭제
____2

출판사 서평

온전한인터프리터를통째로구현하라!
더강력하고유능한프로그래머로거듭날것이다.

첫번째인터프리터:제이록스
제이록스(jlox)는자바로개발한다.프로그래밍언어의근본적인개념과작동원리를정확하게이해하고올바르게구현하기위해가능한한가장단순하고깔끔한언어구현체를작성한다.처음에는큰그림을그려보고흥미진진한주제를하나씩섭렵하면서프로그래밍언어가내부적으로어떻게움직이는지명확하게이해할수있다.

두번째인터프리터:씨록스
씨록스(clox)는C언어로,자바가공짜로제공한모든것을스스로구현한다.전체표현식타입별우선순위테이블과제어흐름문장을준비하고변수,함수,클로저,클래스,필드,메서드,상속까지빠짐없이구현한다.동적배열과해시테이블도알아서해결하고객체를어떻게메모리에나타낼지도결정한다.즉,싱글패스바이트코드컴파일러,내부명령어집합을처리하는가상머신인터프리터,컴팩트한객체표현,힙할당없이변수를저장하는스택,정교한가비지수집기까지완비한다.자바인터프리터(제이록스)가정확성에초점을두었다면,C인터프리터(씨록스)는빠른실행,성능최적화,유용한기능이목표다.

누구나프로그래밍언어를만들수있다.내가원하는대로!
어떤기분이냐하면,졸업할때까지똑같은교복만입다가어느날원하는옷을입고다닐수있는학교에진학한기분이다.블록에꼭{}를써야할필요가있나?할당에=말고다른기호를쓸수없을까?클래스없이객체만사용하면안될까?다중상속과멀티메서드는?정적오버로드되는동적인언어는어떨까?프로그래밍언어의작동원리를진지하게살펴보면서프로그래밍자체에대한이해도한층더깊어진다.마치자동차를운전만하던사람이후드를열고엔진을수리할수있게되는셈이다.정말재미난경험이다!그리고실제로유용하다!

[지은이서문]
여러분은지금멀고험난한대장정의시작점에있다.이책은한장한장흥미진진한언어의세계로안내할것이다.이책에서는프로그래밍언어의인터프리터를직접구현한다.또구현할가치가있는언어를디자인하는방법을차근차근설명한다.지금부터완전한기능을갖춘언어를두개의완전한인터프리터로구현하는과정을하나씩살펴보겠다.여러분이언어의내면을들여다보는것은처음이라보고,실행가능하면서도성능이빠른,완전한언어구현체를만들기위해필요한개념과코드를단계별로설명할것이다.
개인적으로직접실행해보면서배우는게최고라고생각한다.추상적개념으로가득한단락의파도를넘고넘어내것으로만들기는어렵지만,직접코드를짜서실행하고디버깅을해보면비로소내산지식이된다.나는여러분이이책을다읽고나서실제언어가어떻게살아숨쉬는지확실히깨닫고,나중에다른더이론적인책을읽더라도이책에서실습을통해이해한기반을바탕으로개념을마음속에단단히새겼으면좋겠다.
언어를구현하는일은진정한프로그래밍스킬의시험대다.코드는복잡하고성능은중요하다.재귀,동적배열,트리,그래프,해시테이블의달인이되어야한다.늘프로그래밍을하면서해시테이블을사용해왔어도정말해시테이블을완전하게이해하고있는사람은드물다.장담컨대,처음부터해시테이블을만들어보면확실하게이해하게될것이다.


[옮긴이서문]
이책에수록된두인터프리터의소스코드를여러분의PC에서실습하는방법을몇가지안내한다.
-방법1.지은이의깃헙리포지터리에서직접gitclone하여자신이즐겨쓰는IDE에서자신이선호하는빌드방법으로환경을구성한다.
-방법2.방법1이조금어렵다면,옮긴이가미리장별로예제코드를추출하여재작성한깃헙리포지터리를gitclone하기바란다.
-방법3.초심자거나스스로개발환경을구성하기어려운윈도우PC사용자라면부록으로설명한내용을참고하기바란다.
실습환경구성에어려움을겪는독자들을위해미리셋업이완료된개발환경을제공하였으나,이책의주제가인터프리터를직접만들어보는것인만큼단순히예제코드를실습해보는것에만족하지말고,자신이추구하는방향과가장잘맞는개발환경을스스로구축하기바란다.개발환경을구축하는과정에서뜻하지않은오류등많은난관에부딪힐수도있지만,그런것을해결하는과정역시학습의일부라는사실을잊지말고혼자서적극적으로해결하는연습을권장한다.


[베타테스터실습후기]
평소에접해보지못한조금다른관점의책입니다.예를들어언어의종류는많지만,사칙연산은모두동일하게처리합니다.1+1=2도차이가없습니다.일반적으로아무렇지않게사용하던사칙연산+-*/및연산에대한우선순위,함수를호출해서인자값을받기위한function()구성은어떻게처리되는지등그안의인터프리터를너무당연하게사용하고있다는생각이들었습니다.이를하나하나구현해나가면서,무의식중에사용하던기능을구현하는과정을경험하면서프로그래밍을평소와다른관점으로바라보게되는느낌이매우새로웠습니다.
-박찬웅|개발자

클래스나클로저같은요즘언어가가지는필수기능들을구현해보고,생각해볼만한엣지케이스와문제들이제공되어고민하면서언어를만들어가는과정을경험할수있었습니다.실습은어려움없이진행할수있었고,책의실습을따라한이후에도다양한언어로포팅된리포지터리를따라관심있는언어의구현체를살펴보고,새롭게구현해보면서체화할수있다는점도좋았습니다.
-최용욱|고려대학교컴퓨터학과,2년차DX개발자

이미출간된,혹은인터넷으로공개된많은컴파일러책중에서가장실용적인책입니다.이책에서다루고있는컴파일러내용,다이어그램과코드를이용한설명은매우훌륭합니다.특히후반부에다루는가비지콜렉션에대한내용은정말인상적이었습니다.실제GC의구동방식과실제구현에대한설명은GC의동작방식을이해하는데매우좋았습니다.실제코드를작성할때메모리사용및해제전략을수립하는데큰도움이될것입니다.재미삼아쉽게읽을수있는책은아닙니다.컴파일러에대한배경지식도일부필요하고요.하지만책을다읽고나면,내가작성한코드가어떤식으로처리되고수행되는지를이해하는데있어서큰산을하나넘었다생각할수있을것같습니다.
-윤종민|라인플러스,22년차개발자

처음에는언어를구현한다는것이어려울거라고생각했는데,쉽고재미있게설명되어있어서좋았습니다.책의예제들과설명이매우직관적이고명료해서이론적인지식이없어도이해하기쉬웠습니다.실제로언어를만들어보면서큰성취감을느낄수있었고,실제로동작하는인터프리터와컴파일러를만드는것이컴퓨터과학의기본원리를더깊이이해하는데도움이된다는게인상적이었습니다.
-박광현|(주)핀테크,서버개발자

제가생각한이책의장점은이렇습니다.(1)이야기를풀어내듯설명하여부담없이읽을수있었습니다.(2)핵심부분에집중할수있게간결함을추구합니다.코드도최대한간결하게갑니다.핵심부분에주로발생하는엣지케이스나까다로운문제해결에집중합니다.(3)챕터별로옮긴이가준예제코드를같이띄워놓고보다편하게실습하며책을읽을수있었습니다.최종완성본이아니라챕터별로컴파일가능한코드가제공된다는것이큰장점으로느껴졌습니다.내려받은모든파일이잘컴파일되어서편하게실습할수있었습니다.간결하지만복잡한컴파일러코드를기반으로여러예시와구현의도를설명하며책이진행되기때문에마치지은이가옆에서설명하면서같이코딩하는느낌이들었습니다.
-고주형|중앙대학교소프트웨어학부,백엔드개발자취업준비중