IBM®
메인 컨텐츠로 가기
    Korea [국가변경]    이용약관
 
 
   
        제품    서비스 & 솔루션    고객지원 & 다운로드    회원 서비스    
한국 developerWorks   >  dW Column  > developerworks
개발자 책꽂이

고전 탐험 2탄: 유닉스 프로그래밍 서적



박재호박재호 jrogue@gmail.com

블로그 '컴퓨터 vs. 책'과 '프로젝트 관리'를 운영하고 있으며, "조엘 온 소프트웨어"를 비롯한 IT 전문서적 번역가로 활동 중이다.



2008년 4월 1일


유닉스 운영체제를 제대로 활용하려면 i) 유닉스 프로그래밍 환경에 익숙해져야 하며, ii) C 프로그램을 제대로 작성할 줄 알아야 한다. 물론 유닉스 운영체제를 데스크톱용으로 사용하는 경우도 있겠지만, 대부분 특정 업무 수행이나 개발 목적으로 사용하기 때문에 프로그래밍 도구로서 유닉스를 어느 정도 이해하고 있느냐에 따라 생산성은 하늘과 땅 차이로 벌어지기 마련이다. 그렇다면 유닉스와 친해지기 위해 어떤 책을 읽으면 좋을까? 이 글에서는 명불허전(名不虛傳)으로 불릴만한 고전을 세 권 선택해 보았다.

The UNIX Programming Environment

The UNIX Programming Environment Brian W. Kernighan, Rob Pike 지음, Prentice Hall 1983년 출간

유닉스 운영체제 하면 커널, 셸 스크립트, 파이프로 연결된 명령어 집합, C 프로그래밍 언어 등이 생각나기 마련이다. 그렇다면 유닉스를 구성하는 이런 복잡한 구성 요소와 친해지는 방법이 없을까? 물론 셸 환경에서 여러 가지 유닉스 명령어를 내려보고 프로그램도 작성해보면서 친숙해지는 방법이 최고다. 하지만 유닉스 초보자가 스스로 이런 경지에 부트스트래핑해서 올라가기를 바라기는 어렵다. 즉, 누군가 조언해줄 사람이 필요하다.

다행스럽게도 우리에게는 ‘The UNIX Programming Environment’라는 흥미로운 책이 있다. 이 책은 출간된 지가 벌써 사반세기가 지나서 시대에 뒤떨어졌으리라는 생각이 들지도 모르겠다. 셸은 본 셸이고, C는 고전 C(pre ANSI C)이고, awk도 신형 nawk가 아닌 정통 awk이고, 유닉스 커널도 7판으로 거슬러 올라가므로 뭔가 최신 유행에 맞춰 급하게 소화해내려는 사람에게는 좌절감을 불러일으킬지도 모르겠다. 하지만 유닉스를 둘러싼 프로그래밍 환경은 겉보기에 화려한 사용자 인터페이스 발전과는 달리 극적인 변화는 없었기에 이 책의 내용은 21세기에 들어와서도 여전히 유효하다. 1000쪽이 넘어가는 두툼한 백과사전식 유닉스 명령어 모음집과는 달리 350쪽 분량에 불과하지만 이 책은 유닉스에서 프로그래밍을 제대로 즐기기 위한 여러 가지 기본적인 내용을 기초부터 튼튼하게 다룬다.

이 책의 가장 큰 미덕은 유닉스를 구성하는 각 요소를 유기적으로 활용해서 상승 효과를 극대화하도록 자신만의 프로그램 환경을 만들어내는 방법을 소개하는 데 있다. 개별 유틸리티를 각개 격파하는 대신, 파이프를 사용해 유틸리티 사이를 연결하는 필터 기법으로 문제를 풀어내는 예를 보여준다. 이 책은 크게 셸, grep, sed, awk를 중심으로 전개하는 셸 프로그래밍 기법과 유닉스 환경에서 C 프로그래밍 언어를 사용한 기초적인 시스템 프로그래밍 기법으로 나뉜다. 경우에 따라서는 셸 스크립트로 처리할 일을 C 프로그램을 사용해 다시 한번 반복하면서 양쪽의 차이점을 다루기도 한다.

