10. C언어의 아버지, 데니스 리치의 일생

자기가 만든 프로그래밍 언어로 운영체제를 개발한 사람.

1999년 데니스 리치의 집.

“Inferno가 자바와 경쟁하기에는 역부족인가?”

당시 데니스 리치 Inferno 운영체제Limbo라는 프로그래밍 언어 개발에 참여하고 있었다.

“따르릉”

“클린턴 대통령이 우리에게 National Medal of Technology 을 준다고? 축하해 톰, 귀찮게도 워싱턴에 가야할이 생겼네.”

켄 톰슨: “우리 너무 상을 많이 받는 거 아닌가?”

데니스 리치: “그러게, 난 사실 튜링상을 받은 것 만으로 만족스러운데..”

데니스 리치가 이렇게 과학자로서 성공하게 된 배경에는 벨연구소에서 연구원으로 일했던 아버지 영향을 많은 받은 듯 보인다.

1940년대 벨연구소

데니스 리치: “아빠는 무슨일을 해?”
아버지(Alistair E. Ritchie): “글쎄다. 아빠는 switching circuit theory을 연구하는데, 넌 아직 이해하기 어렵겠구나.”

“디지털 회로를 만들려면 많은 switch가 필요하지. 아빠는 지금 그에 관한 책을 쓰고 있단다.”

10여년 후,

데니스 리치: “아빠, 하버드 대학 합격증을 받았어요.”

아버지: “축하한다. 그래 물리학을 공부할지 수학을 공부하지 결정했니?”
데니스 리치: “글쎄요. 둘다 너무 재미있어서 당장은 결정하기 어려울 것 같아요.”

“수학도 좋고 물리학도 재밌고.”

1960년 경,

“컴퓨터?”
컴퓨터 특강! 마크I으로 컴퓨터 프로그래밍을 배우세요. 문의: …

“컴퓨터를 이용하면 수학계산을 빨리할수 있겠는걸?”

컴퓨터 특강 시간

데니스 리치는 이 당시 Univac 컴퓨터로 프로그래밍을 배웠는데, 아날로그 컴퓨터, 펀치 카드 사용법을 배우고 나서야 비로소 디지털 컴퓨터를 배웠다[2].

물리학과 학부 학생임에도 불구하고 데니스 리치는 컴퓨터에 더 많은 흥미를 갖기 시작한다.

교수: “자네는 물리학과 학생인데, 논문 주제가 전산 이론이….”
데니스: “결국, 수학에 관한 내용입니다.”

대학원 논문 주제도 지금의 전산학에 관한 내용(hierarchies of recursive functions)이였다. 대학에서 전산학이 제대로 된 학문으로 자리 잡기 전의 일이라서 아마도 응용수학으로 이러한 논문을 쓴 것 같다.

데니스 리치는 이론 보다는 실용적인 측면에 관심이 많았고, 3년 동안 그가 수강했던 컴퓨터 특강의 강사가 되어 컴퓨터를 가르쳤다[2].

 

데니스 리치가 컴퓨터를 가르칠 때는 IBM 7094를 사용했다[2].

1967년 벨연구소

벨연구소 연구원: “오, 자네가 리치의 아들인가?”
데니스 리치: “네, 저를 기억하시는군요.”

켄 톰슨: “안녕 데니스! 벨 연구소에 온 것 을 환영하네.
우리 팀은 다른 회사와 함께 멀틱스라는 새로운 운영체제를 공동 개발하고 있는데, 관심있나?”
데니스: “새로운 운영체제라고요? 재미있을 것 같아요.”

켄 톰슨: “그게 쉽지 않아. 특히, 여러 회사가 공동개발할때는…”

1969년 벨 연구소

데니스: “이제라도 멀틱스 프로젝트에서 빠지게 된 것은 다행이네요.

그런데, 전화 요금 계산에 필요한 운영체제는 이제 어떻게 만들까요?”
켄 톰슨: 걱정마, 내가 새로운 운영체제를 하나 만들고 있는데, 관심있어?”

데니스: 새로운 운영체제?

톰 켄슨은 멀틱스에서 몇가지 아이디어를 가져오고 만들던 코드를 기반으로 새로운 운영체제를 만들고 있었다.

1972년 벨 연구소

유닉스 개발 당시 PDP-11으로 컴퓨터가 업그레이드되었는데, 명령어가 호환되지 않아서 다시 어셈블리 코드를 작성해야했다. 데니스 리치는 톰 켄슨과 함께 개발한 B언어로 유닉스를 다시 개발하려는 시도를 한다[3].

켄 톰슨: “지금 뭐해?”
데니스: “우리가 예전에 만든 B언어로 유닉스를 다시 짜려고 하는데, 쉽지 않네. 아무래도 B언어를 많이 고쳐야할 것 같아.”

