본문 바로가기

CS/CS Book

[서평] 로버트 나이스트롬의 인터프리터 in Java, C

길벗 출판사로부터 책을 제공받고 진행되는 서평임을 밝혀둡니다

처음으로 서평을 써보게 되었습니다.

어떻게 남기는 것이 좋을까 고민하다 보는 사람입장에서는 결론이 빠르게 나오고 궁금하면 이후에 근거나 추가설명을 찾아볼 수 있는 글이면 좋을 거 같아 읽고 개인적으로 생각해 보는 책의 특징과 추천독자를 적기로 하였습니다.

결론

인터프리터, 컴파일러가 어떻게 일하나 문자열 파싱은 어떻게 진행되는지 궁금하였는데 소스코드와 설명을 통해 이해하기 좋은 책입니다.

EA, Google 출신 엔지니어의 친절한 설명과 코드로 인터프리터와 컴파일러를 만들어 볼 수 있습니다.

Java로 시작하여 C도 써볼 수 있고 뒤에는 가비지 컬렉팅에 대해서도 배울 수 있습니다.

각 챕터가 적정 길이로 구성되어 부담이 덜한 편이며 중간 중간 보조설명과 주석이 이해하는데 도움 되며 어디선가 들어만 보았지만 몰랐던 용어(e.g) Yacc, Bison 등)에 대한 이해도 갖게 해 주어서 좋습니다.

꽤 나가는 두께이지만 그렇기에 더 자세히 배울 수 있다는 장점과 이론만 있었다면 망설여졌겠지만 따라해볼 수 있는 소스코드가 있기에 그런 부담을 줄여줍니다.

연습문제의 경우 퀄리티가 좋아서 스터디로 해보아도 좋겠단 생각이 듭니다.

새로운 프로그래밍 언어는 꾸준히 나오는데 새로운 언어를 빠르게 배울 수 있는 능력을 키우는 것과 프로그래밍 언어를 어떻게 의미 부여해서 해석하는지에 대해 궁금해하시는 분들께 추천드립니다.

추천독자

이 중에 한개 이상 해당되신다면 추천드립니다

  • 프로그래밍 언어를 1개 이상 알고 프로그래밍을 해본 사람
  • 문자열 파싱을 해본 적이 있는 사람
  • 컴파일러, 인터프리터에 관심 있는 사람
  • 컴파일, 인터프리트라는 핵심 원리 이해를 통해 새로운 프로그래밍 언어를 빠르게 배우고 싶은 사람

다음에 추천하는 독자

  • 프로그래밍에 처음이신 분
  • 아직 문자열 파싱을 안해보셔서 필요성을 덜 느끼실 분

Intro 컴파일러에 관심을 갖기까지

이전에 문자열 파싱 부분은 지루하고 핵심이 아니라고 생각하였었다. 그러다 다른 분과 대화를 통해 결국 프로그래밍이라는 게 문자열 파싱과 멀어질 수 없음을 느끼게 되었다.

생각해 보면 프로그래밍은 사람이 하는 것이고 컴퓨터를 무언가를 데이터를 주고받는 것도 대체로 사람이 쓰기 위해서이다.

쓰는 주체도 사람이고 목적도 사람이다보니 사람이 쓰는 언어가 쓰일 수밖에 없다는 생각이 들었다.

 

웹서버를 CPP로 3명이서 구현해야할 일이 있었다.

나의 경우 궁금하였던 파싱파트를 하기로 하였고 웹서버의 config파일 파싱을 맡았었다

nginx를 본따서 nginx docs 읽기와 nginx config 값에 따른 변화를 실험하여 대략적 흐름을 이해 한 뒤 파싱이 가능할지 유효성 검사를 하고 그 뒤에 만들어둔 데이터형식에 맞게 파싱 하는 방식으로 진행하였다. 파싱에 대해 체계적으로 배우고 한 것이 아니기에 내가 세운 룰대로 파싱을 진행하였고

config 파일 파싱임에도 소스코드가 1500~1800줄에 이르렀다.