여기까지 왔으면 확실하게 감이 오겠지만 이 책은 일반 사용자가 아니라 관리자이자 프로그래머를 주요 대상 독자로 삼고 있다. 유닉스 환경에서 뛰어난 프로그래머는 뛰어난 관리자이기도 했다는 사실을 기억하면 좋겠다.

여기서 이 책을 구성하는 세 번째 핵심 요소를 의도적으로 밝히지 않았다고 고백해야겠다. 이 책에서 셸 스크립트와 C 프로그래밍 언어는 마지막 세 번째 구성 요소를 설명하기 위한 전초전이라고 봐도 큰 무리가 없을 정도다. 이렇게 칭찬을 늘어놓은 주인공은 바로 컴파일러 제작을 지원하는 C 프로그래밍 유틸리티인 lex와 yacc을 사용해서 제대로 만든 유닉스용 부동소수점 지원 계산기 프로그램인 hoc이다. hoc을 구현하기 위해 필요한 구문 정의와 구문 분석 방법, 파싱 결과로 가상 코드를 만들어내는 방법, 가상 코드를 실제로 메모리에서 수행하는 가상 기계 구현 방법을 따라가다 보면 유닉스용 응용 프로그램을 어떻게 유닉스 철학에 맞춰 제대로 개발하는지 확실하게 감을 잡게 될 것이다. 덤으로 간단한 makefile 작성 방법과 hoc 매뉴얼 페이지를 troff 매크로를 사용해 문서화하는 방법까지 나오니 완벽한 유닉스 프로그래밍 환경을 다룬다는 제목이 절대로 과장이 아님을 확인할 수 있다.

다른 부분은 슬슬 넘어가더라도 hoc은 반드시 프로그램을 직접 작성해 분석하는 과정을 거쳐 자기 지식으로 만들기 바란다. http://cm.bell-labs.com/cm/cs/upe/에 들어가면 오탈자 정보는 물론이고 이 책에 나온 기본 예제와 hoc 계산기 코드를 구할 수 있으므로 직접 내려 받아 연습해보자.



위로


Software Tools in Pascal

Software Tools in Pascal Brian W. Kernighan, P.J. Plauger 지음, Addison-Wesley 1981년 출간

유닉스 도구를 사용하다 보면 종종 어떤 철학으로 어떤 프로그래밍 기법을 사용해 개발했는지 궁금해지는 경우가 생긴다. 요즘 유닉스 도구는 대부분 GNU 유틸리티로 나와 있으므로 원시 코드를 직접 구해 살펴보면 상당수 의문이 풀리기는 하지만 여전히 나침반이 필요하다. 코드를 읽고서 저변에 깔려있는 철학까지 역으로 추측하기란 결코 쉽지 않기 때문이다. 앞서 소개한 ‘The UNIX Programming Environment’를 읽다 보면 일부 해답을 얻을 수 있지만 여전히 부족하다는 느낌이 들기 마련이다.

이 때 우리를 구원하기 위해 나타난 백기사가 바로 ‘Software Tools in Pascal’이다. 하지만 제목을 보면 벌써 절망감이 들지도 모르겠는데, 실제로 이 책은 자바도 아니고 C++도 아니고 C도 아닌 파스칼 언어를 사용해 모든 예제를 설명한다. 만일 파스칼 프로그래밍 언어만 보면 두드러기가 나서 거부 반응을 일으키는 독자라면 이 책을 피해야 할지도 모르겠다. 실제로 이 책 지은이(Kernighan)조차도 이 책을 쓰기 위해 파스칼을 사용하다가 열이 받은 나머지 ‘Why Pascal is Not My Favorite Programming Language’라는 도발적인 제목을 단 글까지 적었을 정도니 독자에게 이 책을 권장하기가 상당히 난감하긴 하다. 하지만 역설적으로 C가 아니라 파스칼이라는 낯선 세상에서 유닉스라는 낯익은 개념을 다시 한번 되돌아볼 수 있는 좋은 기회라고 볼 수도 있다. 이 책을 읽으면서 동일한 논리로 동작하는 프로그램을 C로 작성하면 얼마나 쉬워질까라고 자문하면서 읽어보면 시스템 프로그래밍 언어로서 자연스럽게 풍겨 나오는 C의 위력을 다시 한번 느낄 수 있을지도 모르겠다.