당시 B언어는 PDP-11의 최신 기능을 활용하지 못했는데, 이를 수정해서 C언어라는 이름으로 재탄생한다. 그리고, 1972년 유닉스를 다시 C언어로 개발했다[4].

“흐흐 더 이상 어셈블리어로 코딩을 하지 않아도 되네.”

“흐뭇~” “와 C언어 대박인데!”

유닉스와 C언어는 벨 연구소 내에서 사용되었고, 1975년 부터 외부에 라이센스되어 판매되기 시작했고, 대학과 각 기관에 보급되었다. 또한, HP, Sun Microsystems과 같은 회사에서도 유닉스 코드를 기반으로 한 자체 운영체제를 만들기 시작하면서 사실상 업계 표준으로 자리 잡기 시작한다.

C 프로그래밍 언어 책을 쓰다.

벨 연구소에 일하던 브라이언 커니핸은 새내 교육용으로 B언어 튜토리얼를 작성했다. 이후, B언어가 C언어로 업그레이드 되면서 자연스럽게 C언어 튜토리얼도 작성하게 된다.

브라이언 커니핸: “데니스, 내가 쓴 C튜토리얼 기억하지? 이걸 책으로 만들면 어떨까? 자네가 도와주면 더 좋고.”
데니스 리치: “좋은 생각인데!”

책표지, 이미지 출처: 위키피디아 (링크)

C 프로그래밍 언어 책은 1978년 첫판이 출간되었고, 1988년 2판이 출판되었다. 20개 언어로 번역되었고, 90년대까지 전산학을 전공한 학생이면 대부분 이 책으로 C언어를 공부했다.

분산운영체제 Plan9

“흠.. 유닉스 이후에는 어떤 운영체제를 만들어야 하나?”

벨 연구소는 유닉스의 후속으로 80년대 중반부터 Plan9이라는 운영체제를 개발하기 시작한다.

데니스 리치는 이미 Computing Techniques Research 부서를 이끌고 있었는데, 이 때 부터는 실제 개발 보다는 조언자로서 개발에 참여한다. 본인 말로는 급여를 승인하는 업무를 했다고 하는데, 일부 코드를 작성했음을 시인하기도 했다[5].

Plan9은 벨 연구소 내부에서 유닉스를 대치하시 시작했지만 외부에서 고객을 찾기는 쉽지 않았다.

벨 연구소는 1990년대 부터 네트웍 장비에 사용할 목적으로 Inferno라는 운영체제와 Limbo라는 프로그래밍 언어를 개발하기 시작한다. 다양한 네트웍 장비에 동작을 하기 위해 가상 기계를 도입했는데, Sun에서 개발한 Java와 비슷한 부분이 많았다.

동료: “선마이로시스템에서 Java를 발표했는데, Inferno와 비슷해. VM기반으로 동작하고.”
데니스: “응, 들었어.”

벨연구소장: “데니스, Plan9과 마찬가지로 Inferno도 세일즈 마켓팅팀에서 노력했지만 고객을 많이 찾지는 못했네. 아무래도 프로젝트를 다른 회사에 넘겨야겠어.”
데니스: “인수할 회사가 나타나서 다행이네요.”

데니스 리치가 개발에 참여하고 조언을 했음에도 불구하고 벨 연구소가 유닉스 후속으로 개발한 Plan9과 Inferno는 시장에서 성공적이지 못했다. 마케팅의 실패 등 여러가지 이유가 있겠지만, 근본적으로 유닉스가 여전히 쓸만했기 때문에, 다른 OS를 도입할 이유를 찾기 어려웠다. 여기서 에릭 레이먼드는 본인이 쓴 책에서 Plan9를 예로 들면서 이러한 말을 남겼다[6]

“야심적인 시스템 설계자를 위한 교훈이 있습니다. 새로운 솔루션의 가장 위험한 경쟁자는 충분히 좋은 기존 코드 베이스입니다(There is a lesson here for ambitious system architects: the most dangerous enemy of a better solution is an existing codebase that is just good enough).”

Plan9에서 나온 /proc, utf8, clone 등 몇 가지 아이디어는 다른 유닉스와 리눅스에 적용되기도 했다.

2007년 은퇴

팀원: “은퇴하게 되어 너무 아쉬워요.”
데니스: “드디어 은퇴군, Plan9과 Inferno가 성공스럽지 못해서 좀 아쉽지만, 이제 좀 여행을 즐겨야겠어.”

동료: “요즘 건강은 어때? 지난번 전립선 암 수술 이후, 너무 말랐어.”
데니스: “ㅎㅎ 걱정마. 아직까지도 흥미로운게 너무 많아.”

동료:” 데니스하고 통화가 안되는데, 아무래도 집에 가봐야겠어.”

죽음

“이봐 데니스!”