아는 다른 분은 FSM(Finite State Machine) 방식으로 현재 문자의 상태에 따라 처리되게끔 로직을 구성하셔서 300여줄로 끝내신 것을 보고 나는 같은 일하는 작업을 왜 이렇게 길게 쓴 거지 라는 생각이 들었고 좀 더 체계적으로 배워서 만들어 볼걸 하는 아쉬움이 들었다.

 

웹 공부를 하다 브라우저가 궁금하여 브라우저의 동작에 대해 알아보았다

파싱이 쓰일 줄 몰랐던 웹브라우저에서도 파싱을 쓴다

HTML ,CSS , JS도 사람이 알아볼 수 있는 형태로 구성된 문자열이고

문자열이니까 의미단위로 나누고 의미에 따라 연결을 구성할 수 있단 생각 들었다.

https://web.dev/articles/critical-rendering-path/render-tree-construction?hl=en

 

Intro 치고는 꽤 긴 과정을 거쳐서 이렇게 문자열 파싱, 컴파일에 관심을 갖게 되었다.

관심 가진지 초반이었기에 어떤 책이 있나 알아보고 짧은 책들 위주로 찾아보았다.

그러다 좀더 길고, 그렇다고 해서 이론만 있지는 않은 책을 찾게 되었고

타이밍 좋게 로버트 나이스트롬의 인터프리터 in Java, C라는 책이 번역되었음을 알게 되었다.

로버트 나이스트롬의 인터프리터 in Java, C 리뷰어 이벤트를 신청하였고 운 좋게 당첨되어 이렇게 책을 읽고 글을 쓰게 되었다.

책을 읽으며

부록포함 800여 쪽이지만 적절한 길이로 잘 나누어져 있어서 큰 부담 없이 읽을 수 있습니다.

 

 

번역의 경우도 읽기 자연스러우며 저의 겸손한 영어실력에 알맞게 원어의 경우 어떻게 쓰였었는지 괄호로 표현되어 잔잔하게 영어단어 공부하는 게 되는 이점도 있었습니다.

 

 

핑크색 박스에는 보조설명이 같이 곁들여져서 텍스트만 읽기 지칠 때 가볍게 읽어보기 좋았고

생각보다 배경지식을 쌓기 좋아서 본문을 읽을 때 꽤나 도움 되었습니다.

 

 

EA, Google 출신 개발자의 소스코드를 볼 수 있다는 점도 배움이 되어 좋았고

컴퓨터 책에 이론만 나오면 개인적으로 재미가 살짝은 떨어질 수 있는데 실습할 수 있는 코드와 함께 저자의 github도 제공되어서 언제든 코드를 보고 따라 해볼 수 있기에 그 점이 든든했습니다.

 

 

언어의 경우 정적언어로 만들면 구현할 부분이 많아져서 동적으로 구현한다 하였는데

동적언어를 구현하는 것에 알맞게 가비지 컬렉터도 같이 구성되어 있습니다.

어떻게 동적할당 데이터를 기억하고 어떤 식으로 본 프로세스에 영향을 덜 주면서 효율적으로 확인하는지 궁금하였는데 가비지 컬렉팅 방식과 수집방법, 성능 평가 기준 등이 설명되어 궁금함을 해소하기 좋습니다.

 

 

한 권으로 Java, C로 언어를 이용하여 인터프리터, 컴파일러를 구현해 볼 수 있어 꽤나 가성비 좋습니다.

프로그래밍 언어를 만드는 것에 대해 깊이 생각해 본 적이 없었는데

이 책을 읽으며 언어 해석기(컴파일러, 인터프리터)를 만든다는 것이 결국 언어를 만드는 것이라는 생각이 들었고 컴퓨터 과학은 추상화라더니 언어를 어떻게 해석할지 구상하는 것도 추상화라 싶어서 정말 다 추상화이고 0,1의 조합에 의미 부여해서 기계로부터 사람에게 의미 있는 일을 하게 만드는구나라는 생각이 들어 새삼 책 읽는 게 더 재밌었습니다.

 

다음에는 깊게 읽고 다 실행해 볼 수 있게 스터디로 해보면 좋겠단 생각이 들었고

깊게 배우고 싶으신 분들께 스터디를 추천드립니다.

글 읽어주셔서 고맙습니다.