이 책은 350쪽 정도 분량인데, 코드가 많음에도 불구하고 내용이 아주 조밀하므로 읽기가 결코 쉽지 않다. 첫 장에는 거의 ‘hello, world’ 수준의 아주 쉬운 예제가 나오기 때문에 이 책이 별 것 아니라고 생각하고 출발할지도 모르겠지만, translate(tr), archive(ar의 축소판), sort, find(find의 축소판), edit(ed의 축소판), format(troff의 축소판), define(m4의 축소판)에 이르기까지 내용이 점점 어려워지는 모습을 보게 된다. 유닉스에서 자주 다루는 유틸리티가 어떻게 만들어졌는지를 마치 바둑 경기가 끝난 다음, 여러 수를 비교해 복기하듯이 전문 기사(?)의 친절한 설명을 들으며 쫓아갈 수 있다는 장점이 있다. 각 프로그램 설명 끝 부분에는 실제 유닉스 환경에서 동일한 유틸리티가 제공하는 옵션이나 기능 등을 구현하도록 연습 문제가 실려있는데, 유틸리티를 구현하는 과정에서 설계 사상을 놓고 일어나는 개념 충돌이나 고민 등이 묻어 나오므로 빠뜨리지 말고 읽어보기 바란다.

소프트웨어 공학 등에 관심이 많은 독자라면 본문 중에 그냥 지나치면 안 되는 내용도 나온다. 바로 KWIC(Keyword In Context) 구현인데, 객체지향 프로그래밍 개념은 고사하고 아직 구조적 프로그래밍 개념조차도 걸음마를 하고 있을 무렵에 모듈화를 처음으로 주창한 데이비드 파나스가 1972년도에 쓴 논문인 ‘On the criteria to be used in decomposing systems into modules’와 비교 검토해 보면 감동이 배가 될 것이다. 이 책은 구조적 프로그래밍과 유닉스 핵심 설계 사상인 파이프와 필터로 유틸리티 군을 만들어내는 기반 철학을 제대로 다루는 몇 안 되는 책이므로 사용 중인 프로그래밍 언어나 설계-구현 철학과는 별개로 역사적인 관점에서든 실용적인 관점에서든 한번쯤 읽고 넘어가야 하는 개발자용 필독서라는 생각이다.

마지막으로 독자들을 위한 힌트 한 가지를 추가하겠다. 이 책에 나온 모든 예제를 담은 파일을 bwk 홈 페이지에서 제공하는데, 바로 이 책에서 만든 archive로 묶어 놓은 형식이다. ‘닭이 먼저냐 달걀이 먼저냐’와 같이 이 파일을 풀려면 이 파일 내에 들어있는 archive부터 뽑아내야 하는 상황인데, 앞서 소개한 ‘The UNIX Programming Environment’ 책에 나온 awk와 같은 도구를 사용해 한번 archive를 구현해 보면 어떨까?



위로


프로그래밍 수련법(The practice of programming)

프로그래밍 수련법(The practice of programming) Brian W. Kernighan, Rob Pike, 인사이트 2008년 출간

앞서 소개한 두 책이 너무나도 낡았다는 생각이 들어 쉽게 손이 가지 않는 독자를 위해 고전을 새롭게 개선한 ‘프로그래밍 수련법’이라는 책이 최근 다시 번역되어 시중에 선보였다. 물론 원서 초판 출간 날짜가 1999년이므로 하루가 다르게 변하는 컴퓨터 세상에서 이 책 역시 고전이라고 생각해도 무방하겠지만, 번역될 가능성이 거의 전무한 ‘The UNIX Programming Environment’나 ‘Software Tools in Pascal’과는 달리 원서 독해라는 부담 없이도 접근할 수 있기에 좋은 대안이라는 생각이다.