혼자 살고 있던 데니스 리치는 2011년 10월 12일 뉴저지 주 버클리 헤이츠에 있는 집에서 숨진채로 발견되었다[1].

“이렇게 큰 일을 했는데, 이 친구 너무 조용하게 살았어.”
“그래도, 자기가 만든 프로그래밍 언어로 운영체제까지 만든 사람은 아무도 없을거야…:”

참고문헌

[1] 데니스 리치, 위키피디아 한글페이지
[2] Interview with Dennis Ritchie
[3] https://en.wikipedia.org/wiki/C_(programming_language)
[4] https://en.wikipedia.org/wiki/Unix
[5] 데니스 리치 홈페이지: https://www.bell-labs.com/usr/dmr/www/chist.html
[6] http://www.catb.org/esr/writings/taoup/html/plan9.html

본 만화에 나오는 대화는 실제 대화가 아니고 사실을 기반으로 하여 약간의 상상력으로 구성한 것임을 알려드립니다. 혹시 만화 내용 중 틀린 부분이 있으면 답글로 알려주시면 감사하겠습니다.

9. 유닉스 철학

IT 기술은 하루가 다르게 변화 발전해왔다. 하지만, 유닉스 만큼은 만들어진 40여년이 지났지만, 그 철학과 코드는 유닉스를 모태로 한 운영체제에 살아있다.

안드로이드에서 사용되는 리눅스 커널과 아이폰과 맥에서 사용되는 맥OS도 그 중 하나이다.

이 외에 유닉스 호환 운영체제인 미닉스도 유닉스의 설계 철학을 따라 만들어졌다. (더 자세한 가계도는 위키피디아를 참고)

“어떻게 유닉스는 지금까지도 사용되고 있을까?”

그 해답을 찾기 위해서는 유닉스 철학을 알필요가 있다. 물론, 처음 유닉스를 만들때는 거창한 철학 이런거는 없었다.  굳이 물어본다면,

“간단하고 멍청하게 하자” [1]

“아니, 농담이 아니라 진짜 철학을 설명해주세요.”

“그냥 만들었는데…”

켄 톰슨(Ken Thompson)으로 부터 유래된 유닉스 철학은 최소화되고 모듈화된 소프트웨어 개발 방식에 대한 개발 문화의 기준과 철학적 접근 방식을 말한다. 이는 유닉스 선두 개발자들이 얻은 경험을 근간으로 하고 있다[1].

“그래도 잘 모르겠네.”

공식적으로는 1978년 더글러스 맥클로이(Doug McIlroy)에 의해 문서화되었다[1].

  1. 각 프로그램이 하나의 일을 잘 할 수 있게 만들 것. 새로운 일을 하려면, 새로운 기능들을 추가하기 위해 오래된 프로그램을 복잡하게 만들지 말고 새로 만들 것.
  2. 모든 프로그램 출력이 아직 잘 알려지지 않은 프로그램이라고 할지라도 다른 프로그램에 대한 입력이 될 수 있게 할 것. 무관한 정보로 출력을 채우지 말 것. 까다롭게 새로로 구분되거나 바이너리로 된 입력 형식은 피할 것. 대화식 입력을 고집하지 말 것.
  3. 소프트웨어를, 심지어는 운영 체제일지라도 이른 시기에 수주에 걸쳐 이상적으로 시도해가며 설계하고 만들 것. 어설픈 부분을 버리고 다시 만드는 것을 주저하지 말 것.
  4. 프로그래밍 작업을 가볍게 하기 위해, 심지어 우회하는 방법으로 도구를 만들고 바로 버릴지라도 어설픈 도움 보다는 도구 사용을 선호할 것.

그리고 나중에서 피터 사루스(Peter H. Salus)가 다시 한번 요약하였다.[2]

  • 한가지를 일만 잘 하는 프로그램을 만들 것.
  • 다른 프로그램 함께 동작할 수 있는 프로그램을 만들 것.
  • 텍스트 스트림을 처리할 수 있는 프로그램을 만들 것. 왜냐면, 그것이 범용 인터페이스이기 때문이다.

이처럼, 유닉스는 마치 레고 블록 처럼 프로그램간의 입출력을 서로 연결해서 내가 원하는 기능을 쉽게 만들도록 하였다. 무엇보다도 어셈블리어가 아닌 C언어와 같은 고급 언어(high level language)로 만들어져 다른 컴퓨터로 이식이 쉬웠다.

“물론, 또 다른은 이유가 있는데, 그것은 불법복제? 이 이야기는 기회가 되는데로 나중에 이야기하기로…”

“비밀” (유닉스 소스코드가 담긴 테이프)

[1] https://ko.wikipedia.org/wiki/유닉스_철학
[2] https://en.wikipedia.org/wiki/Unix_philosophy

8. 유닉스와 C언어

