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