Chapter 10 톰프슨, 리치, 커니핸
C와 유닉스의 선순환에는 실제로 수많은 사람이 기여했지만, 이 장에서는 특히 가장 큰 영향을 끼친 세 사람인 켄 톰프슨(Ken Thompson), 데니스 리치(Dennis Ritchie), 브라이언 커니핸(Brian Kernighan)에 초점을 맞추어 이야기를 해 볼까 합니다.
켄 톰프슨
케네스 레인 톰프슨(Kenneth Lane Thompson)은 1943년 초 뉴올리언스에서 태어났습니다.
톰프슨은 어린 시절부터 수학과 각종 논리 문제에 관심이 많았으며, 가끔은 수학 문제를 이진법으로 풀기도 했습니다.
그는 전자 공학에도 관심이 많아 십대 시절부터 전자 공학과 관련된 공부를 하는 것이 취미일 정도였습니다.
그는 이후 캘리포니아주 출라 비스타(Chula Vista)에서 고등학교를 졸업했으며, 캘리포니아 UC 버클리(UC Berkeley)에서 전기 공학을 전공했습니다.
톰프슨이 석사 학위를 받은 후 그의 지도 교수는 그를 벨 연구소(Bell Labs)에 취업시키려고 애를 썼습니다.
하지만 톰프슨은 딱히 ‘야망도 없고’ 취업에도 흥미가 없었기 때문에 면접 약속을 여러 번 어겼습니다.
결국 채용 담당자가 직접 그의 집에 찾아갔고, 톰프슨은 그에게 진저 스냅(gingersnaps)과 맥주를 대접했습니다.
그는 벨 연구소의 입사 제안을 수락하여 1966년 멀틱스(Multics) 프로젝트를 시작하게 되었습니다.
데니스 리치
데니스 맥앨리스터 리치(Dennis MacAlistair Ritchie)는 1941년 9월 9일 뉴욕 브롱크스빌(Bronxville)에서 태어났습니다.
그는 1959년 뉴저지주 서밋 고등학교(Summit High School)를 졸업하고 하버드 대학교에 진학하여 1963년에 물리학 학사 학위를 받았습니다.
리치는 하버드 재학 중에 유니박 I(UNIVAC I) 프로그래밍 강좌를 듣고 컴퓨터에 대한 관심을 갖게 됩니다.
학사를 졸업한 후 리치는 하버드 대학교에서 응용 수학 석사 과정에 들어갑니다.
그의 주된 연구 과제는 컴퓨터 이론 및 활용에 대한 연구였습니다.
그는 1967년, 하버드 박사 과정 중에 아버지를 따라 벨 연구소에 합류하여 멀틱스 프로젝트와 GE 635용 BCPL 컴파일러 개발에 참여했습니다.
리치는 거의 박사 학위를 받을 수 있었습니다.
그의 지도교수가 그의 학위 논문을 승인했지만, 당시 졸업을 위한 조건인 논문 제본 제출을 끝내 하지 않았기 때문입니다.
데니스 리치는 그 당시 본인에 대해 스스로 이렇게 평가했습니다.
“나는 학부 시절 물리학자가 될 만큼 똑똑하지 않다는 것을 알게 되었다. 그리고 컴퓨터가 무척 멋지다는 사실도 알게 되었다. 대학원 시절에는 알고리즘 이론 전문가가 될 만큼 똑똑하지 않다는 것과 내 스스로 함수형 언어보다 절차적 언어를 좋아한다는 점도 알게 되었다.”
톰프슨은 리치에 대해 “매우 날카롭고, 수학적 역량이 나보다 훨씬 뛰어났다.
일단 아이디어를 잡으면 끝까지 몰고 가는 집중력이 있었다.”라고 평가했습니다.
커니핸은 리치에 대해 “그는 사교 모임보다는 일에 몰입하는 것을 더 좋아했으며, 함께 일하기 매우 좋은 사람이었다. 그는 유머 감각이 뛰어났으며 …… 매우 사적인 의견이지만 그는 친절하고 따뜻하며 재치 있는 사람이었다.”라고 평가했습니다.
브라이언 커니핸
브라이언 윌슨 커니핸(Brian Wilson Kernighan)은 1942년 캐나다 토론토에서 태어났습니다.
커니핸은 고교 수학 선생님의 추천으로 토론토 대학교의 공학 물리학(engineering physics) 과정에 진학했습니다.
커니핸이 처음 본 컴퓨터는 1963년의 IBM 7094였습니다.
당시 IBM 7094가 있던 큰 공조실에는 정장을 입은 사람으로 가득 차 있었고, 일반인(특히 학생들)은 그 근처에도 갈 수 없었습니다.
그는 1969년 벨 연구소에 정식으로 채용되어 일을 시작했으며, 멀틱스나 유닉스와는 관련 없는 여러 프로젝트에서 일을 시작했습니다.
하지만 톰프슨과 리치의 사무실이 근처에 있었고, 리처드 해밍(Richard Hamming) 또한 주변 사무실에 있었습니다.
해밍은 커니핸에게 글쓰기의 중요성과 문체(style)의 중요성을 깊이 인식시켜 준 인물이기도 합니다.
멀틱스
“MIT에는 이미 매우 훌륭한 타임셰어링 시스템이 있었지만, 그들은 더 나은 시스템을 만들겠다고 결심했다. 그리고 그게 바로 치명적인 실수였다.” - 켄 톰프슨
멀티플렉스 정보 및 컴퓨팅 서비스(Multiplexed Information and Computing Service, Multics)는 GE와 벨 연구소, MIT가 함께 개발한 2세대 타임셰어링 시스템입니다.
멀틱스는 MIT의 CTSS(Compatible Time-Sharing System)의 차세대 시스템으로 만들어졌습니다.
1959년 크리스토퍼 스트레이치(Christopher Strachey)는 그의 아이디어를 이용하여 “Time Sharing in Large Fast Computers(대형 고속 컴퓨터에서의 타임셰어링 기법)”라는 논문을 발표했습니다.
이 논문에서는 한 프로그래머가 자신의 단말기로 프로그램을 디버깅하는 동안 다른 프로그래머가 또 다른 단말기로 다른 프로그램을 실행할 수 있는 시스템을 제안했습니다.
1961년, 실험적 타임셰어링 시스템(experimental time-sharing system)이 가동되기 시작했습니다.
처음에는 IBM 709를 사용했으나 이후 7090으로 대체되었고, 이는 다시 7094로 대체되었습니다.
이 실험적인 시스템은 이후 CTSS로 발전했으며, 아마도 최초로 실제 운영된 타임셰어링 시스템이었을 것입니다.
그리고 CTSS는 1963년에 정식 서비스를 시작했습니다.
멀틱스의 초기 설계 작업은 1964년에 시작되었습니다.
GE는 IBM 7094보다 더 크고 성능이 뛰어난 컴퓨터를 제작하기로 했습니다.
벨 연구소와 MIT는 소프트웨어를 공동으로 개발했으며, MIT가 대부분의 설계를 담당하고 벨 연구소는 주로 소프트웨어를 구현하는 일을 맡았습니다.
멀틱스에 사용된 주요 언어는 PL/1입니다.
그러나 PL/1으로 컴파일러와 프로그램을 작성하는 일이 너무 어려웠기 때문에 마틴 리처즈(Martin Richards)는 데니스 리치의 도움을 받아 훨씬 더 단순한 언어인 BCPL(Basic Combined Programming Language)을 개발하게 되었습니다.
결국 1966년부터 1969년까지 3년에 걸친 작업 끝에 벨 연구소는 멀틱스 프로젝트에서 손을 떼기로 결정합니다.
PDP-7과 우주 여행
“유닉스는 나 자신을 위해 만들었다. 다른 사람들을 위해 만든 운영체제가 아니라, 단지 게임을 만들고 내게 필요한 일들을 하기 위해 만든 것이다.” - 켄 톰프슨
당시 연구소에는 1965년에 나온 잘 쓰이지 않던 PDP-7 소형 컴퓨터가 하나 있었습니다.
이 컴퓨터에는 DEC 340 벡터 그래픽 디스플레이가 장착되어 있었으며, 주로 회로 해석 시스템의 원격 작업 입력 단말기로 사용되었습니다.
엔지니어들은 라이트펜을 이용하여 디스플레이 위에 회로를 그린 후 이를 더 큰 컴퓨터로 전송해서 해석을 수행하고는 했습니다.
그래서 톰프슨과 리치는 PDP-7 어셈블리어로 직접 부동소수점 연산 루틴, 글꼴과 문자 표시 서브루틴, 디버거까지 만들어 내며 PDP-7에서 우주 여행 게임이 실행되게 만들었습니다.
톰프슨은 3D 우주 전쟁 게임도 만들었습니다.
DEC 340 디스플레이는 모니터에 후드(덮개)를 부착할 수 있었습니다.
톰프슨은 그 후드를 활용하여 사용자가 우주에서 서로를 공격할 때보다 현실감을 느낄 수 있도록 만들었습니다.
또 그는 연구소 곳곳에 있는 PDP-7 원격 장치 여러 대를 2000bps 모뎀으로 연결하여 2인용 우주 전투를 구현하기도 했습니다.
PDP-7은 18비트 워드를 사용했고, 기본으로 4K 코어 메모리를 탑재하고 있었습니다.
톰프슨과 리치가 사용한 기계에는 추가로 4K 메모리와 대형 디스크가 장착되어 있었습니다.
이 디스크는 크기가 매우 컸습니다.
디스크 외부 덮개의 높이는 약 6피트에 달했고, 플래터(platter)는 비행기 프로펠러처럼 수직으로 회전했습니다.
유닉스
“ …… 그리고 그 전까지는 전혀 알지 못했는데 어느 순간 내가 운영체제를 완성하는 데 쓸 수 있는 기간이 불과 3주밖에 남지 않았다는 사실을 깨달았다.” - 켄 톰프슨
왜 3주였을까요?
당시 그의 아내와 갓난아들이 캘리포니아에 있는 처가로 3주 동안 휴가를 떠나 있었기 때문입니다.
그에게 필요한 것은 텍스트 에디터, 어셈블러, 셸/커널 이렇게 세 가지 프로그램이었습니다.
그리고 그는 각각의 프로그램을 만드는 데 일주일씩 기간을 할당했습니다.
그렇게 3주 후 유닉스가 탄생합니다.
멀틱스 프로젝트의 파생물이자 디스크 스케줄링 문제와 3주간의 휴가가 낳은 결과물이었습니다.
PDP-7 위에서 실행된 이 단순하고 작은 유닉스 운영체제는 단지 ASR 33 텔레타이프 하나를 터미널로 두고도 왜인지 훨씬 더 편리했고, 무엇보다도 더 재미있게 사용할 수 있었습니다.
톰프슨은 scribble-text라 불리는 프로그램도 만들었으며, 이를 통해 DEC 340 디스플레이를 두 번째 단말기로 활용할 수 있게 만들었습니다.
덕분에 PDP-7은 동시에 사용자 두 명을 처리할 수 있었습니다.
톰프슨은 유닉스를 개발하던 시기를 회상하며 “나는 당시 정말 대단한 사람들을 만나기 시작했다.”라고 말했습니다.
그중에는 브라이언 커니핸, 데니스 리치, 더그 매킬로이(Doug Mcllroy), 로버트 모리스(Robert Morris)가 포함되어 있습니다.
PDP-11
“명분은 텍스트 처리였지만, 진짜 이유는 놀기 위해서였죠.” - 켄 톰프슨
PDP-11은 메모리가 바이트 단위를 기반으로 구성되어 있으며, 내부 아키텍처는 16비트 구조입니다.
즉, 바이트가 두 개 모여 하나의 워드를 이루고, 각 워드는 하위 바이트를 먼저 저장하는 리틀 엔디안(little-endian) 방식으로 저장됩니다.
조 오산나가 원시적인 텍스트 처리 및 조판 도구인 nroff를 만들었고, 이후에 troff까지 개발하면서 본격적인 작업이 시작되었습니다.
그리고 특허 부서는 유닉스 팀이 만든 시스템을 아주 만족해 했습니다.
특허 부서는 이 시스템에 너무 만족했기 때문에 유닉스 팀이 보다 마음껏 연구할 수 있도록 또 다른 PDP-11을 구입해 주었습니다.
커니핸은 당시 연구소의 예산에 대해 “그것은 아껴야 하는 돈이 아니라 일종의 소진해야 하는 할당액 같았다. 마치 모두의 이익을 위해 열심히 써야 되는 돈 같았다.”라고 말하기도 했습니다.
어느 날 톰프슨은 1964년에 더그 매킬로이가 쓴 논문에서 또 다른 아이디어를 얻었습니다.
매킬로이의 논문에는 프로그램들이 마치 정원의 호스처럼 서로 연결될 수 있어야 한다는 내용이 있었습니다.
그렇게 아이디어를 얻은 톰프슨은 불과 몇 시간 만에 유닉스 파이프(Unix pipes)를 구현합니다.
그는 본인이 구현한 파이프 기능에 대해 그저 ‘사소한(trivial)’ 변경이었다고 표현했습니다.
이후 톰프슨은 단 하룻밤 사이에 리치와 함께 기존 모든 유닉스 애플리케이션을 수정하여 불필요하게 장황했던 콘솔 메시지를 전부 제거하기도 했습니다.
stderr를 만들어 모든 오류 메시지가 stderr을 통해 출력되도록 만들었습니다.
결국 기존 유닉스 애플리케이션들은 전부 파이프로 연결되어 일종의 필터(filters)처럼 동작할 수 있게 되었습니다.
이처럼 파이프와 필터가 만들어지자 향후 유닉스 팀에 미친 영향은 그야말로 충격적(mind blowing)이었습니다.
톰프슨은 마치 수없는 아이디어가 폭발적으로 쏟아져 나오는 ‘광란(frenzy)의 현장’ 같았다고 당시를 회상하기도 했습니다.
C 언어
“유닉스 커널을 C로 세 번이나 다시 작성해 보았지만 모두 실패했다. 그리고 나는 그것이 내 잘못이 아니라 언어의 탓이라고 생각했다.” - 켄 톰프슨
당시 톰프슨은 컴퓨터라면 반드시 포트란 언어를 쓸 수 있어야 한다고 생각했습니다.
그는 TMG를 이용하여 포트란을 작성했습니다.
그러나 그렇게 해서 만든 컴파일러는 용량이 너무 커서 PDP-7 유닉스의 사용자 할당 용량인 4K를 초과했습니다.
톰프슨은 일부 기능들을 하나씩 제거하고 다시 컴파일하는 작업을 반복하면서 결국 4K 용량에 맞는 컴파일러를 만들어 냅니다.
결과적으로 톰프슨이 만든 언어는 포트란과 그다지 비슷하지 않았습니다.
오히려 멀틱스 언어인 BCPL과 더 유사했습니다.
그래서 톰프슨은 그렇게 자신이 만든 새 언어를 B라고 이름 붙였습니다.
B는 인터프리터가 해석할 수 있는 P 코드라는 중간 코드를 생성했습니다.
이 때문에 언어 자체의 실행 속도는 느렸지만, 컴파일 과정은 훨씬 간단했습니다.
또 실행 파일을 메모리에 억지로 집어넣지 않고 파일에 저장해 둔 채 가상적인 방식으로 실행할 수 있다는 장점도 있었습니다.
톰프슨이 추가한 기능 중 하나는 스티븐 존슨(Stephen Johnson)이 제시한 기발한 아이디어인 ‘세미콜론’을 활용한 for 루프입니다.
바로 여기에서 C 언어의 for 루프가 탄생합니다.
그가 추가한 또 다른 기능은 우리가 C 언어에서 익숙하게 사용하고 있는 ++와 += 스타일의 연산자입니다.
당시 B 언어에는 명시적인 타입(type)이 없었습니다.
모든 것이 암묵적 타입의 워드(word)였고, PDP-7에서는 그 워드가 18비트 정수였습니다.
그러나 PDP-11은 바이트 기반의 컴퓨터였으며, 바이트는 제대로 된 연산을 수행하거나 포인터를 담기에 너무 작았습니다.
리치는 B 언어에 타입을 추가하기로 했습니다.
그가 처음 추가한 타입은 char와 int였으며, PDP-11용 기계어 코드를 생성하도록 B 컴파일러도 다시 작성했습니다.
그는 이 언어를 NB(New B)라고 불렀습니다.
이후 리치는 배열과 포인터 처리를 통합하고, int와 char 타입 체계를 확장하여 포인터를 가리키는 포인터까지 만듭니다.
그래서 char **p;는 char를 가리키는 포인터를 다시 가리키는 포인터를 선언하는 것이 되었고, char c = **p;처럼 이중 역참조를 통해 값을 가져올 수 있었습니다.
또 그는 #include와 #define을 제공하는 초기 버전의 전처리기도 추가했습니다.
그 당시는 1972년으로, 리치는 그 시점에서 자신들이 만든 언어가 새로운 이름을 가질 때가 되었다고 생각합니다.
그래서 그는 새 언어에 C라는 이름을 붙였습니다.
톰프슨은 유닉스를 C로 이식하는 작업을 세 번 시도했지만 모두 실패했습니다.
그는 실패의 원인이 언어 자체에 있다 주장했고, 이를 ‘보강’하기 위해 리치는 C에 다양한 조정과 기능을 추가하는 작업을 했습니다.
그리고 리치가 C에 struct를 추가한 이후 비로소 톰프슨이 유닉스를 성공적으로 이식할 수 있었습니다.
이에 대해 톰프슨은 이렇게 말했습니다.
“struct가 있기 이전에는 너무 복잡해서 도저히 코드 전체를 정리하고 관리할 수가 없었다.”
K와 R
당시 저는 어셈블리 언어에 완전히 편향되어 있었습니다.
고급 언어는 겁쟁이들이나 쓰는 것이라고 생각했죠.
뭔가 제대로 된 일을 해내고 싶은 진짜 프로그래머라면 어셈블러를 써야 한다고 굳게 믿고 있었습니다.
하지만 K와 R을 읽으면서 저는 한 가지 사실을 깨달았습니다.
사실상 C는 어셈블러였던 것입니다.
다만 보통의 어셈블러보다 더 나은 문법을 가지고 있었을 뿐입니다.
제가 있던 테라다인 센트럴(Teradyne Central) 전체가 소프트웨어 개발 언어를 C로 전환하게 되었습니다.
그렇게 K와 R이 쓴 그 책은 제 인생을 바꾸었고, 다른 수많은 소프트웨어 프로그래머의 삶도 바꾸었습니다.
팔을 비트는 ...
커니핸은 리치에게 같이 책을 내자고 설득했습니다.
리치는 처음에는 커니핸 제안이 별로 내키지 않았지만, 그의 끈질긴 설득(‘팔을 비트는’) 끝에 마침내 그의 제안을 수락합니다.
그렇게 커니핸은 C 언어 튜토리얼의 초고를 집필하게 되었고, 리치는 유닉스 시스템 호출과 관련된 챕터와 C 언어 참조 매뉴얼 부록을 작성했습니다.
커니핸은 리치의 작업에 대해 “정확하고, 우아하며, 간결하다.”라고 말했습니다.
여기에 더해 빌 플라우거(Bill Plauger)는 리치의 정밀함은 “등골이 오싹할 정도였다.”라고 말하기도 했습니다.
그렇게 두 저자는 함께 초고를 다듬어 나갔고, 그들의 책은 1978년 프렌티스 홀(Prentice Hall)에서 벨 연구소 저작권하에 출판되었습니다.
책 서문에 커니핸과 리치는 이렇게 썼습니다.
“[유닉스] 운영체제, C 컴파일러, 본질적으로 모든 유닉스 응용 프로그램(이 책을 집필하는 데 사용된 모든 소프트웨어를 포함하여)이 C로 작성되어 있다. …… 대부분의 예제는 단순한 코드 조각이 아닌 완전히 작동한 실제 프로그램이다. 모든 예제는 기계가 읽을 수 있는 형태로 직접 테스트되었다.”
소프트웨어 도구
그 당시 저는 유닉스에 익숙하지 않았습니다.
물론 K와 R을 통해 이름 정도는 알고 있었지만, 정확히 어떤 개념을 가지고 어떻게 동작하는지는 알지 못했습니다.
그러나 책에서는 그 점을 분명히 짚어 주었습니다.
그 책에 따르면 유닉스적인 사고방식이란 소프트웨어를 단순하고 쉽고 활용하기 좋게 만드는 것입니다.
결론
그 누구도 톰프슨과 리치에게 유닉스와 C를 만들라고 시키지 않았습니다.
그들을 움직이게 만든 것은 열정과 호기심, 함께 성장한 개발자 커뮤니티입니다.
그들은 자유분방하게 스스로 탐험을 이어 가는 사람들이었고, 풍족한 자금과 느긋한 분위기가 깔린 환경 속에서 일했습니다.
무엇보다도 그들은 뛰어난 인재들이었습니다.
결국 그들은 이 세상을 바꾸어 놓았습니다.
Chapter 10 톰프슨, 리치, 커니핸
C와 유닉스의 선순환에는 실제로 수많은 사람이 기여했지만, 이 장에서는 특히 가장 큰 영향을 끼친 세 사람인 켄 톰프슨(Ken Thompson), 데니스 리치(Dennis Ritchie), 브라이언 커니핸(Brian Kernighan)에 초점을 맞추어 이야기를 해 볼까 합니다.
켄 톰프슨
케네스 레인 톰프슨(Kenneth Lane Thompson)은 1943년 초 뉴올리언스에서 태어났습니다.
톰프슨은 어린 시절부터 수학과 각종 논리 문제에 관심이 많았으며, 가끔은 수학 문제를 이진법으로 풀기도 했습니다.
그는 전자 공학에도 관심이 많아 십대 시절부터 전자 공학과 관련된 공부를 하는 것이 취미일 정도였습니다.
그는 이후 캘리포니아주 출라 비스타(Chula Vista)에서 고등학교를 졸업했으며, 캘리포니아 UC 버클리(UC Berkeley)에서 전기 공학을 전공했습니다.
톰프슨이 석사 학위를 받은 후 그의 지도 교수는 그를 벨 연구소(Bell Labs)에 취업시키려고 애를 썼습니다.
하지만 톰프슨은 딱히 ‘야망도 없고’ 취업에도 흥미가 없었기 때문에 면접 약속을 여러 번 어겼습니다.
결국 채용 담당자가 직접 그의 집에 찾아갔고, 톰프슨은 그에게 진저 스냅(gingersnaps)과 맥주를 대접했습니다.
그는 벨 연구소의 입사 제안을 수락하여 1966년 멀틱스(Multics) 프로젝트를 시작하게 되었습니다.
데니스 리치
데니스 맥앨리스터 리치(Dennis MacAlistair Ritchie)는 1941년 9월 9일 뉴욕 브롱크스빌(Bronxville)에서 태어났습니다.
그는 1959년 뉴저지주 서밋 고등학교(Summit High School)를 졸업하고 하버드 대학교에 진학하여 1963년에 물리학 학사 학위를 받았습니다.
리치는 하버드 재학 중에 유니박 I(UNIVAC I) 프로그래밍 강좌를 듣고 컴퓨터에 대한 관심을 갖게 됩니다.
학사를 졸업한 후 리치는 하버드 대학교에서 응용 수학 석사 과정에 들어갑니다.
그의 주된 연구 과제는 컴퓨터 이론 및 활용에 대한 연구였습니다.
그는 1967년, 하버드 박사 과정 중에 아버지를 따라 벨 연구소에 합류하여 멀틱스 프로젝트와 GE 635용 BCPL 컴파일러 개발에 참여했습니다.
리치는 거의 박사 학위를 받을 수 있었습니다.
그의 지도교수가 그의 학위 논문을 승인했지만, 당시 졸업을 위한 조건인 논문 제본 제출을 끝내 하지 않았기 때문입니다.
데니스 리치는 그 당시 본인에 대해 스스로 이렇게 평가했습니다.
“나는 학부 시절 물리학자가 될 만큼 똑똑하지 않다는 것을 알게 되었다. 그리고 컴퓨터가 무척 멋지다는 사실도 알게 되었다. 대학원 시절에는 알고리즘 이론 전문가가 될 만큼 똑똑하지 않다는 것과 내 스스로 함수형 언어보다 절차적 언어를 좋아한다는 점도 알게 되었다.”
톰프슨은 리치에 대해 “매우 날카롭고, 수학적 역량이 나보다 훨씬 뛰어났다.
일단 아이디어를 잡으면 끝까지 몰고 가는 집중력이 있었다.”라고 평가했습니다.
커니핸은 리치에 대해 “그는 사교 모임보다는 일에 몰입하는 것을 더 좋아했으며, 함께 일하기 매우 좋은 사람이었다. 그는 유머 감각이 뛰어났으며 …… 매우 사적인 의견이지만 그는 친절하고 따뜻하며 재치 있는 사람이었다.”라고 평가했습니다.
브라이언 커니핸
브라이언 윌슨 커니핸(Brian Wilson Kernighan)은 1942년 캐나다 토론토에서 태어났습니다.
커니핸은 고교 수학 선생님의 추천으로 토론토 대학교의 공학 물리학(engineering physics) 과정에 진학했습니다.
커니핸이 처음 본 컴퓨터는 1963년의 IBM 7094였습니다.
당시 IBM 7094가 있던 큰 공조실에는 정장을 입은 사람으로 가득 차 있었고, 일반인(특히 학생들)은 그 근처에도 갈 수 없었습니다.
그는 1969년 벨 연구소에 정식으로 채용되어 일을 시작했으며, 멀틱스나 유닉스와는 관련 없는 여러 프로젝트에서 일을 시작했습니다.
하지만 톰프슨과 리치의 사무실이 근처에 있었고, 리처드 해밍(Richard Hamming) 또한 주변 사무실에 있었습니다.
해밍은 커니핸에게 글쓰기의 중요성과 문체(style)의 중요성을 깊이 인식시켜 준 인물이기도 합니다.
멀틱스
멀티플렉스 정보 및 컴퓨팅 서비스(Multiplexed Information and Computing Service, Multics)는 GE와 벨 연구소, MIT가 함께 개발한 2세대 타임셰어링 시스템입니다.
멀틱스는 MIT의 CTSS(Compatible Time-Sharing System)의 차세대 시스템으로 만들어졌습니다.
1959년 크리스토퍼 스트레이치(Christopher Strachey)는 그의 아이디어를 이용하여 “Time Sharing in Large Fast Computers(대형 고속 컴퓨터에서의 타임셰어링 기법)”라는 논문을 발표했습니다.
이 논문에서는 한 프로그래머가 자신의 단말기로 프로그램을 디버깅하는 동안 다른 프로그래머가 또 다른 단말기로 다른 프로그램을 실행할 수 있는 시스템을 제안했습니다.
1961년, 실험적 타임셰어링 시스템(experimental time-sharing system)이 가동되기 시작했습니다.
처음에는 IBM 709를 사용했으나 이후 7090으로 대체되었고, 이는 다시 7094로 대체되었습니다.
이 실험적인 시스템은 이후 CTSS로 발전했으며, 아마도 최초로 실제 운영된 타임셰어링 시스템이었을 것입니다.
그리고 CTSS는 1963년에 정식 서비스를 시작했습니다.
멀틱스의 초기 설계 작업은 1964년에 시작되었습니다.
GE는 IBM 7094보다 더 크고 성능이 뛰어난 컴퓨터를 제작하기로 했습니다.
벨 연구소와 MIT는 소프트웨어를 공동으로 개발했으며, MIT가 대부분의 설계를 담당하고 벨 연구소는 주로 소프트웨어를 구현하는 일을 맡았습니다.
멀틱스에 사용된 주요 언어는 PL/1입니다.
그러나 PL/1으로 컴파일러와 프로그램을 작성하는 일이 너무 어려웠기 때문에 마틴 리처즈(Martin Richards)는 데니스 리치의 도움을 받아 훨씬 더 단순한 언어인 BCPL(Basic Combined Programming Language)을 개발하게 되었습니다.
결국 1966년부터 1969년까지 3년에 걸친 작업 끝에 벨 연구소는 멀틱스 프로젝트에서 손을 떼기로 결정합니다.
PDP-7과 우주 여행
“유닉스는 나 자신을 위해 만들었다. 다른 사람들을 위해 만든 운영체제가 아니라, 단지 게임을 만들고 내게 필요한 일들을 하기 위해 만든 것이다.” - 켄 톰프슨
당시 연구소에는 1965년에 나온 잘 쓰이지 않던 PDP-7 소형 컴퓨터가 하나 있었습니다.
이 컴퓨터에는 DEC 340 벡터 그래픽 디스플레이가 장착되어 있었으며, 주로 회로 해석 시스템의 원격 작업 입력 단말기로 사용되었습니다.
엔지니어들은 라이트펜을 이용하여 디스플레이 위에 회로를 그린 후 이를 더 큰 컴퓨터로 전송해서 해석을 수행하고는 했습니다.
그래서 톰프슨과 리치는 PDP-7 어셈블리어로 직접 부동소수점 연산 루틴, 글꼴과 문자 표시 서브루틴, 디버거까지 만들어 내며 PDP-7에서 우주 여행 게임이 실행되게 만들었습니다.
톰프슨은 3D 우주 전쟁 게임도 만들었습니다.
DEC 340 디스플레이는 모니터에 후드(덮개)를 부착할 수 있었습니다.
톰프슨은 그 후드를 활용하여 사용자가 우주에서 서로를 공격할 때보다 현실감을 느낄 수 있도록 만들었습니다.
또 그는 연구소 곳곳에 있는 PDP-7 원격 장치 여러 대를 2000bps 모뎀으로 연결하여 2인용 우주 전투를 구현하기도 했습니다.
PDP-7은 18비트 워드를 사용했고, 기본으로 4K 코어 메모리를 탑재하고 있었습니다.
톰프슨과 리치가 사용한 기계에는 추가로 4K 메모리와 대형 디스크가 장착되어 있었습니다.
이 디스크는 크기가 매우 컸습니다.
디스크 외부 덮개의 높이는 약 6피트에 달했고, 플래터(platter)는 비행기 프로펠러처럼 수직으로 회전했습니다.
유닉스
왜 3주였을까요?
당시 그의 아내와 갓난아들이 캘리포니아에 있는 처가로 3주 동안 휴가를 떠나 있었기 때문입니다.
그에게 필요한 것은 텍스트 에디터, 어셈블러, 셸/커널 이렇게 세 가지 프로그램이었습니다.
그리고 그는 각각의 프로그램을 만드는 데 일주일씩 기간을 할당했습니다.
그렇게 3주 후 유닉스가 탄생합니다.
멀틱스 프로젝트의 파생물이자 디스크 스케줄링 문제와 3주간의 휴가가 낳은 결과물이었습니다.
PDP-7 위에서 실행된 이 단순하고 작은 유닉스 운영체제는 단지 ASR 33 텔레타이프 하나를 터미널로 두고도 왜인지 훨씬 더 편리했고, 무엇보다도 더 재미있게 사용할 수 있었습니다.
톰프슨은 scribble-text라 불리는 프로그램도 만들었으며, 이를 통해 DEC 340 디스플레이를 두 번째 단말기로 활용할 수 있게 만들었습니다.
덕분에 PDP-7은 동시에 사용자 두 명을 처리할 수 있었습니다.
톰프슨은 유닉스를 개발하던 시기를 회상하며 “나는 당시 정말 대단한 사람들을 만나기 시작했다.”라고 말했습니다.
그중에는 브라이언 커니핸, 데니스 리치, 더그 매킬로이(Doug Mcllroy), 로버트 모리스(Robert Morris)가 포함되어 있습니다.
PDP-11
PDP-11은 메모리가 바이트 단위를 기반으로 구성되어 있으며, 내부 아키텍처는 16비트 구조입니다.
즉, 바이트가 두 개 모여 하나의 워드를 이루고, 각 워드는 하위 바이트를 먼저 저장하는 리틀 엔디안(little-endian) 방식으로 저장됩니다.
조 오산나가 원시적인 텍스트 처리 및 조판 도구인 nroff를 만들었고, 이후에 troff까지 개발하면서 본격적인 작업이 시작되었습니다.
그리고 특허 부서는 유닉스 팀이 만든 시스템을 아주 만족해 했습니다.
특허 부서는 이 시스템에 너무 만족했기 때문에 유닉스 팀이 보다 마음껏 연구할 수 있도록 또 다른 PDP-11을 구입해 주었습니다.
커니핸은 당시 연구소의 예산에 대해 “그것은 아껴야 하는 돈이 아니라 일종의 소진해야 하는 할당액 같았다. 마치 모두의 이익을 위해 열심히 써야 되는 돈 같았다.”라고 말하기도 했습니다.
어느 날 톰프슨은 1964년에 더그 매킬로이가 쓴 논문에서 또 다른 아이디어를 얻었습니다.
매킬로이의 논문에는 프로그램들이 마치 정원의 호스처럼 서로 연결될 수 있어야 한다는 내용이 있었습니다.
그렇게 아이디어를 얻은 톰프슨은 불과 몇 시간 만에 유닉스 파이프(Unix pipes)를 구현합니다.
그는 본인이 구현한 파이프 기능에 대해 그저 ‘사소한(trivial)’ 변경이었다고 표현했습니다.
이후 톰프슨은 단 하룻밤 사이에 리치와 함께 기존 모든 유닉스 애플리케이션을 수정하여 불필요하게 장황했던 콘솔 메시지를 전부 제거하기도 했습니다.
stderr를 만들어 모든 오류 메시지가 stderr을 통해 출력되도록 만들었습니다.
결국 기존 유닉스 애플리케이션들은 전부 파이프로 연결되어 일종의 필터(filters)처럼 동작할 수 있게 되었습니다.
이처럼 파이프와 필터가 만들어지자 향후 유닉스 팀에 미친 영향은 그야말로 충격적(mind blowing)이었습니다.
톰프슨은 마치 수없는 아이디어가 폭발적으로 쏟아져 나오는 ‘광란(frenzy)의 현장’ 같았다고 당시를 회상하기도 했습니다.
C 언어
당시 톰프슨은 컴퓨터라면 반드시 포트란 언어를 쓸 수 있어야 한다고 생각했습니다.
그는 TMG를 이용하여 포트란을 작성했습니다.
그러나 그렇게 해서 만든 컴파일러는 용량이 너무 커서 PDP-7 유닉스의 사용자 할당 용량인 4K를 초과했습니다.
톰프슨은 일부 기능들을 하나씩 제거하고 다시 컴파일하는 작업을 반복하면서 결국 4K 용량에 맞는 컴파일러를 만들어 냅니다.
결과적으로 톰프슨이 만든 언어는 포트란과 그다지 비슷하지 않았습니다.
오히려 멀틱스 언어인 BCPL과 더 유사했습니다.
그래서 톰프슨은 그렇게 자신이 만든 새 언어를 B라고 이름 붙였습니다.
B는 인터프리터가 해석할 수 있는 P 코드라는 중간 코드를 생성했습니다.
이 때문에 언어 자체의 실행 속도는 느렸지만, 컴파일 과정은 훨씬 간단했습니다.
또 실행 파일을 메모리에 억지로 집어넣지 않고 파일에 저장해 둔 채 가상적인 방식으로 실행할 수 있다는 장점도 있었습니다.
톰프슨이 추가한 기능 중 하나는 스티븐 존슨(Stephen Johnson)이 제시한 기발한 아이디어인 ‘세미콜론’을 활용한 for 루프입니다.
바로 여기에서 C 언어의 for 루프가 탄생합니다.
그가 추가한 또 다른 기능은 우리가 C 언어에서 익숙하게 사용하고 있는 ++와 += 스타일의 연산자입니다.
당시 B 언어에는 명시적인 타입(type)이 없었습니다.
모든 것이 암묵적 타입의 워드(word)였고, PDP-7에서는 그 워드가 18비트 정수였습니다.
그러나 PDP-11은 바이트 기반의 컴퓨터였으며, 바이트는 제대로 된 연산을 수행하거나 포인터를 담기에 너무 작았습니다.
리치는 B 언어에 타입을 추가하기로 했습니다.
그가 처음 추가한 타입은 char와 int였으며, PDP-11용 기계어 코드를 생성하도록 B 컴파일러도 다시 작성했습니다.
그는 이 언어를 NB(New B)라고 불렀습니다.
이후 리치는 배열과 포인터 처리를 통합하고, int와 char 타입 체계를 확장하여 포인터를 가리키는 포인터까지 만듭니다.
그래서 char **p;는 char를 가리키는 포인터를 다시 가리키는 포인터를 선언하는 것이 되었고, char c = **p;처럼 이중 역참조를 통해 값을 가져올 수 있었습니다.
또 그는 #include와 #define을 제공하는 초기 버전의 전처리기도 추가했습니다.
그 당시는 1972년으로, 리치는 그 시점에서 자신들이 만든 언어가 새로운 이름을 가질 때가 되었다고 생각합니다.
그래서 그는 새 언어에 C라는 이름을 붙였습니다.
톰프슨은 유닉스를 C로 이식하는 작업을 세 번 시도했지만 모두 실패했습니다.
그는 실패의 원인이 언어 자체에 있다 주장했고, 이를 ‘보강’하기 위해 리치는 C에 다양한 조정과 기능을 추가하는 작업을 했습니다.
그리고 리치가 C에 struct를 추가한 이후 비로소 톰프슨이 유닉스를 성공적으로 이식할 수 있었습니다.
이에 대해 톰프슨은 이렇게 말했습니다.
“struct가 있기 이전에는 너무 복잡해서 도저히 코드 전체를 정리하고 관리할 수가 없었다.”
K와 R
당시 저는 어셈블리 언어에 완전히 편향되어 있었습니다.
고급 언어는 겁쟁이들이나 쓰는 것이라고 생각했죠.
뭔가 제대로 된 일을 해내고 싶은 진짜 프로그래머라면 어셈블러를 써야 한다고 굳게 믿고 있었습니다.
하지만 K와 R을 읽으면서 저는 한 가지 사실을 깨달았습니다.
사실상 C는 어셈블러였던 것입니다.
다만 보통의 어셈블러보다 더 나은 문법을 가지고 있었을 뿐입니다.
제가 있던 테라다인 센트럴(Teradyne Central) 전체가 소프트웨어 개발 언어를 C로 전환하게 되었습니다.
그렇게 K와 R이 쓴 그 책은 제 인생을 바꾸었고, 다른 수많은 소프트웨어 프로그래머의 삶도 바꾸었습니다.
팔을 비트는 ...
커니핸은 리치에게 같이 책을 내자고 설득했습니다.
리치는 처음에는 커니핸 제안이 별로 내키지 않았지만, 그의 끈질긴 설득(‘팔을 비트는’) 끝에 마침내 그의 제안을 수락합니다.
그렇게 커니핸은 C 언어 튜토리얼의 초고를 집필하게 되었고, 리치는 유닉스 시스템 호출과 관련된 챕터와 C 언어 참조 매뉴얼 부록을 작성했습니다.
커니핸은 리치의 작업에 대해 “정확하고, 우아하며, 간결하다.”라고 말했습니다.
여기에 더해 빌 플라우거(Bill Plauger)는 리치의 정밀함은 “등골이 오싹할 정도였다.”라고 말하기도 했습니다.
그렇게 두 저자는 함께 초고를 다듬어 나갔고, 그들의 책은 1978년 프렌티스 홀(Prentice Hall)에서 벨 연구소 저작권하에 출판되었습니다.
책 서문에 커니핸과 리치는 이렇게 썼습니다.
소프트웨어 도구
그 당시 저는 유닉스에 익숙하지 않았습니다.
물론 K와 R을 통해 이름 정도는 알고 있었지만, 정확히 어떤 개념을 가지고 어떻게 동작하는지는 알지 못했습니다.
그러나 책에서는 그 점을 분명히 짚어 주었습니다.
그 책에 따르면 유닉스적인 사고방식이란 소프트웨어를 단순하고 쉽고 활용하기 좋게 만드는 것입니다.
결론
그 누구도 톰프슨과 리치에게 유닉스와 C를 만들라고 시키지 않았습니다.
그들을 움직이게 만든 것은 열정과 호기심, 함께 성장한 개발자 커뮤니티입니다.
그들은 자유분방하게 스스로 탐험을 이어 가는 사람들이었고, 풍족한 자금과 느긋한 분위기가 깔린 환경 속에서 일했습니다.
무엇보다도 그들은 뛰어난 인재들이었습니다.
결국 그들은 이 세상을 바꾸어 놓았습니다.