1986년 10월 30일 스웨덴 왕립 기술원 강연문
Copyright (C) 1987 Richard M. Stallman
and Remseth
스웨덴 왕립 기술원 강연문
Kungliga Tekniska Hogskolan(Royal Institute of Technology)
Stcholm Sweden.
Arranged by the student society
“Datorforeningen Stacken”
30. Cotober 1986
Original Copy: RMS Lecture at KTH
Drafted version: Richard M. Stallman’s 18 Sep 1997 updated
Korean Translator: 1998 Ji Younju 지연주 jiyounju@nownuri.net
——————————————————————————–
[Note : 이것은 강연을 간략히 편집한 사본이다. 이것이 자연스런 구어체의 어법 뿐 아니라 시작 에 잘못이 있을 수도 있으나, 이상한 것은 프린트를 보길 바란다. 본래의 구사 법을 어기지 않고 정확한 문어체로 표현하는 방법은 분명하지 않다.]
타인이 내게 기대하는 이야깃거리는 3가지가 있는 것 같다. 첫 번째로, 여기 해커 클럽에서 최 고의 이야깃거리는 지난날에 MIT와 같은 곳에서 일어난 일일것이다. ‘인공지능 연구실’을 그렇게 특별한 장소로 만든 무엇에 대해서 말이다. 그러나 사람들은 나에게 이렇게 말해준다. 내가 세 가 지로 이야기해야하는 GNU 프로젝트의 진행 방향과 소프트웨어와 정보를 사유할 수 없는 이유에 대해 말하려고 했던 월요일과 화요일 회의에 있었던 이들이 다르고 이 두 문제는 각각 1시간이 걸릴 것이므로 우리는 약간 오랫동안 있어야 한다고 말이다. 그래서 나는 그것을 세 부분으로 나 누려 한다. 그러면 사람들은 자기가 흥미없어하는 부분에선 밖으로 나갈 수 있을 것이다. 그리고 내가 한 파트를 끝낼 무렵에 끝났다고 말하면 사람들은 나가도 좋다. 나는 또다른 사람들을 데려 오기 위해 Jan Rynning을 보낼 것이다. ( 누군가 이렇게 말할 것이다. “Janne, 그는 마이크가 필요하지 않을 거야.” ) Jan, 밖으로 나가서 사람들을 데려올 준비가 되어있나? Jmr : 난 마이크를 찾고 있어요. 그런데 그것이 잠긴 상자 안에 있다고 하더군요. Rms : 예전에 인공지능 연구실에서 큰 망치로 문을 부셔서 열었는데, 그 깨진 문은 필요로 하는 것을 감히 잠그려는 이들 누구에게나 교훈이 되었지. 그러나 다행히도 나는 불가리아 노래를 배운 적이 있어서 마이크 없이도 해 낼 수 있었다.
어쨌든, 내가 여러분에게 부분적으로 나누어 알려주는 방식으로 해도 계속 들어주시겠습니까? ( 대답 : 예! )
내가 프로그래밍을 시작한 것은 1969년, 뉴욕의 IBM 연구실에서 였다. 후에 내가 대부분 비슷 한 전산과에 갔다. 해야 할 일을 맡고 있는 교수님들과 누가 무엇을 사용할 수 있는지를 결정하 는 사람들이 있었다. 대부분의 사람에게는 터미널이 부족했으나, 많은 교수들은 그들 연구실에 자 기 터미널이 따로 있었다. 이는 낭비였으나 그들에게는 전형적이었다. 나는 MIT에 있는 인공지능 연구실에 갔을 때, 전혀 다른 뭔가 신선한 정신이 있음을 알았다. 예를 들면, 터미널이 모두들에 게 속한다는 생각이다. 교수들은 그들의 문이 부서질 수 있는 것을 감수하면서도 연구실을 잠갔 다. 나는 실제로 커다란 검은 철제 카트를 보았는데, 이는 교수들이 터미널을 잠갔을 때 교수 연 구실의 문을 따기 위해 사용한 것이다. 그 당시에는 터미널들이 거의 없었고 아마 시스템에는 5 종류의 터미널이 있었던 것 같다. 그래서 만약 그 중에 하나라도 잠기면, 꽤 큰 재난이 아닐 수 없었다.
나는 그 아이디어에 영감 받아서 자주 사람들이 필요로 하는 기계가 있는 방의 문을 열기 위해 천장을 오르거나 바닥을 기었다. 그리고 나는 사람들에게 이기적으로 문을 잠그지 말라는 메모를 남겨두곤 했다. 문을 잠근 사람들은 기본적으로 자신만을 위하는 이들이다. 그들에게는 물론 이유 가 있다. 도난당할수 있는 것이 몇 가지 있기 때문에 그것을 잠그려 하는 것이다. 그러나 이는 그 방에 다른 것들이 같이 있어 해를 입는 타인을 염려하지 않는 것이다. 이런 때에는 거의 매번, 방 이 잠겼는지에 여부가 그들의 책임이 아니라는 주의를 주어서 그들은 타협하여 해결책-그들이 걱 정하는 것들을 놓을 장소 즉, 잠글 수 있는 책상이나 작은 방-을 찾을 수 있었다. 요점은 사람들 이 보통 그런 것을 생각하는 것으로 고통받지 않는다는 것이다. 그들은 이런 생각을 가지고 있다. ” 이방은 내것이다. 나는 그것을 잠글 수 있다.” 이것은 우리가 그들에게 가지지 말도록 가르쳐야 하는 확실한 이유이다.
이러한 문을 잠그지 말아야 하는 정신은 단순히 여기서 그치는 것이 아니라, 전체적인 삶의 진 리가 된다. 인공지능 연구실의 해커들은 정말로 좋고 흥미 있는 프로그램을 쓰는데 열정적이다. 이는 그들이 더 많이 수행된 성과를 얻고자 하므로, 터미널을 잠그는 것이나 유용한 작업을 가로 막기 위해 행해지는 많은 것들을 그냥 두지 못하기 때문이다. 그것은 높은 도덕심으로 자신들이 노력하는 것을 정말로 염려하는 사람들과 단지 작업으로만 여기는 사람들과의 다른 점이다. 단지 직업으로만 여긴다면, 여러분을 고용한 사람이 너무나 어리석어서 여러분을 그저 앉아서 기다리 게 해도 그들의 시간과 돈을 아무도 염려하지 않는다. 여러분도 그곳에서는 많은 것을 얻을 수 없으며 또한 즐겁지 않을 것이다.
우리가 인공지능 연구실에서 가지지 않은 또 다른 것은 파일 보호이다. 컴퓨터에는 전혀 안전 장치가 없었다. 그래서 우리는 다음과 같은 경우에는 의식적으로 그것을 원했다. 비양립식 타임 셰어링 시스템(Imcompatible Timesharing System)을 쓴 해커들은 보통 자칭 시스템 운용자가 다 른 사람들처럼 전원을 회복하기 위해 파일 보호를 사용한다고 결정했다. 그들 중 아무도 이 방법 을 원하지 않았으므로 그들이 실행하지는 않았다. 파일 보호로 시스템에서 무언가가 깨질 때마다 여러분이 이를 맞추어야 한다. 해결책이 없으며 정확히 무엇이 잘못 되었는지 알지 못한다고 아 무도 여러분을 믿지 않으려 한다고 해서 여러분은 실망하여 앉아만 있을 필요는 없다. 여러분이 이것을 고치기 위해 누군가가 와서 하는 것 보다 10배를 알고 있다면, 여러분은 아침부터 와서 그 시스템을 고칠 누군가를 기다리다가 포기하여 집에 갈 필요가 없다.
그리고 우리는 어떤 교수님이나 상관들이 또 무슨 일을 해야할지에 대해 결정하도록 하지 않았 다. 왜냐하면 우리의 작업은 시스템을 향상시키는 것이기 때문이다! 우리는 물론 사용자에게 이야 기했다. 무엇을 필요로 하는지 말하지 않으면 할 수 없다고 말이다. 그 후에 우리는 어떤 종류의 향상이 가능한지를 볼 수 있게 된다. 그리고 우리는 변화된 시스템을 어떻게 보는가와 다른 시스 템에서 보고 가능하다고 여겨지는 산뜻한 아이디어가 무엇인지에 대해 항상 서로서로 이야기했 다. 우리는 순조로운 기능적 무정부를 가진 셈이다. 그리고 나의 그곳에서의 경험으로 그것이 사 람이 살아가는 가장 중요한 방법이라는 것을 알았다.
불행히도 그런 형태의 인공지능 연구실은 없어졌다. 수년 동안 우리는 인공지능 연구실이 MIT 의 다른 전산 연구실에 의해 없어지는 것을 두려워했다. 그곳의 책임자는 제국건설자 유형의 사 람이며 MIT에서 자신을 승진시키 위해 뭐든지 했다. 그리고 조직을 더 크게 만들었으며 인공지 능 연구실을 자기 연구실의 휘하에 두게 했다. 그는 사람들이 명령이나 혹은 명령과 유사한 것들 에 복종해야 한다고 믿었기 때문에 아무도 그의 방식으로 일을 하기를 원하지 않았다. 이는 우리 가 막아보려 노력했었다. 그러나 우리가 위험을 막아보려 했으나 전혀 예상치 못했던 상업주의에 의해 없어졌다. 80년대 초반 무렵, 해커들은 그들이 하고 있는 일에서 어떤 상업적 이익이 있다는 것을 갑자기 알았다. 개인 회사에서 일을 하면 부자가 되는 것이 가능했다. 막아보려는 나의 모든 노력과는 상관없이, 모든 필요한 일의 분담은 멈춰 버렸고 MIT인공지능 연구실은 파괴되었다.
기본적으로 인공지능 연구실의 나를 제외한 모든 유능한 프로그래머들은 멀리 고용되었고 이것 은 순간적인 변화 이상을 가져왔다. 더군다나 해커들의 문화의 연속성이 깨졌기 때문에 영구적인 변화를 야기하게 되었다. 새로운 해커들은 옛날 해커들로부터 항상 공격을 받았다. 옛날에는 가장 흥미로운 것을 한다는 사람들과 가장 재미있는 컴퓨터, 또한 분야별로 느꼈던 상당한 재미가 있 었다. 일단 이러한 것이 없어지고 나서는 어떤 새로운 것도 이곳에서 재개하지 않았으며 새로운 사람들도 오지 않았다. 영감 받을 수 있던 이가 아무도 없었고 예전 전통을 배우려는 이도 없었 다. 게다가 좋은 프로그램을 짤 수 있는 방법을 배우려는 이도 없었다. 프로그램을 작동시킬 수 없는 교수들과 대학원생들과는 좋은 프로그램 작업을 배울 수 없다. 그래서 내가 사랑하던 MIT 인공지능 연구실은 사라졌다. 그리고 그들을 추방하려던 사람들과 싸운지 20여년이 지난 후 나는 그 정신으로 새로운 사회를 창조하기 위해 나 자신을 바치기로 결심했다.
그러나 내가 직면한 첫 번째 문제는 독점 소프트웨어의 문제였다. 예를 들어 해커들이 떠나가 버린 후 연구실에서 일어난 일은 우리가 개발했던 기계와 소프트웨어가 더 이상 유지될 수 없게 된 것이다. 물론 소프트웨어는 작동했고, 아마 아무도 변화시키지 않았다면 그것은 계속 작동했을 것이다. 그러나 기계는 그러치 않았다. 기계는 파손되었고 그것을 수리할 사람은 아무도 없었다. 결국 그것들은 버려 졌다. 예전에 우리는 기계들의 서비스 계약이 있었으나 기본적으로 그것은 농담이었다. 이것은 인공지능 연구실의 전문 해커들이 각 파트의 문제를 해결하는 방법을 취했다. 만약 수리공에게 수리하게 한다면 며칠이 걸려 여러분은 이를 원치 않을 것이다. 그러므로 고칠 수 있는 이들은 그냥 가서 빨리 고치려고 한다. 그러면 그들은 다른 서비스 종사자보다 10배는 더 잘하기 때문에 아주 나은 직업을 가지고 있는 셈이 된다. 보드가 파손됐다면, 서비스 종사자 에게 새것으로 가져오라고 하면 될 것이다.
실제로 예전에 우리의 해커들은 또한 디지털로부터 온 기계를 수정하곤 했었다. 예를 들어 그 들은 PDP-10을 놓을 페이징 박스를 세웠다. 나는 최근에 여기 스톡홀름에서도 이 일을 하는 사 람들이 있다고 생각한다. 그러나 그 때에 이것은 약간 특별한 일이었다. 그리고 아주 오래 전인 1960년대 초반 사람들은 컴퓨터에 새로운 명령어와 새로운 가상 타임셰어링을 첨가하는 수정을 하곤 했다. 그래서 그 때에 70년대 중반으로 물러나게 된 MIT의 PDP-1은 60년대 초반에 넘겨진 것보다 2배의 기능성을 가지게 된 것이었다. 그리고 특별한 하드웨어 스케줄러는 내가 거의 알지 못하는 많은 것들과 특정한 타임셰어링을 위해 고안된 하드웨어를 개인적으로 나누어 보조 업무 와 메모리 맵핑의 특성이 있다. 또한 인덱스 레지스터와 간접적인 수신인 성명을 첨가시켜 약한 기계를 준합리적인 것으로 확장시켰다.
VLSI의 단점이라면 더이상 명령어를 첨가시키지 못하는 것이라고 본다.
PDP-1은 아주 약간의 명령어로 흥미로운 프로그램을 가능하게 한다는 흥미로운 특성을 가지고 있다. 이것이 가능한 다른 기계들은 거의 없다. 예를 들어 유명한 디스플레이는 큰 스퀘어를 작게 깨버려서 작은 스퀘어로 만들었다. 그것은 PDP-1에서 다섯 가지 명령어로 쓰여진 것이다. 그리고 많은 다른 훌륭한 디스플레이 프로그램도 거의 명령어를 쓰지 않고 쓰여진 것이다.
그것은 인공지능 연구실에서 행해진 것이다. 그러나 무정부주의 말고 해커들의 문화는 도대체 무엇인가. PDP-1시절에 적어도 오직 한사람만이 초창기에 기계를 사용할 수 있었다. 수년 후에 그들은 타임셰어링 시스템을 쓰고 많은 하드웨어를 첨가했다. 그러나 초창기에는 일정 기간 사용 해야 했다. 물론 지금 프로젝트 연구실에서 작업하는 교수들과 학생들은 항상 낮 동안에 들어온 다. 그래서 많은 시간이 필요한 사람들은 경쟁이 덜 심한 밤 시간을 이용한다. 이것은 해커들이 밤새간에 일하는 문화를 만들어 냈다. 타임셰어링이 있을 때 시간을 구하는 것은 여전히 쉽지만 밤이 사용자가 훨씬 적기 때문에 더 밤 시간을 이용하게 된다. 그러나 여러분 혼자만 있는 것도 아니고 해커도 약간 있기 때문에 문제가 발생하게 되었고 이것은 사회적인 현상으로 이어졌다. 여러분이 낮시간에 있게 되면 진정으로 기계에 관심없는 학생들과 교수들을 발견할 수 있을 것이 다. 반면, 여러분이 밤새 있게 되면 해커들을 발견할 수 있을 것이다. 그러므로 해커들은 밤새 이 용하는 문화를 만들었다. 그리고 그들은 새벽 3시에 중국음식을 먹는 것과 같은 다른 문화도 만 들었다. 나는 차이나타운에서 차에서 맞은 아침이 기억난다. 아침을 맞는다는 것은 고요하기에 더 욱 아름다운 일이었다. 잠자러 가는 것이 제일 기뻤다. 빛이 밝아오고 새가 지저귀는 때에 집으로 가는 것은 아주 좋았다. 여러분은 밤새 일을 한 후 고요하고 온후한 만족감을 진정으로 느낄 수 있을 것이다.
우리가 만든 또 다른 문화는 연구실을 자는 곳으로 만든 것이다. 내가 처음 거기 갔을 때부터 연구실에는 적어도 한 개의 침대가 있었다. 나는 아파트가 없었고 연구실에서 몇 달 동안 생활했 기 때문에 다른 사람보다는 더 연구실에서 지냈을 것이다. 나는 여름엔 시원하고 좋아서 그곳을 매우 편하게 생각했다. 사람들이 그들의 열정으로 연구실에서 자는 것은 이상한 일이 아니다. 해 킹할 때까지 멈추지 않고 거기에 있을 것이다. 완전히 다 해냈을 때에 비로소 가까이 있는 수평 면에 올라 탁 트인 공기를 맞을 것이다.
그러나 해커들이 모두 연구실에 남아 있는 것은 인구 통계학적 변화를 가져왔다. 기계에 진정 으로 관심이 없는 학생들과 교수들은 다수이므로 수적으로 더 우세하지만 그들은 두려워한다. 해 커들 없이 시스템을 유지해야 할 때 그들은 이렇게 말한다. “우리는 재난이 있다. 우리는 상업적 소프트웨어를 가져야 한다.”, “우리는 그것을 유지하기 위해 회사를 만들어야 한다.” 그들이 완전 히 잘못됐다는 것은 증명이 되었지만, 이미 엎질러진 물이었다.
새로운 KL-10이 출현했을 때 의문은 그것이 양립할 수 없는 타임셰어링 시스템이나 디지탈 Twenex 시스템을 운용할 수 있는 가였다. 일단 ITS를 작동시킬 수 있는 해커들이 가버려서 학 구적인 타입의 사람들은 상업적 소프트웨어를 작동시키는 것으로 선택하고 이는 즉시 여러 파급 효과를 가지게 되었다. 이중 일부는 바로 일어나지는 않았지만, 몇몇 사람은 이러한 효과를 알았 다.
하나는 그 소프트웨어가 허술하게 쓰여져서 훨씬 이해하기 힘든 것이다. 그래서 사람들이 실 제로 필요한 전환이 어렵게 되었다. 또 다른 하나는 소프트웨어 안전 장치의 출현으로 사람들이 타인들과는 확실히 덜 협조하게 되었다는 점이다. 예전 ITS 시절에 우리는 합리성을 가지고 누구 나 어떤 파일을 바꾸고 전환하는 것이 바람직하다고 여겼다. 나는 누군가 맥시마(Macsyma)를 사 용하는데 도움을 요청했던 흥미로웠던 사건을 기억한다. 맥시마는 MIT에서 발달시킨 기호 대수 프로그램이다. 그는 도움 요청을 처리하는 사람에게 요청하여 그로부터 한 시간도 안 되어서 대 답을 얻어냈다. 그는 두려워했고 메시지를 보냈다. “계속해서 여러분의 메일을 읽어야합니까. 그 메일 파일이 여러분의 시스템에 없을 수 있지 않습니까?” “물론 아무 파일도 우리 시스템에서 보 호받지 못합니다. 문제가 뭔가요? 대답은 곧 들을 수 있습니다. 왜 불행합니까? 물론 우리는 각각 다른 사람들의 메일을 읽고 여러분 같은 사람들을 만나 도움을 줍니다.” 사람들은 자신이 언제 잘 되는지 알지는 못한다.
그러나 물론 Twenex는 안전장치가 켜지는 디폴트를 가지고 있을 뿐 아니라 안전 장치를 사용 할 수 있다는 가정 하에 설계되었다. 손해를 쉽게 일으키는 것이 많은 사고로부터 여러분을 막아 주는 것은 안전 장치이다. ITS에서 우리는 우연하게 이런 사고를 발견해 낙담했었다. 그러나 Twenex에서는 효과가 엄격한 안전 장치에 의해 유지되고 관리자만이 이것을 켤 수 있다고 되어 있어서 해결되었다. 그것에는 사고로 인해 하는 일을 어렵게 만드는 다른 장치가 없었다. 이 결과 는 Twenex에서 안전장치로는 정말로 가지고 싶은 것을 가질 수 없었다. 다른 장치를 놓는 해커 들이 더 이상 없어서 사람들은 안전 장치의 사용을 강요받게 되었다. 6달 동안 그 기계는 그것들 이 시작한 곳에서 대히트를 거두게 되었다. 연구실에서 일하는 누구나 모든 안전 측정을 무시한 힘을 주는 회전 비트를 가지게 될 것이라는 가정을 처음으로 가지게 되었다. 그러나 어느 날 오 후에 와서보면 모든 것들에 대한 회전비트가 꺼져 있는 것을 발견하게 될 것이다.
내가 그것을 발견했을 때 나는 그것을 타도했다. 처음엔 나는 엘리트에 속하는 사람들 중 한 사람의 패스워드를 알게 되었다. 나는 다시 모든 것들을 켤 수 있었다. 그 다음엔 그는 그의 패스 워드를 바꾸고 그의 마음을 변화시켜 지금은 배타적인 그룹에 속해있다. 그래서 나는 기계를 가 져와서 타임셰어링이 안되는 DDT를 뒤졌다. 나는 잠시 모니터를 여기저기 뒤지고 그 자체에 담 는 방법을 명백히 알아내었다. 나는 그것을 일시 가두어 패스워드 체크를 끄게 하고 사람들의 회 전 비트가 있는 데로 돌아가서 시스템 메시지를 띄웠다. 나는 OZ라고 불리는 기계를 설명해야 해 서 시스템 메시지의 말을 띄웠다. “힘을 압류할 시도가 있습니다. 그래서 배타적인 힘을 패배시켰 습니다. -Radio Free OZ” 나중에 나는 “Radio Free OZ”가 Firesign Theater에 의해 사용된 것 중 하나라는 것을 알아냈다. 나는 그때에는 그것을 몰랐다.
그러나 그것은 점차적으로 악화되어 사람들이 시스템의 안전장치를 더욱 요구하게 만든 셈이 되었다. 결국 내가 비밀로 된 패스워드를 가지는 것을 거절했기 때문에 기계의 사용을 중지하게 되었다. 처음 MIT 인공지능 연구실에 패스워드가 나타나게 된 이래로 나는 패스워드가 없어져야 한다는 나의 신념을 세우고 따르기 위해서 가능한 명백한 패스워드를 항상 가져야 함을 확신하고 모든 이에게 그것이 무엇인지 말해줘야 한다는 결론에 이르게 되었다. 나는 컴퓨터에 안전장치를 갖는 것이 정말로 바람직하다고 보지 않기 때문에 안전 제도를 후원하는 것을 기꺼이 받아들이지 않았다. 그것을 허용하는 시스템에서는 나는 “빈 패스워드”를 사용하고, 허용되지 않거나 그렇게 다른 장소로부터 전혀 로그 인을 하지 못하는 시스템에서는 나의 패스워드로 로그 인을 한다. 그 것은 여러분들이 얻을 수 있는 만큼 명백하다. 사람들이 나처럼 로그 인하는 방법을 지적할 때 나는 이렇게 말한다. “그래요. 그건 누구나 이 기계에서 어떤 데이터를 구하는데 필요있는 아이디 어입니다. 나는 그들이 안전장치에 굽히지 않길 확신하고 싶습니다.”
그리고 내가 항상 하는 또 다른 것은 모든 보호에도 나의 디렉토리와 파일을 여는 것이다. 왜 냐하면 때때로 거기에 유용한 프로그램에 결합이 있다면 사람들이 그것을 고칠 수 있기 때문이 다.
그러나 그 기계는 “관광사업”이라고 불릴 정도의 현상을 내도록 구성되지 않았다. 지금 무정부 주의의 다른 형태로 병행해온 “관광사업”은 인공지능 연구실에서는 아주 오랜 전통이고 아웃사이 더들에게 기계를 사용하도록 하는 것이었다. 누구나 그 기계로 와서 어떤 것으로든지 로그 인을 하는 것이 자동이었다는 데에 기뻐했다. 여러분이 온다면 여러분은 로그 인하고 작업할 수 있을 것이다. 나중에 Arpanet이 시작되고 사람들이 전 지역으로부터 우리 기계에 연결하기 시작했을 때 특별하게 받아들여진 전통으로 우리는 이것을 약간 공식화했다. 우리가 이 사람들이 프로그램 을 배워서 오퍼레이팅 시스템을 변화시키기를 바랬다. 아무 곳에서나 이 말을 한다면 시스템 운 영자는 두려워할 것이다. 어떤 아웃사이더가 그 기계를 사용한다는 것을 제안하면 그는 이렇게 말할 것이다. “그러나 그가 시작하면 우리의 시스템 프로그램에서 무엇이 바뀌나?” 그러나 우리 에게는 아웃사이더가 시스템 프로그램을 변화시키는 것으로 사회에 공헌하는 진정한 재미를 맛본 다고 본다. 우리는 그들이 이렇게 하는 것에 항상 용기를 가진다. 물론 새로운 작은 시스템 유틸 리티를 쓰는 것이므로 우리는 그들이 하는 것을 간과하고 잘못 볼 수 있다. 그러나 그것들은 그 특성이 첨가되어서 큰 유틸리티로 바꾸어 진다. 그리고 이것은 숙련자가 새로운 특성을 조금씩 첨가하면서 늘어나게 되어 10년 내지 15년 동안 존재한 프로그램이다.
프랑스의 도시와 같은 곳에서 여러분은 늘어나게 된 지극히 오랜 건물들로 100여년이 지난 후 에도 지금과 같은 길이 만들어졌다는 것을 볼 수 있다. 컴퓨터 분야에서는 1965년에 시작한 프로 그램이 기본적으로 그것과 같다. 그래서 우리는 항상 관광자들이 시스템 유지자가 되도록 고용되 어서 시스템 프로그램을 작업해 좋은 성과를 얻도록 해 둘 것을 바란다.
그러나 ITS기계는 손에서 벗어나 이것을 방지하도록 하는 다른 특성을 가진다. 이중 하나는 “스파이”특성인데 이것은 누구나 누군가가 했던 작업을 볼 수 있다는 것이다. 물론 관광자들은 여 러분이 못된 짓이라고 여기는 스파이짓을 사랑하고 좋은 것이라고 여긴다. 그러나 만약 문제이 일으킬 만한 것을 시작되면 항상 그 괸굉자를 지켜보는 누군가가 있게된 다는 결과를 가져왔다. 곧 그 친구들은 관광 사업의 계속적인 유지가 책임 있는 관광자에게 달려있다는 것을 알고 있기 때문에 매우 화를 내게 될 것이다. 우리는 그 작자가 누구인지 아는 사람을 떠나게 할 수 있었다. 그리고 만약 우리가 그렇게 할 수 없다면, 우리는 완전하게 확실한 곳에서부터 잠시 접근을 끊었 다. 다시 돌아갔을 때 그는 우리를 잊을 정도로 멀리 가버렸을 것이다. 그러면 오랫동안 아주 가 버리게 되는 것이다.
그러나 Twenex시스템은 이런 것을 위해 고안된 것이 아니다. 결국 그들은 모두가 다 아는 나 의 패스워드로 견디지 못했다. 항상 관광자들이 두 세 차례씩 나처럼 로그 인하기 때문에 그들은 내 계좌의 액수를 초과하게 만들었다. 그 때에 나는 거의 다른 기계에서 일을 하고 있었기 때문 에 결국 다시 그것을 켜는 것을 포기하고 그만 두었다. 그게 그거다. 나는 내 자신의 것으로 그 기계에 로그 인하지 못했다. (이 점에서 RMS는 우레와 같은 갈채를 못 받았다. )
그러나 그들은 처음 Twenex시스템을 취했을 때 만들기를 원하는 것에 마음의 많은 변화를 가 졌다. 안전 장치는 변했다. 그들은 또한 ARPA네트워크와 MIT카오스 네트워크의 기계를 가지길 원했으나, 그들은 이것을 다루기가 불가능했고 그런 변화를 만드는 참신한 유능한 인물이 없었다. 인재가 더 이상 없었기에 변화시키기는 것은 힘들었다. 그 시스템은 허술하게 쓰여졌기 때문에 더욱 이해하기 힘들었고 디지털은 이러한 것을 할 수 없었기 때문에, 상업적 시스템이 기본적으 로 그 자체로 유지한다는 생각은 잘못이었다. 그들은 시스템 해커들을 많이 필요로 했지만 더 이 상 시스템 해커를 꾀어내지는 않았다. 그리고 최근에 MIT에는 Twenex에서 보다 ITS에서 해킹 하는 것에 흥미로운 사람들이 더 많다.
이것을 하는 마지막 이유는 Twenex는 공유될 수 없기 때문이다. Twenex는 독점 프로그램이 다. 만약 여러분이 더러운 방식으로 그들에게 비밀을 지켜주면 여러분은 자원을 갖기에만 급급한 것이고 그들에게는 나쁜 맛을 주는 것이다. 사람이 알아챈다면말이다. (어떤 컴퓨터에 종사하는 이들은 그들이 재미있어하는 일은 무엇이나 하면서 그들이 도대체 누구와 같이 일을 하는지를 잠 시도 생각하지 않는다. 그러나 여러분은 그렇게 프로그램 작업을 하는 것이 얼마나 나쁜 일인지 를 알아낼 것이다. 그것은 더욱 실망시킬 것이다. ) 그것이 충분치 않다면 그들은 매년 여러분에 게 장난으로 쓰여진 50000의 추가 라인 코드를 새롭게 양도할 것이다. 왜냐하면 그들은 “수백만 의 장난스런 타이핑으로 결국 유용한 시스템 개발을 따라 잡는다”는 것을 믿기 때문이다.
이런 독점 시스템으로 일어난 일로 인해 나에게 명백해 진 것은 예전 인공지능 연구실의 정신 을 갖는 유일한 방법이 무료 오퍼레이팅 시스템은 갖는다는 것이다. 누구나 공유할 수 있는 무료 소프트웨어를 구성하는 것이다. 그래서 우리는 이것을 발달시키기 위해 모두를 불러 같이 작업했 다. 그것이 GNU프로젝트를 이끄는 것이다. 이제 두 번째 파트로 넘어가 보자.
3년 반전에 나는 무료 소프트웨어 시스템을 시작했다. 나는 개발 가능한 두 가지 시스템을 볼 수 있었다. 하나는 LISP기계 시스템이다. 그것은 특별한 LISP기계가 아니라 일반적인 목적의 하 드웨어로 쓰일 무료인 것을 제외하고는 막 발전된 MIT LISP기계 시스템이다. 그리고 다른 하나 는 더 양식화된 오퍼레이팅 시스템이다. 내가 양식화된 오퍼레이팅 시스템을 만든다면 그것은 UNIX와 양립할 수 있을 것이다. 왜냐하면 그것은 모든 사람들이 쉽게 다가갈 수 있는 것이기 때 문이다. 얼마 후에 나는 후자를 이룰 수 있다고 결론지었다. 이유는 여러분이 일반적인 목적으로 LISP기계 시스템과 같은 하드웨어를 실제로 가지고 있지 않기 때문이다. LISP기계 시스템은 훌 륭한 실행 속도와 확실한 에러 발견을 얻기 위해 특별한 하드웨어와 특별하게 쓰기 가능한 마이 크로코드를 사용한다. 보통 하드웨어로 LISP시스템이 충분한 속도를 내기 위해 여러분은 가정을 해야 한다. 확실한 독립변수는 올바른 유형이다라는 가정이다. 그렇지 않을 경우에는 시스템이 곧 장 파괴된다.
물론 여러분은 확실하게 체크를 할 것이고 원한다면 확고한 프로그램을 쓸 수 있을 것이다. 그 러나 사실 여러분이 그것을 체크하지 않은 것을 놓치지 않았다면 잘못된 유형의 독립변수 함수를 부여했을 때, 에러를 알리는 기억장치 같은 것을 볼 수 있다.
그러면 결과는 여러분이 이런 에러들을 잡기 위해 LISP시스템 아래서 운용될 것이 필요하게 될 것이다. 사용자에게 계속 운용할 능력을 주게 되고 그것에 일어난 잘못을 고치게 될 것이다. 결국 나는 낮은 수준에서 오퍼레이팅 시스템을 가지는 것보다 훌륭한 오퍼레이팅 시스템을 만드는 것 이 더 낫다는 결론을 지었다.-그것은 오퍼레이팀 시스템과 LISP사이에 선택, 혹은 단지 오퍼레이 팅 시스템을 취하게 되는 것이다. 그래서 나는 처음에 오퍼레이팅 시스템을 하기로 하고 UNIX와 양립할 수 있도록 했다. 마침내 내가 이 시스템에 가장 놀라운 언어인 영어로 이름을 썼다는 것 을 알았을 때 내가 한 선택을 확신했다. GNU란 말은 “Gnu’s Not Unix”를 뜻했다. 회생된 두 문 자 어는 MIT의 해커 사회에선 아주 오래된 전통이다. 그것은 TINT라 불린 편집장으로 시작되었 다. 뜻하는 말은 “Tint Is Not Teco.”이다. 나중엔 이런 말이 쓰였다. “SINE”은 “SINE Is Not Emacs”, FINE은 “Fine Is Not Emacs.” EINE은 “Eine Is Not Emacs.”, ZWEI는 “Zwei Was Eine Initially.” 그리고 결국 지금은 GNU를 쓴다. 나는 약 2년반 전에 GNU 일을 하기 시작한 이후로 작업의 반 이상은 했다. 내가 프로젝트를 작업하려고 준비할 때 처음 내가 이미 유용하게 무료로 찾은 것을 둘러보기 시작했다. 나는 “무 료 대학 컴파일러 장비”라 불리는 흥미로운 휴대용 컴파일러 시스템을 발견했다. 나는 그렇게 이 름을 붙인 것으로 그것을 가질 수 있었다. 그래서 나는 그것을 개발한 사람에게 GNU프로젝트에 그것을 줄 수 있는지를 묻는 메시지를 보냈는데 답이 왔다. “안된다. 대학은 무료일지 모르나 그 들이 발달시킨 소프트웨어는 그렇지 않다.” 그러나 그는 역시 양립할 수 있는 UNIX시스템을 원 하고 그것의 핵심부분을 쓰기를 원한다고 말하고 나서 왜 나보고 그 후에 유틸리티를 쓰지 않았 냐고 물었다. 그들은 그의 독점적 컴파일러를 사람들이 살 수 있도록 분포했다. 그리고 나는 이것 이 야비하다는 생각이 들어서 그에게 나의 첫 번째 프로젝트는 컴파일러라고 말했다.
나는 그 때 최적화 컴파일러에 대해 작업한 적이 없었으므로 정말로 몰랐다. 그러나 나는 그때 에 무료라고 하는 컴파일러를 얻었다. 그것은 파스텔(PASTEL)이라 불린 컴파일러인데 본인은 “훌륭하지 않은 파스텔 “이라는 뜻을 지닌다고 본다.
파스텔은 매개변수적인 유형과 명백한 유형의 모수와 같은 특성과 많은 복잡한 것들을 포함한 아주 복잡한 언어이다. 물론 컴파일러는 이 언어로 쓰였고 이러한 것들의 사용을 최적화시키는 많은 복잡한 특성을 가진다. 예를 들어 이 언어에서 “문자열”타입은 매개변수적인 유형이다. 여러 분이 어떤 특정한 길이의 문자열을 원한다면 “string(n)”이라고 말할 수 있다. 그리고 모수는 문 맥에 의해 결정된다. 문자열는 매우 중요해서 그것을 사용할 많은 명령어들이 빨리 작동하는 것 은 필요하다. 이것은 그런 것들을 발견할 특성들이 많아야 한다는 것을 뜻한다. 설정된 문자열의 길이가 함수로 영구적으로 되는 독립 변수일 때, 그들이 만들어내는 코드의 최적화 값을 구하는 것과 같은 것 말이다. 그러나 나는 자동으로 레지즈터를 배분하는 방법을 이 컴파일러에서 알아 냈다. 작동시키는 방법은 기계마다 다르다.
자, 이 컴파일러을 파스텔로 컴파일한 이래로 내가 필요로 하는 방법은 내가 했던 C언어로 초 기 목적을 채우고, 나의 첫 번째 기계로 기대되던 68000을 후기 목적을 채웠다. 그러나 나는 심각 한 문제에 빠졌다. 왜냐하면 PASTEL언어는 여러분이 전에 설정했던 것으로 정의되지 않았기 때 문에 설정과 사용은 어떤 명령 안에 있었다. 즉, 파스칼의 “전의” 설정은 전체적인 프로그램을 읽 고 중심에 있어서 한 번만 처리하기 때문에 쓸모가 없었다. 그리고 그것은 중심에 있어서 한 번 만 처리한다. 결과는 컴파일러에 중간저장이 필요하게 되었다. 필요한 메모리 용량은 여러분의 파 일 크기에 비례했다. 또한 이것은 많은 공간을 차지하기 때문에 여러분은 아주 많은 공간이 필요 했을 것이다. 결과로 나에게 유용했던 68000시스템이 컴파일러에 맞지 않는다는 것을 알았다. 일 시적인 기억 장치에 16K의 단어 분량으로 제한을 두는 것은 UNIX에서는 끔찍한 버전이기 때문 에 6메가 바이트가 있어도 단지 16K의 단어 분량을 가질 수 있었다. 물론 일시적인 충돌을 일으 키거나 같은 때에 다른 것이 있는 행렬 충돌울 막기 위해서 2차식의 행렬이 필요했고 수백 수천 바이트를 가진 큰 함수가 있어야 했다. 그래서 나는 10의 첫 번째 패스나 컴파일러의 그런 패스 들을 디버그하고 기계를 크로스 컴파일하고 나서 두 번째 것은 전혀 운용되지 않는다는 것을 알 아냈다.
내가 이 문제에 대해 무엇을 할지에 대해 생각하고 그것을 고칠지 새로운 컴파일러를 쓸지를 고심하는 동안에 주위의 분위기로 GNU Emacs를 작업하기 시작했다. GNU Emacs는 GNU시스 템의 주요 공헌 부분이다. 그것은 확장된 언어로서의 LISP의 사용은 제외하더라도 내가 10년 전 에 발달시킨 오리 지날 emacs처럼 확장시킬 수 있었던 텍스트 에디터이다. 에디터는 그 자체로 LISP해독기로서 C언어로 실행될 수 있다. LISP해독기는 완전히 휴대 가능하기 때문에 에디터 외 부에 LISP시스템이 필요하지 않다. 에디터는 그 자체에 LISP시스템을 포함하고 있고 모든 명령 이 LISP로 써지므로 여러분에게 여러분 고유의 에디터 명령을 쓰는 방법을 보여주는 예를 제공 할 수 있다. 여러분은 정말로 원하는 에디터 명령으로 그것들을 바꿀 수 있다.
2년 전 그해 여름, 내 친구 한 명은 Gosling Emacs를 일찍이 연구했기 때문에 그의 버전을 분 포하라는 메시지를 Gosling으로부터 허가를 받았다고 나에게 얘기해 주었다. Gosling은 원래 그 의 Emacs 를 세우고 나서 무료로 퍼지도록 하여 사람들이 그것을 발달시킬 수 있도록 한 것이 다. 그것의 바탕은 오리지널 Emacs의 시작과 같은 정신을 따르는 그 자체의 매뉴얼로 Gosling 자체의 언어에 있다. 그리고 나서 그는 그것을 복사하여 사람들의 뒤에서 섞어 놓아 사람들이 그 것을 재구분할 수 없게 만들어 그것을 소프트웨어하우스에서 팔게 했다. 내가 그를 나중에 개인 적으로 대하는 것은 그가 여러분이 그 역사에 대해 기대하는 만큼 얼마나 비열하고 야비한지를 보여주기 위함이다.
그러나 어떤 경우에서든 나의 친구는 나에게 이 프로그램을 주었고 나는 내가 사용했던 오리지 널 Emacs와 그 프로그램이 양립할 수 없을 정도의 높은 수준으로 에디터 명령을 바꾸도록 했다. 수적인 독립 변수를 모두 묶어 쓸 수 있도록 하기 위해 그들은 내가 원하던 모든 특성들을 가지 고 쓸 수 있어야 한다고 기대했다. 그러나 얼마 후에 나는 MOCKLISP라 불리는 그 에디터의 확 장 언어는 임무에 충분치 않다는 것을 발견하였다. 나는 계획했던 것을 하기 위해 즉시 그것을 대체해야 한다고 깨달았다. 실제로 LISP를 MOCKLISP로 대체하는 생각을 하기 전에 내가 알아 낸 것은 그것이 처음으로 행해진 것이라는 것이다. MOCKLISP가 MOCK이라 불린 까닭은 그것 이 데이터 타입의 구조가 아니기 때문이다. 그것은 어떤 종류의 정렬도 갖고 있지 않다. 그것은 LISP기호를 갖고 있지 않으며 이름으로 된 대상이다. 어떤 특정의 이름으로 하나의 대상이 있는 데, 여러분은 그 이름으로 타이프를 치면 항상 그것으로 받을 수 있다. 그리고 이것은 많은 프로 그램을 쓰는 것을 방해하기 때문에, 실제로는 그 방법으로는 할 수 없는 복잡한 문자열 조작을 해야 일을 처리할 수 있을 것이다.
그래서 나는 LISP해독기를 써서 MOCKLISP에다가 놓았으며 그 과정에서 나는 에디터의 내부 데이터 구조가 LISP대상으로 되길 원하기 때문에 그 구조를 다시 써야한다는 것을 알았다. 나는 LISP와 에디터 사이에 조화가 이루어지길 바란다. 그것은 에디터 버퍼, 서브 프로세서, 윈도 우와 버퍼 포지션과 같은 대상들이 모두 LISP대상이 되어야한다는 것을 뜻한다. 그래서 에디터들을 LISP데이터와 LISP기능이 하라는 데로 잘 처리되도록 초기화시켰다. 이것은 내가 모든 대상들의 데이터 포맷을 재구성하고 작업하던 모든 함수을 다시 써야한다는 것을 의미했다. 그리고 6개월 후 에디터 모두를 다시 쓰는 결과가 되었다.
게다가 MOCKLISP로 쓰는 것은 아주 어려운 일이고 불명료했다. 다시 씀으로 인해 LISP의 힘 이 실제로 커지는 것을 보기 위해서 나는 그것들을 더 파워 있고 간단하며 훨씬 빠르게 만들었 다. 그것을 하고난 결과 내가 이 프로그램을 분포하기 시작했을 때 내가 받은 것중에서는 약간만 남았다.
이쯤에서 그는 Gosling이 생각나는 회사에 그것을 분포한 나의 친구의 권리에 도전하는 프로그 램을 팔았다. 메시지는 백업 테이프여서 그는 그것을 찾을 수 없었다. 그리고 Gosling은 그에게 허용을 해주지 않았다. 그리고 나서 이상한 일이 일어났다. 그는 이 회사와 협상하여 회사가 그들 이 분포했던 것과 닮은 것이 분포되는 것은 아무런 관련이 없이 보였다. 그는 여전히 분포했고 그가 일하는 Megatest회사도 그의 것과 같은 것을 분포했다. 그것은 정말로 Gosling Emacs엔 오 래된 버전이었다. 그래서 그는 그들과 그것을 분포하는 것을 그만두고 GNU Emacs의 사용하기 시작했다. 그들은 그가 결국은 허용을 받았다고 생각하게 되었다. 갑자기 모든 이들이 행복해 졌 다. 그리고, 회사는 다양한 보조품을 팔았지만 무료로 GNU Emacs를 분포하는 일을 하도록 나를 고용하기를 원한다고 했다. 그래서 그들에게는 내가 마음을 바꿔 그렇게 할 수 없다고 하는 것이 이상한 일이었다. 나는 프로그램을 분포할 수 없다는 메시지를 네트워크에 보냈다. 그들은 어떤 것도 할 수 없고 언제 무슨 일을 하는 것조차 확실하지 않다고 말했다. 그리고 이것은 누구도 그 것을 사용하지 못하게 될 슬픈 일이 일어나 사람들을 놀라게 할 정도였다.
(때때로 나는 내가 살면서 할 수 있는 가장 중요한 것에 대해 생각한다. 비밀로 되어있는 독점 소프트웨어의 거대한 파일을 찾아 거리에 복사본를 뿌리기 시작한다. 그러면 더 이상 그것은 비 밀이 되지 않는다. 아마 내 자신이 새로운 소프트웨어를 쓰는 것보다 그것을 사람들에게 주는 것 이 훨씬 효과적일 것이다. 그러나 아무도 너무 겁이나서 그렇게 하지 않는다. )
그래서 나는 남아 있는 나머지 분은 다시 쓰도록 강요받았고 일주일 반정도 걸려 그것을 했다. 그들은 대단한 승리를 했고 나는 그 후론 그들과 함께 일하지 않았다.
GNU가 약 일년 반 걸려 안정하게 되었을 때 나는 시스템의 다른 부분을 다시 시작했다. 나는 C코드를 기호적으로 디버거하는 GDB라 불린 디버그를 개발했다. 그것은 최근에 분포되었다. 지 금 이 디버그는 버클리 UNIX에 디버그로 있는 DBX의 정신으로 확장된 것이다. 명령어는 독립 변수를 따라 여러분이 원했던 것으로 말하는 언어로 구성되어 있다. 이 디버그의 명령어는 모두 약자화 할 수 있고 보통 명령어는 간단한 문자 약자나 어떤 독특한 약자를 쓸 수 있다. 확장 가 능한 HELP장치가 있다. 여러분은 어떤 명령어나 서브명령어로 HELP 형식을 따라서 그 명령어 의 사용법을 길게 묘사할 수 있다. 물론 C로 표현할 수도 있으며 그 값을 프린트할 수 있다.
여러분은 또한 C디버그를 사용하지 않고 일을 처리할 수 있다. 예를 들어 여러분은 어떤 기억 장치에서 값을 구하기 위해서나 할당하기 위해 C데이터 타입에 맡길 수 있다. 만약 어떤 기억장 치의 어드레스에 떠도는 값을 저장하기를 원한다면 여러분은 이렇게 말할 수 있을 것이다. “나에 게 이 어드레스에 맞는 FLOAT나 DOUBLE유형의 대상을 주시오” 그리고 그것을 할당할 것이다. 여러분이 또 할 수 있는 것은 예전에 테스트되었던 모든 값을 구하는 것이다. 시험된 모든 값은 “값 역사”에 놓이게 된다. 여러분은 그것의 수적인 자리에 의해 역사의 요소에 맡길 수 있거나 쉽 게 달러 사인으로 마지막 요소에 맡길 수 있다. 이것은 리스트 구조를 남기는 것을 훨씬 쉽게 만 든다. 여러분이 다른 것에 초점을 맞추는 C언어 구조를 가지고 있다면 다음과 같이 할 것이다. “PRINT *$.next”가 의미하는 것은 “나에게 보여줄 지난 것은 가져가고 다음 분야를 가져와 지적 하는 구조에 디스플레이 하라.”이다. 여러분이 명령을 계속 반복하면 매 때마다 리스트에 다음 구 조가 보일 것이다. 반면 다른 C디버그에서 하는 유일한 방법은 매 때마다 긴 명령을 타이프 하는 것이다. 다루었던 지난 명령을 반복하는 커리지리턴을 타이프 하여 특성들을 모으면 아주 편리하 다. 여러분이 원하는 리스트에 각 요소를 커리지리턴으로 타이프해라.
디버그에는 또한 명확하게 놓을 수 있는 변수들이 있다. 여러분은 이름을 달러 사인으로 할 수 있으며 그것은 변수이다. 여러분은 C데이터타입의 변수 값을 할당할 수 있고 나중에 이것들을 시 험할 수 있다. 그 중에는 사용할 만 한 것들이 있다. 여러분이 시험해 볼 특정한 값이 있다면 그 것에 많이 맡겨야한다는 것을 알아서 그것에 이름을 줄 역사에서의 수를 기억해야한다. 또한 상 황적으로 구분점을 놓을 때 그것들을 위한 사용을 알아야 할 것이다. 상황적 구분점은 기호적인 디버그의 특징이다. 여러분은 이렇게 말할 것이다. “프로그램에서 이 지점에 이르게 되면 그 표현 이 확실할 때만 제외하고 멈추어라.” 디버그의 변수는 여러분이 프로그램 변수와 디버그 변수에 서 구한 변수의 정의 값을 비교하게 할 것이다. 그들이 사용할 수 있는 또 다른 것은 할당이 C로 표현되기 때문에 센다는 것이다. 그래서 여러분은 5로 “$foo”의 값을 “$foo++”의 값으로 이득을 볼 수 있는 “foo+=5″를 할 수 있다. 여러분은 또한 상황적 분기점에 이것을 쓸 수 있어서 “$foo–==0″을 쓰는 것은 분기점이 하는 것의 10배나 깨는 간단한 방법이 된다. 모두가 그것을 따를까? foo가 감소하여 그것이 0이면 깨진다. 여러분이 건너 뜨기를 원하는 때, 그 수에 $foo를 놓으면 그렇게 할 수 있다. 또한 정렬하여 요소를 시험할 때도 사용할 수 있다. 포인터를 정렬하 려면 이렇게 할 수 있다. PRINT X[$foo++] 그러나 처음엔 이렇게 해야한다. SET $foo=0
여러분이 포인트를 Print란 표현으로 할 때 X에는 0번째 요소가 있게 되고 그것을 다시 하면 첫 번째 요소가 있게 된다. 이것들을 구조를 나타내는 포인터라고 가정하여, PRINT에 X라고 하 기 전에 별표를 하면, 매 때마다 정렬할 요소들이 포인트된 다음 구조를 프린트하게 된다. 물론 이 명령을 커리지리턴으로 반복할 수 있다. 단순히 반복하는 것이 충분하지 않다면 사용자가 만 든 명령어를 사용할 수 있다. “Mumble”이라고 정의하려면 명령줄에 그 선을 넣고 “end”라고 해 보라. 그러면 이 줄을 수행한 “Mumble”명령이 정의된다. 명령 파일에 이런 정의를 놓는 것은 매 우 유용하다. 각 디렉토리에 명령을 가지고 작업할 디렉토리를 디버거가 자동적으로 하도록 할 수 있다. 그래서 프로그램의 데이터 구조에 접근하기 위한 유용한 방법으로 사용자 정의의 명령 을 각 프로그램에 정의할 수 있다. 또한 사용자 정의의 명령에 설명을 넣을 수 있어서 만들어진 명령에 “help”를 실행할 수 있다.
이 디버그의 특별하게 다른 점은 일시적인 기억장치로부터 조직을 버릴 수 있는 능력이다. 왜 냐하면 여러분이 디버거한 프로그램에 일어난 것을 시험하는 것뿐만 아니라 다른 방법으로 생각 하는 것으로 그것을 변화시키는 것이 중요하기 때문이다. 그래서 여러분이 어떤 문제를 찾아내고 잘못된 것을 안 후에는 코드가 잘못되어 처음 프로그램을 리컴파일하는 것 없이 다음 버그를 알 아내는 것처럼 그것들을 고칠 수 있다. 이것은 유연성 있게 프로그램의 데이터 영역을 변화시킬 수 있을 뿐 아니라 제어의 흐름도 변화시킬 수 있게 한다. 이 디버그에선 다음과 같이 함으로써 직접적으로 제어의 흐름을 변화시킬 수 있다. SET 4PC= 그러면 프로그램을 셀 수 있다. 또한 일시적인 기억장치도 놓을 수 있으며 다음과 같이 말할 수 있다. SET $SP+=
여러분이 일시적 기억장치의 포인터를 어떤 량으로 늘리려면 말이다. 그러나 프로그램의 특정 한 라인에서 시작하기 위해 특정한 라인을 또한 프로그램 카운터로 놓을 수 있다. 그러나 잘못된 함수를 찾아내어서 여러분이 정말로 그 함수를 부르길 원하지 않을 때는 어떤가? 그 함수는 매우 실수를 잘 하기 때문에 여러분이 정말로 원하는 것은 그것으로 되돌아가 그 함수가 했었던 것으 로 일을 수행하는 것이다. 여러분은 “RETURN”명령을 사용할 수 있다. 여러분이 기억장치의 구 조를 선택하여 ” RETURN”으로 하면 그것은 그 함수가 즉시 되돌아 간 것처럼 버려지게 될 것 이다. 또한 돌아가야 할 값을 가질 수 있다. 이것을 실행을 계속하지 않는다. 되돌아간 것 처럼하 여 프로그램을 멈추어서 여러분이 다른 것으로 바꿔 계속할 수 있게 하는 것이다.
이런 것들을 한 데 모아서 여러분은 프로그램에서 하던 것을 잘 제어할 수 있다.
게다가 약간 놀랄만한 것이 있다. C는 문자열 상수를 가지고 있다. 만약 여러분이 디버그를 계산하는 표현으로 문자열 상수를 사용한다면 무슨 일이 일어나겠는가? 여러분이 디버그 하는 프 로그램에서 문자열를 만들어 내야 한다. 그것은 잘 될 수 있다. 디버그된 프로그램에 MALLOC라 불리는 것을 설치하고 실행시키면 다시 제어된다. 그러면 문자열 상수가 놓인 곳이 찾아진다.
명백하게 이 디버그가 실제 GNU시스템에서 실행될 때 나는 그 아래서 돌아가는 프로세서의 내부상태를 시험하기 위한 장치를 놓으려고 한다. 예를 들어 페이지가 있고 읽을 수 있고 쓸 수 있는 메모리 맵의 상태와 하위 프로그램의 터미널 상태를 시험하는 것이다. 이미 약간의 명령어 가 있다. 이것은 UNIX의 디버그와는 달리 터미널 상태가 완전히 디버그와 디버그 하는 프로그램 이 분리되어 있다. 그래서 그것은 다루지 않은 모드로 운용되는 프로그램과 입력이 돌아가는 것 을 방해하는 프로그램이 작동하게 된다. 또한 디버그 하는 프로그램의 터미널 세팅이 사용되는 것을 발견하도록 하는 명령어가 있다. 일반적으로 디버그는 하위의 프로세서에서 실행되는 모든 것을 발견하도록 해야 한다.
이미 존재하는 GNU에는 두 가지의 주요 부분이 있다. 하나는 새로운 C컴파일러이고 하나는 TRIX핵심부분이다.
새로운 C컴파일러는 내가 지난봄부터 쓴 것이다. 나는 드디어 파스텔을 던져버려야 한다고 결 심했다. 이 C컴파일러는 Arizona Portable Optimizer 대학으로부터 파스텔에 대한 어떤 생각이 이 용되었다. 이 흥미로운 아이디어는 간단한 명령으로 개발되는 많은 종류의 기계를 작동시키는 것 이다. 그리고 나서 그 기계가 그것을 허용할 때 복잡한 명령로부터 여러 간단한 명령으로 결합 한다. 이것을 하기 위하여 그들은 대수적인 지식으로 명령을 표현했다. 예를 들어 ADD명령은 이 것을 나타낸다. r[3]=r[2]+4
이것은 컴파일러 안에 레지스터 2의 내용을 잡고 4를 더하여 레지스터 3으로 저장하는 표현이 다. 이런 방식으로 어떤 기계에도 가능한 명령을 표현할 수 있다. 그래서 그들은 이 방법으로 모 든 명령을 표현했고 그것들을 묶어야 할 때가 왔을 때, 하나에서 다른 표현으로 대체하는, 즉 결 합된 명령을 더 복잡한 대수 표현으로 바꾸었다.
때때로 처음 명령의 결과가 더 이상 이용을 할 수 있느냐에 달려 있으므로 두 가지의 할당 작 업으로 명령을 묶는 것은 필요했을 것이다. ???로 포인트 되는 이 를 위한 것과 ???로 포인트 되 는 이 값와 함께 다른 것을 두 번째 명령으로부터 온 것으로 대체시켰다. 그러나 이 값이 일단 한 번 사용된 것이라면 여러분은 그것을 대체한 후에 제거할 것이다. 더 이상 그것을 계산할 필 요는 없다. 그래서 정확히 사이에 낀 명령이 더 이상 다른 값이나 그런 것으로 바뀌지 않는 것을 점검하는 대체는 다소 복잡한 것이다. 여러분은 자동 증가와 자동 감소 어드레싱과 같은 것을 지 지할 때 이런 것들이 여러분이 하는 것이 보존할 값가 없는 환경을 점검하는가를 다양하게 체크 해야 한다.
그러나 이러한 모든 것을 체크를 한 후에 여러분은 대체된 복잡한 표현을 가지고 여러분이 선 택한 기계의 정당한 명령을 인식할 본보기를 맞추어야 한다. 그리고 그것이 인식된다면 여러분은 이 두 가지 명령을 하나의 결합으로 대체하고 그렇지 않으면 그것을 따로 놔두어야 한다. 그들의 기술은 이 방법으로 데이터의 흐름에 관여하는 두세 개의 명령을 묶는 것이다.
Arizona 컴파일러에서는 실제로 이와 같이 텍스트 문자열로 표현하며 그 컴파일러는 매우 느리 다. 첫 번째로 나는 그들의 컴파일러를 사용할 생각을 해서 그것을 변형했다. 그러나 내가 원하는 속도를 얻기 위해 그것은 전적으로 명백하게 내가 다시 써야 한다는 것은 확실했다. 그래서 나는 이 모든 표현들을 위한 리스트 구조를 사용하기 위해 다시 썼으며 그것은 다음과 같다. (set (reg 2) (+ (reg 2) (int 4)))
이것은 Lisp처럼 보이나 각 기호가 특별히 각인된 것이기 때문에 이것의 의미는 LISP가 아니 다. 정의된 여러분이 필요로 하는 이런 정의된 기호는 특별히 고정된 집합이다. 그리고 각각은 인 수 타입의 특정한 본보기를 가지고 잇다. 예를 들어 “reg”는 항상 세어지는 것이기 때문에 완전수 이다. 그러나 “+”은 두 개의 보충표현을 취한다. 또한 각각의 표현은 그것이 고정된 것인지 유동 적인 것인 지와 얼마나 많은 바이트를 쓰는지를 말해주는 데이터 타입이다. 그것은 여러분이 원 하기만 하면 다른 것으로 운용되도록 확장될 수 있었다.
내가 자동으로 레지스터 배당을 하는 방법은 처음 이 코드를 만들고 결합체와 모든 것을 할 때 아마도 레지스터로 가는 모든 변수를 위해 16으로 시작하는 숫자나 여러분의 기계에 실제 레지스 터를 높이는 가짜레지스터 번호라는 것을 메기는 것이다. 그래서 실제레지스터는 0에서 15까지또 는 다른 수로 번호에 메겨지게 된다. 그리고 나서 컴파일러의 마지막 부분 중 하나는 통과하거나 가짜 레지스터를 실제 레지스터로 바꾸는 것으로 구성된다. 다시 모순된 그래프를 만들면 가짜 레지스터가 같은 포인트에 있는 것이 보인다. 물론 그것은 같은 실제 레지스터로는 갈 수 없고 가능한 한 실제 레지스터에 앉으려고 한다. 그것들이 얼마나 중요한지 우선 순위를 명령하면서 말이다.
마침내 그것은 변수 문제를 위한 코드교정을 해야 한다. 실제 레지스터에 맞지 않는 가짜 레지 스터가 있을 때 그것이 대신 기억장치의 홈으로 놓여야 하는 일 같은 것 말이다. 그 일이 어떤 기계에 일어났을 때 명령의 일부는 약하게 된다. 예를 들면 68000에서 여러분은 메모리에 레지스 터를 더할 수 있으나 하나의 메모리 위치를 다른 것에 더할 수는 없다. 그래서 만약 여러분이 ADD명령을 가지고 있고 68000에 앞세워서 이 두 가지를 메모리 안에서 끝낸다면 그것은 유효하 지 않게 된다. 이 마지막 패스는 레지스터를 통과하고 이것들을 레지스터에 카피하며 이 문제들 을 교정할 필요가 있는 레지스터를 벗어나게 된다.
문제는 또한 인덱스 레지스터에서 나타날 수도 있다. 만약 여러분이 무언가에 의해 인덱스 하 려 한다면 코드가 부당하게되는 대부분의 시간은 여러분이 간접적으로 어드레싱하는 기계의 경우 를 제외하고는 메모리에 있게된다. 여러분이 인덱스 레지스터에 자동 증가를 할 경우에 여러분은 그 값을 레지스터에 카피하고 명령을 실행하여 그것이 실제로 있던 기억장치의 홈에 돌아가 증가 된 값을 카피 해야한다.
많은 방들이 있어서 나는 실제로 충분히 필요한 모든 방을 실행하는 것을 끊내지 않았다.
이 컴파일러는 C코드가 C데이터 타입의 정보로 주석을 달은 구문 트리로 효과적으로 변환하는 parser를 갖추는 작업을 한다. 이 트리를 보는 다른 패스와 LISP같은 코드가 생성된다. 그리고 나 서 몇몇 최적화 면제가 통과된다. 이것들은 계속 쓰여진다. +1은 즉시 단순화될 수 있다. 보통의 하위표현을 인식하여 기본 블록을 찾고 데이터흐름을 분석한다. 그래서 그것은 각 명령의 값이 그 명령 안에서 사용된다는 것을 알리고 이후에는 절대 사용되지 않는다. 그리고 또한, 그 값이 쓰이던 곳에서의 각 명령을 연결하는 것은 개발되어서 만약 내가 가짜 레지스터 R[28]을 생성시 킬 명령을 가지고 있다면 R[28]을 사용할 다른 명령이 있고 그것은 R[28]을 사용할 첫 번째 장소 가 된다. 나는 첫 번째 장소로 돌아가 두 번째 장소에 포인트를 만든다. 그리고 이 포인트는 명령 을 묶는 것을 제어하는 데 쓰인다. 여러분은 인접한 명령을 묶지 말고 그 값를 내는 명령으로 묶어야 한다. 그 사이에 다른 명령이 있다고 할지라도 여러분은 그것들이 방해하지 못하도록 체 크해야 한다. 그리고 나서 묶은 것이 역동적으로 레지스터 할당이 된 후에야 비로소 어셈블리 코 드로 전환된다.
Arizona컴파일러에서 명령 인식 자는 LEX로 발달되었다. 여러분의 기계묘사는 LEX가 문자열 로 확실한 명령을 인식시켜 주는 C함수로 변환하는 단순한 LEX프로그램이었다. 내가 가진 것은 LISP처럼 이 통용 법으로 쓰여진 기계묘사로부터 개발된 특별한 목적의 결정 트리를 대신하는 것이다. 그리고 이 인식기는 많은 다른 컴파일러 부분의 서브루틴으로 사용된다.
이 컴파일러는 PCC만큼 빨리 돌아간다. 이것은 PCC와 같은 방식으로 레지스터를 할당한 경우 에 그 실행을 말해두지 않았다면 눈에 띄게 빨리 돌아간다. 이러한 슈퍼 모드에서는 PCC보다 이 것이 훨씬 레지스터를 할당하는 작업을 더 잘한다. 나는 VAX에서 그것이 우수한 코드와 C 컴파 일러를 개발하는 것을 보았다.
68000에서 이 코드는 아직 이상적이지는 않다. 나는 가장 우수하지 않은 것을 초기 단계로 하 는 곳을 보았다. 앞으로의 일은 예측할 수 없기 때문이다. 그것은 초기 단계를 선택하고 그것이 가장 우수하게될 것이라고 생각되는 것을 한다. 그러나 실제로 그것이 다른 것을 했다면 후기 단 계는 무언가를 더 잘 할 수 있을 정도로 스마트해진다. 그러나 초기 단계에서는 후기 단계에서 어떻게 될지 알지 못한다. 그래서 나는 이런 것들에 대한 일을 해야한다.
때때로 이것은 불필요하게 레지스터가 무료로 되게 한다. 그것이 메모리를 종결시키면 레지스 터로 메모리를 복사해야 할 필요가 있다. 이것은 이미 할당된 레지스터를 취하고 기억장치의 홈 밖으로 일시적인 양을 버려야 한다. 물론 이것들이 레지스터가 아니라 메모리에 있기 때문에 명 령을 더 이상 무효로 만든다. 그래서 또 다시 체크해봐야 한다. 가끔씩 그것을 레지스터에 복사해 야 하나 실제로 그렇게 하지는 않을 것이다. 그래서 그것은 그것들을 무료로 놔두어야 할 것이어 서 그것이 할 수 있는 모든 레지스터를 이용하지 않을 것이다.
(질문 : 여러분은 32000을 위한 코드 생성기를 가지고 있습니까?) 아직 아니지만 그것은 코드 생성기가 아니라 여러분이 필요로 하는 기계 기술이다. 모든 기계명령의 리스트는 LISP와 같은 형태로 기술된다. 그래서 실제로 인수가 VAX에서 보다는 68000에서 필요한 어떤 레지스터에 있 는 것을 제한하는 아이디어를 실행할 작업은 별도로 하도라도 VAX에서 68000으로 이 컴파일러 를 이식하는 작업은 며칠밖에 안 걸린다. 그래서 이식하는 것은 매우 쉽다.
컴파일러는 어셈블러 코드를 생성시켜 DBX가 원하는 포맷과 GDB의 특정한 내부 포맷에서 디 버그 하는 정보를 발달시킬 수 있다. 나는 이 컴파일러에서 필요로 하는 작업은 3가지 영역에 있 다고 본다. 하나 : 나는 UNIX컴파일러가 가진 것과 같은 “윤곽이 있는”기능을 첨가해야 한다. 둘 : 나는 더 스마트하게 이런 레지스터 할당을 만들어서 엉뚱한 것이 출력되지 않도록 할 것이 다. 셋 : 그 자체는 정확하게 컴파일 되더라도 아직 정확하게 작동하지는 않는 다양한 버그들이 있다. 나는 이것이 약 몇 달 걸릴 것으로 생각하고 컴파일러를 공개할 것이다.
존재하는 시스템의 크기가 있는 다른 부분은 핵심부분이다. ( 질문 : 중지? ) 그렇다. 나는 우리 가 쉬는 것도 잊어버리고 있다고 짐작한다. 왜 나는 단지 5분 정도 걸릴 핵심부분에 대해 이야기 하길 멈추지 않겠는가. 우리는 휴식을 가졌다.
핵심부분을 위해 나는 MIT리서치 프로젝트로 개발된 (내가 알기론 다른 것을 나타내지 않는) TRIX이라 불리는 시스템을 이용하도록 계획을 세웠다. 이 시스템은 Remote Procedure Call에 바 탕이 깔려 있다. 그래서 프로그램은 도메인이라 불린다. 각 도메인은 어드레스 공간과 다양한 기 능이 있다. 어떤 도메인은 “성능 이식”을 만들 수 있어서 다른 도메인에 이 이식을 보낼 수 있다. 시스템을 부르는 것과 다른 사용자 도메인을 부르는 것은 차이점이 없다. 사실 여러분은 여러분 이 가진 것을 부를 수 없다. 그래서 다른 사용자 프로그램에 의해 구현된 장치를 가지는 것은 매 우 쉽다. 파일 시스템은 명료하게 사용자 프로그램에 의해 구현될 수 있다. 네프워크를 통해 통신 하는 것도 명료하다. 여러분은 직접 다른 도메인을 부를 생각을 하지만 실제로 여러분은 네트워 크 서버 도메인을 부른다. 그것은 여러분이 부를 정보를 가지고, 이야기하려고 하는 도메인을 부 를 다른 서버 프로그램의 네트워크로 건네준다. 그러나 이것은 눈에 띄지 않게 일어난다.
TRIX커넬은 실행되어 UNIX호환이 제한되지만 더 많이 필요하다. 현재 그것은 예전 UNIX시스 템이 하는 것과 같은 디스켓에 구조를 이용하는 파일 시스템을 가지고 있다. 이것은 UNIX로 파 일을 설치하기 때문에 디버그 하는 것을 더 쉽게 한다. 그러나 TRIX를 실행시키면 그 파일 시스 템은 내가 필요하다고 생각되는 어떤 기능도 가지고 있지 않다.
내가 믿는 기능은 다음과 같은 것이 첨가되어야 한다. 그것은 버전 수, 무삭제, 언제 어떻게 어 디서 파일이 타이프에 백업되느냐는 정보, 극소수의 파일을 대신하는 것이다. 나는 UNIX에서 파 일이 쓰여졌을 때 여러분이 이미 거기에 있는 것을 보는 것은 괜찮다고 생각한다. 예를 들면 여 러분은 얼마나 멀리 그것이 있나 보기 위해서 “열”을 사용할 수 있다. 그리고 프로그램이 사라지 면 여러분은 파일을 부분적으로 쓰여진 것을 볼 수 있다. 이런 것들은 모두 바람직하나 부분적으 로 쓰여진 출력은 결과적으로 여러분이 가지길 원했던 완전한 출력을 잡지는 못할 것이다. 그것 의 새로운 버전이 완전하고 정확하게 만들어질 때까지 예전 버전은 계속 쓰이게 될 것이다. 이것 은 새로운 버전이 가지는 이름 아래서가 아니라 파일 시스템 안에서 볼 수 있다는 것이다. 그것 이 끝났을 때 다시 이름을 받게될 것이다. 각 사용자 프로그램이 이것을 확실하게 해야함에도 불 구하고 ITS에서 일어난 방법대로 된 것이다. 사용자 프로그램에 UNIX호환을 위해 그것은 눈에 보이지 않게 일어난다.
나는 UNIX사용자 프로그램에 버전 수를 맞추려고 하는 괴상한 방식을 가지고 있다. 일반적인 방법으로 이름을 짓는다면 내재된 버전 수로 남겨진 파일 명을 짓는다는 것이다. 그러나 만약 여 러분이 정확하게 이름을 지으려고 한다면, 사용할 버전을 원하거나 전혀 버전을 원하지 않기 때 문에, 여러분은 그것의 끝에 포인트를 두어야 한다. 그러므로 여러분이 파일 명을 “FOO”라 했다 면 그것은 “FOO로 존재하는 버전을 찾고 가장 마지막의 것을 취해라”는 뜻을 나타낸다. 그러나 “FOO.”으로 했다면 그것은 “정확히 이름이 FOO인 것을 사용하고 다른 것을 취하지 말라.”는 뜻 이 된다. “FOO.3″이라고 하면 그것은 “이름이 FOO.3을 사용해라”라는 뜻이며 FOO.3은 FOO버전 이 3인 것을 나타낸다. 출력에서 여러분이 “FOO”라고 하면 그것은 명백하게 “FOO”의 새로운 버 전을 만들어내나 “FOO.”이라고 하면 그것은 정확히 “FOO.”으로 이름지어진 파일을 쓰는 것이다.
여기에 모든 항목들 외에 작업하는데 연관된 시도가 있다. 해결되지 않은 문제가 있는지, 어떤 UNIX소프트웨어가 그것에 포인트로 이름을 지어줌에도 불구하고 깨어지는지를 같은 방식으로 얻어 주려고 하는 것이다.
나는 여러분이 이름이 포인트로 끝난 출력을 위해 파일을 열 때 즉시 그 이름으로 열기를 바란 다. 그러면 여러분은 같은 UNIX 방식을 얻을 수 있어 부분적으로 쓰여진 출력을 즉시 볼 수 있 을 것이다. 반면에 여러분이 포인트로 끝내지 않은 이름을 출력할 때 새로운 버전이 그것을 종결 했을 때 나타나게 될 것이다. 만약 작업이 사라지거나 시스템이 충돌이나 그와 같은 어떤 것 때 문에 종결된다면 그것은 다른 이름으로 있게 될 것이다.
그리고 이 생각은 어떤 디렉토리가 다음과 같은 파일을 가지고 있다면 포인트로 끝나지 않은 이름에 그것의 버전 수없이 모든 이름을 붙이도록 “별 붙이기”로 연결될 수 있다. foo.1 foo.2 bar.8
내가 “*”라고 말하면 그것은 다음과 같다. foo bar 왜냐하면 그것은 모든 이름을 취하고 그 버전을 없애 구분된 모든 것을 취하기 때문이다. 그러나 내가 “*.”라고 하면 그것은 모든 정확한 이름을 취하고 각각에 포인트를 놓아 그것들에 맞추는 것이다. 이것은 존재하는 모든 개인적인 버전을 위해 모든 이름을 나에게 준다. 그리고 비슷하게 여러분은 “*.c”와 “*.c.”의 차이점을 볼 수 있을 것이다. 전자는 여러분에게 기본적으로 모든 “.c” 파일을 버전 없이 줄 것이다. 후자는 여러분에게 모든 버전을 줄 것이다. 이것은 실제로 작동을 안 하므로 여러분은 “*.c.*.”라고 해야 할 것이다. 나는 여기서 이 항목을 해결하지 못했다.
이중 장치는 사용자가 볼 수는 없지만 어느 정도 입력할 호환이 있다. 그것은 적당한 명령으로 디스켓에 모든 정보를 써서 파일 디스켓에 방해받지 아니하고, 어떤 때에는 멈출 수 있도록 한다. 아무도 그것을 경시할 수 없다. 다른 아이디어는 매우 과다한 정보이다. 나는 이것을 할지 안 할 지 확신할 수는 없으나 각 파일을 그것의 이름으로 모두 저장시키는 방법에 대한 생각이 있다. 그리고 나면 디스크의 어떤 디렉토리가 사라져도 디스크의 남은 내용물로부터 그것을 재구성할 수 있을 것이다.
또한 나는 파일의 어떤 부분을 조금씩 업데이트하는 방법을 알고 있다. 만약 여러분이 어떤 파 일의 하위영역을 읽는 방식의 새로운 데이터로 대체하려면, 그 파일은 예전 데이터만 보이거나 아니면 새로운 데이터만 보일 것이다. 나는 어떤 잠금장치가 없어도 그렇게 할 수 있다고 믿는다.
네트워크를 지지하기 위해 나는 이 시스템이 TCP/IP를 실행하려고 했다. 나는 또한 UUCP와 같은 것을 얻기 위해 KERMIT를 사용하는 것이 가능하다고 생각한다.
내가 믿는 쉘은 이미 쓰여졌다. 그것은 두 개의 모드를 가지고 있는데 하나는 BOURNE쉘을 모 방한 것이고 다른 하나는 같은 프로그램에서의 C쉘을 모방한 것이다. 나는 아직 그것의 복사 본 을 받지 않았다. 나는 그것을 얼마나 해야 하는지를 알지 못한다. 또한 많은 다른 유틸리티도 존 재한다. MAKE가 존재하고, LS, 분포되고 있는 BISON이라 불리는 YACC대체물이 있다. LEX 에 꽤 유사한 것이 있지만 그것은 전적으로 호환불가능하고 어떤 작업이 필요하다. 그리고 일반 적으로 이루고 있는 것은 이미 이루어진 것 보다 훨씬 덜 낫다. 그러나 우리는 도와 줄 사람이 여전히 많이 필요하다.
사람들은 항상 나에게 물어 본다. “언제 그것이 끝납니까?” 물론 나는 그것이 언제 끝날지 알 수 없으나 나에게 그렇게 물어보는 것은 잘못이다. 만약 여러분이 그것에 보답하기로 계획했다면 여러분이 얻으려는 것을 정확하게 알기 원하는 것은 당연할지도 모른다. 그러나 여러분이 그것에 보답을 하지 않는다면 여러분은 이렇게 물어뵈야 한다. “여러분은 어떻게 그것을 곧 끝낼 수 있 습니까?” 나는 MIT파일에 있는 프로젝트의 리스트를 가지고 있다. 도와주는 사람들은 나에게 이 인터넷 주소로 메일을 보낼 수 있었고 나는 프로젝트의 리스트를 다시 보낼 수 있었다. (나는 분 필을 보는 이 작업을 과연 할 수 있을 지에 의문을 가졌다.) 이것은 읽을 수 있는가? 이것은 (단 지 튀는 공을 따르는)”RMS@PREP.AI.MIT.EDU” 이다. 그리고 쉬자. 쉬고 난후에 나는 실제로 어떤 인수가 있는 것을 말할 것이다. 그래서 지금은 가지 말아라. 여러분이 남는다면 여러분은 실 습을 하고 싶을 것이다.
[15분 간 쉬었다.]
나는 어떻게 GNU소프트웨어를 복사할 수 있었는가를 알려주도록 요청받았다. 한 가지 방법은 복사 본을 가진 친구를 알아서 그것을 복사하는 것이다. 그러나 복사 본을 가진 친구를 알지 못 하고 인터넷에도 없다면 그것을 FTP할 수 없으며 항상 분포된 테이프에 주문을 하여 Free Software Foundation에 약간의 돈을 보내야 한다. 물론 무료 프로그램은 무료로 분포된 것과 같 지 않다. 나는 이것을 나중에 자세하게 설명할 것이다.
여기 나는 잘 프린트된 다양한 EMACS매뉴얼을 가지고 있다. 그것은 사진식자 되었고 offset 프린트되었다. 여러분이 EMACS분포에서 온 소스로부터 그것을 프린트 할 수 있다 하더라도 여 러분은 Free Software Foundation으로부터 이것들을 복사할 수 있다. 여러분은 나중에 와서 이것 을 볼 수 있다. 또한 이것은 어떤 정보를 복사하도록 주문할 수 있다. 그리고 [앞의] 그림은 가끔 씩 즐겨진다. [GNU에 오른 RMS에 의해 쫓아진 특징을 포인트 하는] 이것은 놀랄만한 소프트웨 어 저장소이다. 나는 잠시 그에 관해 이야기하겠다.
소프트웨어는 비교적 새로운 현상이다. 아마 30년 전부터 소프트웨어가 분포되기 시작했을 것 이다. 누군가 그것에 관한 사업을 만들자는 제안을 가진 것은 약 20년 전이었다. 그것은 사람들이 했던 방식이나 누가 무슨 권리를 가졌냐에 대해 전통이 없던 영역이었다. 그리고 분석적으로 전 통을 가져올 수 있는 여러 가지 아이디어들이 있었다.
유럽에서 많은 교수들이 좋아하는 한 분석은 프로그램과 수학 사이에 있는 것이다. 프로그램은 큰 공식이다. 전통적으로 수학적인 공식을 소유한 사람은 아무도 없다. 누구나 그것을 복사하고 사용할 수 있다.
보통 사람들에게 가장 의미 있는 분석은 방식에 의한 것이다. 대부분의 프로그램과 같이 여러 분의 보통 삶에서 가진 방식은 무언가를 할 수 있는 명령이다. 그 방식이 자동적으로 기계에 의 해서가 아니라 사람에 의해 작동되기 때문에 차이점이 있는 것이다. 소스 코드와 방식을 위한 옵 젝트 코드 사이에는 차이점이 없고 여전히 가장 비슷하다. 어떤 것도 그 자체의 한 방식을 가지 지 않는다.
그러나 선택된 분석은 복사본을 있는 책을 가지고 하는 분석이었다. 왜 이런 선택을 했는가? 왜냐하면 특정한 선택을 만들어 얻은 대부분을 가진 사람들이 결정을 따랐기 때문이다. 프로그램 을 사용하지 않는 사람들이 아니라 프로그램을 쓰는 사람들이 완전히 자기중심의 형태로 결정하 였다. 결과적으로 그들은 프로그램 분야를 추한 것으로 변하게 했다.
내가 이 분야에 들어서서 1972년 MIT에서 일하기 시작했을 때 우리가 개발한 프로그램이 공유 되지 않았다는 생각은 전혀 거론되지도 않았다. 스탠포드나 CMU나 누구에게나 DIGITAL까지도 마찬가지 였다. 나는 자주 PDP-11크로스 어셈블러 같은 DIGITAL시스템으로부터 프로그램 조각 을 가지고 ITS를 작동하게 하는 많은 특징을 첨가하였다. 그 프로그램을 복사한 것은 아니었다.
이것이 변하기 시작한 때는 70년대 말이었다. 나는 우리가 가진 공유의 정신에 의해 아주 감동 받았다. 우리는 우리가 바라던 것을 사람들이 사용할 수 있어서 기뻐했다. 그래서 내가 처음으로 EMACS를 발달시켰을 때 사람들은 그것이 MIT외부로도 사용되기를 원했다. 나는 그것이 EMACS”친교”에 속하고 EMACS를 사용하기 위해서 여러분이 친교의 멤버가 되어야 한다고 말 했다. 이것은 여러분이 만든 모든 향상에 기여할 책임이 있다는 것을 뜻한다. 오리지널 EMACS 에 대한 모든 향상은 나에게로 다시 보내져서 EMACS의 새로운 버전과 합쳐질 수 있었다. 그래 서 공동체에 있는 누구나 그것으로부터 이익을 볼 수 있었다.
그러나 이것은 SCRIBE가 CMU에서 개발되었을 때 파괴되어서 어떤 회사에 팔렸다. 이것은 여 러 대학에 있는 우리를 매우 방해했다. 왜냐하면 우리는 이것이 누구나에게 유혹적이고 너무 이 익적이어서 비협조적으로 되는 것을 보았기 때문이다. 협조를 여전히 믿는 우리 중 일부는 우리 와 협조하는 사람들을 쫓아내려는 생각을 아예 하지도 ㅇ았다. 나중에는 강한 의식을 가지 우리 가 끝까지 단합할 때까지 사회의 여러 구성원들과 교류하려고 했었다. 이것이 일어난 일이다.
프로그램의 분야는 지금 누구나 그 분야의 다른 사람들과 사용자에게 좋지 않은 방법으로 많은 돈을 번다고 여겨지는 추한 것으로 되었다.
나는 독점 소프트웨어의 실행이 사회에 물질적으로 오염되고, 정신적으로 해롭고, 악의적이라는 것이 확증되기를 바란다. 이 모든 세 가지는 서로 관련되었다. 다른 사람에게 물질적으로 해로운 실행을 하는 컴퓨터에는 사회의 모든 멤버가 연루될 수 있기 때문이다. 그리고 매 때마다 여러분 은 여러분 자신에게 좋은 것을 한다. 여러분이 하는 것은 여러분을 도와주려는 다른 사람에게 상 처를 줄 수도 있다. 여러분은 그런 것을 막기 위해 냉소적으로 되어야 한다. 그리고 그것은 고의 로 작업한 것을 오염시키고 사회적 부패를 야기하기 때문에 악의적이다.
첫 번째로 나는 소프트웨어를 독점하는 데서 오는 해로움과 일반적으로 사용하는 정보에 대해 서 설명하기를 원한다. 그리고 나서 그런 실행을 하는 변수에 반증을 할 것이다. 나는 그런 현상 과 싸우는 방법에 대해 이야기하겠다.
정보를 소유하는 생각은 세 가지 수준으로 해롭다. 세 가지 수준에서 물질적인 해로움은 정신 적인 해로움으로 대응이 된다.
첫 번째 수준은 프로그램의 사용을 감소시킨다는 것이다. 그것은 사람들이 프로그램을 덜 사용 하게 하지만 사실은 사람들이 덜 사용할 프로그램을 만드는 것이다. 프로그램의 사용에 대한 값 이 이 소프트웨어 저장관리자가 좋아할 정도로 자극적이라면 사람들은 그 프로그램을 사용하지 않을 것이다. 이것은 낭비이다. 예를 들어 많은 사람들 중에 반만이 그것에 값을 치르고 프로그램 을 사용한다면 프로그램은 그 반이 낭비되는 것이다. 작업의 같은 양이 딱 반만큼의 이득을 만 만들어내게 된다.
사실은 프로그램을 사용하기 원하는 사람들은 그 프로그램의 주위를 맴돌 필요는 없다. 왜냐하 면 누구나 완전하게 그것을 복사해서 얻을 수 있기 때문이다. 여러분이 프로그램을 쓴 다음 해야 할 것은 그 자리에서 사람들이 원하는 것을 할 수 있도록 해야한다는 것이다. 그러나 그것은 일 어난 일이 아니다. 누군가가 프로그램을 공유하는 것을 고의적으로 방해하려는 대신에 도와주는 사람에게 압력을 주기 때문이다. 사용자가 노출되지 않은 동의의 신호를 보낼 때마다 그는 그의 동료 사용자에게 팔아 버린다. 규칙을 따르고 “나는 이 프로그램을 좋아한다. 나의 이웃도 이 프 로그램을 좋아할 것이다. 나는 우리 둘 다 그것을 가지기를 원한다. “고 말하는 대신에 그는 다음 과 같이 말한다. “그렇소 나는 그것을 나에게 주시오. 나의 이웃을 타도한다! 나는 당신들에게 그 것이 나의 이웃과 멀리 떼어지도록 도와주겠다. 단지 나에게 달라.” 이 정신은 정신적으로 해로운 것이다. 이렇게 말하는 태도이다. ” 나의 이웃을 타도한다. 나에게 복사본을 달라. ”
나는 나에게 무언가의 복사본을 가지게 하지 않겠다고 말하는 이들에게 달려갔다. 왜냐하면 그 들이 어떤 비밀스런 동의의 표시를 했기 때문이다. 누군가 나에게 그것과 같은 것을 요청했을 때 그것이 잘못되었다는 것을 알았다. 나에게 일어났을 때 나를 매우 화나게 하는 것과 같은 일을 남에게도 할 수는 없었다.
그러나 이것은 해로운 수준의 하나일 뿐이다. 두 번째 수준은 사람들이 프로그램을 변화시키길 원할 때이다. 왜냐하면 사람들이 사용하기 원하는 프로그램은 정말로 올바르지는 않기 때문이다. 사람들은 조금 덜 짠 말을 하거나 푸른 고추를 더하면서 다양한 방식을 원하듯이 필요한 효과를 얻기 위해서 프로그램도 변화시키길 원한다.
소프트웨어 소유자들은 실제로는 사람들이 프로그램을 변화시키느냐에 신경을 쓰지 않는다. 그 러나 그들의 목적은 사람들을 막는데 있다. 일반적으로 소프트웨어가 독점되었을 때에는 소스를 구할 수 없고 그것을 변화시킬 수 없다. 이것은 사용자에게 좌절을 주고 프로그래머에게는 작업 을 낭비시킨다. 예를 들어 프로그래머로서 새로운 프로그램을 쓰며 은행에서 수개월 동안 일하는 방법을 얘기했었던 친구가 있었다. 거의 사업적으로 올바르고 유용한 프로그램이 있었는데 그들 이 필요하기에 꽤 적합한 것은 아니었다. 사실은 그들에게는 쓸모가 없었다. 그들이 필요한 것을 하려는 변화의 양은 알마 안되었지만 프로그램의 소스가 유용한 것이 아니었기 때문에 그것은 불 가능했다. 그 친구는 처음부터 잘못 시작되어 작업의 낭비를 가져왔다. 그리고 우리는 세상의 모 든 프로그래머의 일부가 이런 방식으로 그들의 시간을 낭비하고 있다고 추측할 수 있었다.
그리고 적당한 프로그램이 만들어지는 상황이 있으나 불편할 수도 있다. 예를 들어 처음으로 우리가 MIT에서 그래픽 프린터를 가졌을 때, 우리는 소프트웨어를 쓰고 많은 훌륭한 특징을 놓 았다. 그 예로는 프린트하는 것을 끝냈을 때 여러분에게 메시지를 보내고 프린터의 종이가 떨어 져 작업이 대기되었을 때에도 메시지를 보낸다. 우리가 원하는 많은 것들이 이렇게 된다. 우리는 그래서 더욱 훌륭한 첫 번째 레이저 프린터의 하나인 그래픽 프린터를 갖게 되었다. 그러나 소프 트웨어는 Xerox에 의해 공급받아서 그것을 바꿀 수는 없었다. 그들은 이런 특징을 놓지 않아서 우리가 할 수 없었던 것이다. 그래서 우리는 “반만 작동하는” 것을 만들어내야 했다. 그리고 우리 가 그것을 고칠 수는 있었으나 허용되지 않았기 때문에 매우 절망했다. 우리는 방해 받았다.
컴퓨터를 사용하는 많은 사람은 컴퓨터가 미스터리이고 그것이 하는 일을 모르겠다고 말한다. 어떻게 그들이 알 수 있을까? 그들은 사용하는 프로그램을 읽을 수 없다. 사람들이 어떻게 프로 그램이 쓰여지고, 그들이 하는 것을 프로그램이 어떻게 하는지를 배우게 하는 한가지 방법은 소 스 코드를 읽는 것이다.
그래서 나는 컴퓨터를 도구로서 여기는 사용자들의 생각이 소스코드를 비밀로 남겨두려는 결과 인 자기 만족적인 예언이 아닌지가 궁금했다.
이런 종류의 물질적 해로움과 동반하는 정신적 해로움은 자기 충족의 정신에 있다. 어떤 사람 이 많은 시간을 컴퓨터 시스템을 사용하는데 썼다면 그 컴퓨터 시스템의 형태는 그들이 살고 있 는 도시가 된다. 우리의 집과 가구가 있는 것처럼 우리가 사용하는 컴퓨터는, 우리에게 맞도록 변 화시킬 수 없다면, 우리가 사는 것을 결정한다. 그렇게 되면 우리의 삶은 실제로 다른 것들에게 지배를 받게 된다. 이것을 보는 사람은 어떤 식으로든 혼란스럽게 된다. “이것을 바꾸려고 하는 것은 아무 소용이 없다. 그것들은 항상 나쁘게만 된다. 어떤 포인트도 그것을 충돌시키지 않는다. 나는 나의 시간을 가질 것이다. 그것이 과도하게 되었을 때 나는 멀리 가있어서 그것을 더 이상 생각하지 않을 것이다. ” 비열정적인 그런 정신은 여러분이 공공심을 느꼈을 때 물건을 더 좋게 만들도록 허용되지 않아서 나타난 결과이다.
세 번째 해로운 수준은 소프트웨어를 개발하는 사람들 사이의 상호작용에 있다. 지식의 어떤 분야는 다른 사람들의 작업을 세웠을 때 진보되지만, 정보의 소유는 명백하게 누구나 그렇게 하 지 못하게 한다. 사람들이 다른 사람들의 작업을 세운다면, 소유심은 수그러 들 것이다. 그러면 그들은 그 분야의 새로운 출발을 확신하게 되고 그 분야의 발전을 보여줄 것이다.
그래서 우리는 다음과 같은 것을 볼 수 있다. 전에 얼마나 일을 했는가를 이해하는 이득이 없 이, 다른 회사들이 얼마나 많은 스프레드시트 시스템을 만들었는가? 그것은 사실이다. 처음으로 쓴 스프레드시트는 완전하지 않았다. 그것은 어떤 종류의 컴퓨터에서만 작동했고 가장 가능한 방 법으로는 일을 수행하지 못했다. 어떤 이들이 그것의 일부분을 다시 쓰려는 이유는 다양하다. 그 러나 그들이 정말로 향상시킬 부분을 다시 쓴다면 그것은 작업을 훨씬 덜 하게 만들 것이다. 여 러분은 시스템의 한 면을 더 잘 만드는 방법을 알고 있을지도 모르나 같은 시스템의 또 다른 면 은 잘 알지 못할 지도 모른다. 사실 이런 문제를 크게 다루는 것이 더 나았을 것이다. 여러분이 좋아하는 부분을 취하고 영감을 얻은 부분만을 다시 쓴다면, 여러분은 완전히 새로운 시스템을 쓰는 것보다 훨씬 덜한 작업으로 모든 방법에서 더 뛰어난 시스템을 가지게 될 것이다. 우리는 시스템이 완전히 다시 쓰여지면 이익을 볼 것이라는 것을 알지만, 그것은 여러분이 첫 번째로 오 래된 것을 읽을 때만 이다.
그리하여 프로그래밍 분야에 있는 사람들은 그들의 많은 시간을 허비하고, 우리가 원하는 것보 다 더 프로그래머를 위한 것을 만든다. 왜 프로그래머에겐 결점이 있는가? 왜냐하면 재능적인 부 로 프로그래머들은, 우리가 하면 두 배가 필요한 것처럼 보여도, 그들이 하는 일에 반을 허비한 다. 사람들이 지능적인 부의 구조를 지적할 때 이렇게 이야기한다. “거대한 고용의 통계량을 보아 라. 얼마나 이 사업이 큰가를 보아라.”실제로 증명된 것은 사람들이 많은 시간과 돈을 허비하고 있다는 것이다. 그들은 프로그래머의 생산성을 향상시키는 방법을 찾는 것에 대해 이야기할 때면 프로그래머의 생산성을 삭감시키는 확실한 것을 제거하는 것을 제외하고는 더 우월한 도구에 연 관된 것에 기뻐한다. 왜냐하면 그것은 고용된 프로그래머의 수를 감소시키기 때문이다. 거기에는 약간 정신분열증적인 것이 있다.
물질적인 해로움에 부합하는 정신적인 해로움은 과학적인 협동의 정신에 있다. 그것은 매우 강 해서 전쟁중인 마을에 있더라도 과학자들은 협동하기를 계속한다. 그들은 그들이 하고 있는 것이 전쟁과는 무관하고 오랜 기간 인류에게 이익을 준다고 믿기 때문이다. 최근에 사람들은 더 이상 인류를 위한 장기적인 이익에 신경을 쓰지 않는다.
프로그램의 사용을 방해하는 아이디어를 얻기 위해 우리가 샌드위치를 가졌다고 상상해보자. 여러분은 그것을 먹지만 그것은 소비되지 않는 것이다. 여러분과 다른 사람이 같은 샌드위치를 어떤 시간에 먹을 수 있다. 그것은 항상 원래대로 조장되도록 남아 있게 된다.
우리가 이 샌드위치로 하려는 가장 좋은 일은 배고픈 사람들이 있는 주위에 그것을 옮겨 놓는 것이다. 가능한 한 수개월 동안 그것을 가져와서 가능한 많은 사람들이 그것을 먹게 한다. 반드시 우리는 이 샌드위치를 먹는 값을 가지지 않아야 한다. 왜냐하면 사람들은 그것을 먹을 수 없어서 낭비하게 될 수도 있기 때문이다.
프로그램은 동시에 먹혀지는 많은 다른 장소에 있어서 차례로 다른 사람들에게 이용되기 때문 에 샌드위치와 같다. 그러나 이 샌드위치가 모두에게 어디에서나 영원히 먹기에 충분히 있기만 하면 누군가 그것을 소유할 것이라고 믿기 때문에 그런 일은 일어나지 않게 된다.
프로그램을 소유할 수 있다고 믿는 사람들은 일반적으로 이것의 변수에 두 줄을 놓는다. 첫 번 째 줄은 다음과 같다. “나는 그것을 썼고 그것은 나의 유년기이다. 나의 마음과 영혼이 그것에 있 다. 누가 나에게로부터 그것을 뺏아 갈 수 있는가? 그것이 어디로 가더라도 그것은 나의 것이다. 나의 것!!” 대부분 그것이 그들이 일하는 회사에 속한다고 말하는 것에 동의한다.
그래서 이것은 믿는 것이 중요하다고 여러분 자신에게 쉽게 말할 수 있는 것 중의 하나라고 본다. 그러나 여러분은 여러분 자신에게 전혀 문제가 되지 않는다고 쉽게 확신할 수 있을 것이다.