‘프로그래밍 수련법’은 단순성, 명확성, 일반성이라는 3대 설계 철학을 중심으로 프로그래밍을 간결하면서도 품위 있게 만드는 방법을 소개한다. 본문 중에 자바에 대한 내용도 나오긴 하지만 아무래도 저자의 성향상 유닉스와 C/C++ 환경에 밀접해질 수밖에 없기에 일반적인 프로그래밍 서적이라기보다는 유닉스 환경에서 C를 제대로 사용하는 입문서라고 생각하면 마음이 편해질 것이다. 실제로 아마존 서평 등을 보면 자바 관련 설명은 없는 편이 좋았을지도 모르겠다는 이야기도 나오고 있으므로 이 책 한 권으로 자바, 윈도우, 서버 프로그래밍 모두에 도가 트이리라는 기대를 했다면 실망이 클지도 모르겠다.

원서 기준으로 분량이 250쪽 정도 되는 이 책은 스타일에서 시작해 알고리즘과 자료 구조, 설계와 구현, 인터페이스, 디버깅, 테스팅, 성능, 이식성, 표기법에 이르기까지 프로그램 개발 전반에 걸친 여러 가지 흥미로운 내용을 다루고 있다. 물론 스티브 맥코넬이 쓴 ‘Code Complete’와 같은 묵직하고 본격적인 프로그래밍 지침서와 비교해 부족한 측면도 많지만 유닉스 환경에서 C/C++를 사용해야 하는 초중급 개발자가 빠르게 상황을 파악해 실전에 써먹기에는 가벼운 이 책으로 시작하는 편이 더 좋다는 생각이다.

한 가지 아쉬운 점은 이 책 예제가 거의 대부분 조각나 있기 때문에 나무는 보되 숲을 보기가 어렵다는 점이다. ‘The UNIX Programming Environment’나 ‘Software Tools in Pascal’을 읽어보면 본문 전반에 걸쳐 완벽한 코드 예제가 나오므로, 분석 과정에서 애로사항이 꽃피긴(?) 하지만 전반적인 큰 줄기를 파악할 수 있는데, ‘프로그래밍 수련법’을 읽다 보면 조각난 코드를 바라보며 종종 단절감이 느껴지기도 했다. 9장 표기법에서 이런 좌절감을 극복할 수 있도록 정규 표현식으로 패턴을 탐색하는 grep 구현 방법을 체계적으로 설명하기는 하지만 적은 분량이 아쉬울 따름이다.

책 오탈자, 샘플 챕터, 본문에 실려있는 예제 코드는 이 책 홈페이지인 http://plan9.bell-labs.com/cm/cs/tpop/index.html에서 구할 수 있다. 아, 그리고 이 책에 나오지 않은 재미있는 뒷이야기인 ‘A War Story’(원문, 한국어 번역)도 빼먹지 말기 바란다.


이 문서 북마킹 하기

mar.gar.in mar.gar.in naver naver eolin eolin del.icio.us del.icio.us
[지난 developerWorks Column 보기]



위로



사이트 여행

dW 커뮤니티
포럼 | 블로그 | Spaces
dW Student Community

로컬 컨텐츠

행사 및 세미나

기획 기사

개발자 입문

튜토리얼 및 교육

TOP 10 인기자료

SW 다운로드

RSS 피드

뉴스레터
  
자바스크립트가 작동이 중지되었습니다. 이 기능을 수행하시려면 브라우저에서 자바스크립스트를 작동시켜 주시거나 이곳을 클릭해주세요.
Special offers
IBM SOA Sandbox 시험판
dW Student Community
로보코드
코드 트레이닝


    IBM 소개 개인정보 보호정책 문의