1960년대 MIT에서 ITS(Incompatible Timesharing System)가 한창 개발되고 있는 동안, 미 동부의 다른 곳에서도 해커의 기운이 물씬 풍기는 곳이 있었는데, 바로 벨 연구소(AT&T Bell Laboratories)였다. 여기서 앞으로 세상을 바꿀 유닉스와 C언어가 개발되고 있었다.


공교롭게도 멀틱스(Multics) 개발에 참여하던 사람들이 나와  ITS와 유닉스를 만들기 시작했는데, 벨연구소 소속인 켄 톰프슨데니스 리치도 멀틱스 개발에 참여하고 있었다.

켄톰슨: 이제 멀틱스 개발에 손을 떼야할 것 같아. 데니스리치: 예상 보다 일정이 지연되고 있어.

멀틱스 프로젝트는 1964년 시작되었으나 코드 크기가 커지고 복잡도가 높아지면서 벨연구소에서 예상했던 것 보다 일정이 많이 지연되고 있었다.

벨연구소: 우리는 내부 일정을 맞추기가 어려워 프로젝트에서 손을 땝니다.
결국, 벨연구소는 1969년 멀틱스 개발에서 손을 뗀다.

벨연구소에 돌아온 톰 켄프슨은 멀틱스 개발 경험을 토대로 새로운 운영체제를 혼자 만들기 한다.

톰켄슨: 데니스, 내가 새롭게 운영체제를 만들고 있는데, 멀틱스에 좀 아이디어를 가져오고 좀 더 단순하게 만들어 보려고. 데니스: 좋은 생각인데, 나도 관심있어.

톰 켄프슨은 멀틱스에서 개발한 주요 기능을 유닉스에서 다시 구현했다.

우선 멀틱스에서 미리 구현해 본 파일 시스템을 PDP-7에 적용했고, 데니스 리치도 개발에 참여했다. 개발이 어느 정도 궤도에 오르자, 팀이 꾸려지고 이들은 파일시스템, 프로세스 모델, 디바이스 파일, 커맨드 라인 해석기 등, 오늘날 우리가 사용하는 운영체제 기능을 PDP-7에서 처음으로 구현하기 시작했다.

그후, PDP-11이 도입되었는데, 유닉스는 어셈블리어로 개발되어 다시 코드를 짜야했다.

데니스: 켄, PDP-11이 새로 들어왔는데, 여기에 유닉스를 포팅하면 어떨까? 켄톰슨: 좋은 생각인데, 문제는 어셈블리어 코딩을 다시 해야한다는 거지.

켄톰슨: 드디어 포팅 끝~~~ 데니스: 이봐, 톰 매번 새 컴퓨터가 나올 때 마다, 매번 코드를 다시 짤 수는 없잖아

켄톰슨: 그래, 데니스 우리 B언어로 유닉스를 다시 만들어볼까? 데니스: 좋은 생각인데, PDP-11정도면 B언어로 유닉스를 포팅할 수 있을거
B언어는 1969년 역시 켄 톰프슨과 데니스 리치가 함께 멀틱스에서 사용하기 위해 개발한 프로그래밍 언어였다.
데니스 리치: 우선 B언어를 PDP-11에 포팅해야 하는데 문제가 있네.

1971년 데니스 리치는 B언어에 문자 타입을 추가하고 컴파일러를 다시 작성해서 PDP-11 기계어를 생성하도록 했다[3].
톰켄스: 데니스  B언어 포팅은 잘되가? 데니스 리치: 문제가 많아. 우선 PDP-11에서는 문제 데이터 타입에 접근하기가 어려워. 다른 새기능을 사용할 수 없고.
톰 켄프슨: 하하, 이번 기회에  B언어를 싹 뜯어 고치는거야. 데니스 리치: 다시 짜야할지도로 모르는데..

1973년에 기본적인 기능이 구현되었고, 이름을 C언어로 불렀다. B의 다음 버전이라서 그냥 C언어로 부르게 되었다.

데니스리치: C언어로 부르면 어떨까? 톰슨: 우와 잘 동작하는데?

데니스 리치는 같은 해에 C언어로 유닉스를 다시 작성하기 시작한다.

C언어에 데이터를 정의할 수 있는 구조체 타입(structure type)을 추가하였다. 이제, C언어는 유닉스 커널을 작성할 수 있을 정도록 강력해졌다.

이처럼 유닉스와 C언어는 켄 톰프슨과 데이니 리치에 의해 짧은 기간에 탄생했지만, 오늘날까지도 핸드폰을 비롯한 대부분의 컴퓨터가 유닉스를 기반으로 동작하고 있다. 또한, 현재도 운영체제 커널은 C언어로 개발되고 있다.

참고
[1] https://en.wikipedia.org/wiki/Unix
[2] https://en.wikipedia.org/wiki/History_of_Unix
[3] The Development of the C Language
[4] The Evolution of the Unix Time-sharing System