RMS 在 KTH (瑞典) 的演講,1986 年
理察·史托曼於 1986 年 10 月 30 日在瑞典斯德哥爾摩皇家理工學院 (Kungliga Tekniska Högskolan) 由學生社團 Datorföreningen Stacken 安排的演講稿。
注意:這是演講的輕微編輯稿。因此,它包含語無倫次之處,以及口語英語中自然但在印刷品中看起來很奇怪的措辭。目前尚不清楚如何在不損害原始演講的情況下將其更正為書面英語風格。
Rms: 看起來大家想讓我談論三件事。一方面,我認為在這裡為駭客俱樂部演講的最佳主題是過去在麻省理工學院的情況。是什麼讓人工智慧實驗室如此特別。但人們也告訴我,由於這裡的人與週一和週二會議上的人完全不同,我應該談談 GNU 計劃的進展,並且我應該談談為什麼軟體和資訊不能被擁有,這總共是三場演講,而且由於其中兩個主題各花了一個小時,這意味著我們將花費相當長的時間。因此,我想到也許我可以將其分成三個部分,人們可以到外面去參加他們不感興趣的部分,然後當我講完一個部分時,我可以說結束了,人們可以出去,我可以派 Jan Rynning 出去帶其他人進來。
[其他人說:“Janne, han trenger ingen mike.”(翻譯:“Janne,他不需要麥克風。”)]
Jan,你準備好跑出去帶其他人進來了嗎?
Jmr: 我正在找麥克風,有人告訴我它在這個鎖著的盒子裡。
Rms: 在過去人工智慧實驗室的舊時代,我們會拿一把大錘把它敲開,而破門而入將是對任何敢於鎖住人們需要使用的東西的人的一個教訓。幸運的是,我曾經學過保加利亞歌唱,所以我沒有麥克風也能應付自如。
總之,我應該設定這個系統來通知你們演講的各個部分,還是你們只是喜歡全程坐著聽完? [回答:耶~]
我開始編程是在 1969 年,我在紐約的一個 IBM 實驗室做的。之後我去了一所學校,那裡的電腦科學系可能和大多數學校一樣。有一些教授負責應該做什麼,也有人決定誰可以使用什麼。大多數人終端機都不夠用,但很多教授在自己的辦公室裡都有自己的終端機,這很浪費,但也符合他們的態度。當我參觀麻省理工學院的人工智慧實驗室時,我發現這裡的精神與那裡截然不同,令人耳目一新。例如:在那裡,終端機被認為是屬於每個人的,教授們如果把它們鎖在辦公室裡,就會發現他們的門被拆掉了。我實際上看到一輛手推車上放著一大塊鐵塊,那是用來破壞一位教授辦公室的門的,因為他竟然敢鎖住一台終端機。在那些日子裡,終端機非常少,系統可能只有五台顯示終端機,所以如果其中一台被鎖起來,那真是一場災難。
在接下來的幾年裡,我受到了這些想法的啟發,很多次我會爬過天花板或地板下,打開鎖著機房的門,讓人們可以使用裡面的機器,我通常會在身後留下一張紙條,向人們解釋他們不應該那麼自私地鎖門。鎖門的人基本上只考慮自己。他們當然有理由,他們認為有些東西可能會被偷,他們想把它們鎖起來,但他們不關心鎖在同一個房間裡的其他東西會影響到其他人。幾乎每次發生這種情況,一旦我提醒他們,鎖不鎖門不是他們一個人說了算,他們就能找到一個折衷的解決方案:找另一個地方放他們擔心的東西,一個可以鎖的桌子,另一個小房間。但重點是人們通常懶得去想。他們有這樣的想法:“這個房間是我的,我可以鎖起來,管他去死,”而這正是我們必須教導他們不要有的精神。
但這種開鎖的精神並不是孤立的,它是整個生活方式的一部分。人工智慧實驗室的駭客們真的熱衷於編寫好的程式和有趣的程式。正是因為他們渴望完成更多的工作,他們才不會容忍終端機被鎖起來,或者人們可以做的許多其他阻礙有用的工作的事情。士氣高昂、真正關心自己想做什麼的人,與只把它當作一份工作的人之間的區別。如果只是一份工作,誰會在乎僱用你的人是否愚蠢到讓你坐著等待,那是他們的時間,他們的錢,但在這樣的地方做不了多少事,而且在這樣的地方也沒什麼樂趣。
我們在人工智慧實驗室沒有的另一件事是檔案保護。電腦上根本沒有任何安全性。我們非常自覺地想要這樣。編寫不相容分時系統的駭客們認為,檔案保護通常被自封的系統管理員用來獲得凌駕於所有人之上的權力。他們不希望任何人能夠以這種方式獲得凌駕於他們之上的權力,因此他們沒有實施這種功能。結果是,每當系統中的某個地方出現故障時,你總是可以修復它。你永遠不必坐在那裡感到沮喪,因為根本沒有辦法,因為你確切地知道問題出在哪裡,而有人卻決定他們不信任你來做這件事。你不必放棄回家,等待有人在早上來修復系統,而你卻比他更清楚需要做什麼。
我們也不讓任何教授或老闆決定要做什麼工作,因為我們的工作是改進系統!我們當然會與使用者交談;如果你不這樣做,你就無法判斷需要什麼。但在這樣做之後,我們是最有能力看到哪些改進是可行的,而且我們總是在互相討論我們希望看到系統發生什麼樣的變化,以及我們在其他系統中看到哪些很棒的想法,並且可能能夠使用。因此,結果是我們有一個順利運作的無政府狀態,在我在那裡的經歷之後,我深信這是人們生活的最佳方式。
不幸的是,人工智慧實驗室以這種形式被摧毀了。多年來,我們一直擔心人工智慧實驗室會被麻省理工學院的另一個實驗室——電腦科學實驗室摧毀,該實驗室的主任有點像帝國建設者,竭盡全力在麻省理工學院內部升職,並擴大他的組織規模,他不斷試圖讓人工智慧實驗室成為他的實驗室的一部分,但沒有人願意按照他的方式做事,因為他認為人們應該服從命令等等。
但我們設法抵禦了這種危險,卻被我們從未預料到的東西摧毀了,那就是商業主義。在 80 年代初左右,駭客們突然發現,他們所做的事情現在有了商業利益。透過在一家私人公司工作,有可能致富。所有必要的只是停止與世界其他地方分享他們的工作,並摧毀麻省理工學院人工智慧實驗室,這就是他們所做的,儘管我盡了一切努力阻止他們。
基本上,除了我之外,人工智慧實驗室所有有能力的程式設計師都被挖走了,這造成的影響不僅僅是暫時的變化,它造成了永久性的轉變,因為它打破了駭客文化的連續性。新的駭客總是會被老駭客所吸引;那裡有最有趣的電腦和做最有趣事情的人,還有一種非常有趣的氛圍。一旦這些東西消失了,就沒有什麼可以向任何新人推薦這個地方了,所以新人不再來了。沒有人可以啟發他們,沒有人可以從他們那裡學習這些傳統。此外,也沒有人可以從他們那裡學習如何編寫好的程式。只有一群教授和研究生,他們真的不知道如何讓程式運作,你就無法學習如何讓好的程式運作。因此,我所熱愛的麻省理工學院人工智慧實驗室已經不復存在了,在與那些這樣做的人鬥爭了幾年,試圖懲罰他們之後,我決定我應該致力於創造一個具有這種精神的新社群。
但我必須面對的問題之一是專有軟體的問題。例如,實驗室在駭客離開後發生的一件事是,我們開發的機器和軟體再也無法維護了。軟體當然可以運作,而且如果沒有人更改它,它就會繼續運作,但機器卻不能。機器會壞掉,而且沒有人可以修理它們,最終它們會被丟棄。在過去,是的,我們有機器的維護合約,但這基本上是一個笑話。這是在人工智慧實驗室的專家駭客修復問題後獲得零件的一種方式。因為如果你讓現場服務人員來修復,他們需要幾天時間,而你不想這樣做,你希望它能運作。因此,那些知道如何做這些事情的人會直接去快速修復它,而且由於他們的 компетентность 是任何現場服務人員的十倍,他們可以做得更好。然後他們就會有損壞的板子,他們會把它們留在那裡,並告訴現場服務人員“把這些拿回去,給我們一些新的。”
在真正的舊時代,我們的駭客也曾經修改 Digital 公司的機器。例如,他們製造了用於 PDP-10 的分頁盒。現在我認為這裡 [在斯德哥爾摩] 也有人做這樣的事情,但在當時這是一件非常不尋常的事情。在更早的時代,也就是 1960 年代初,人們曾經修改電腦,添加各種新的指令和新的花哨的分時功能,因此麻省理工學院的 PDP-1 在 70 年代中期退役時,它的指令數量大約是 60 年代初 Digital 公司交付時的兩倍,而且它具有特殊的硬體排程器輔助功能和奇怪的記憶體映射功能,可以將單獨的硬體設備分配給特定的分時作業,以及許多我幾乎不太了解的東西。我認為他們還內建了一些擴展定址模式,他們添加了索引暫存器和間接定址,他們基本上將它從一台弱機器變成了一台半合理的機器。
我猜想,VLSI 的缺點之一是,向你的機器添加指令不再那麼可行了。
PDP-1 還有一個非常有趣的特性,那就是可以用非常少的指令編寫有趣的程式。比那之後的任何其他機器都少。例如,我相信著名的顯示駭客“munching squares”,它使正方形變大並分解成許多較小的正方形,然後這些正方形又變大並分解成更小的正方形。那是用大約五條指令在 PDP-1 上編寫的。許多其他漂亮的顯示程式可以用很少的指令編寫出來。
所以,那就是人工智慧實驗室。但是,除了無政府主義之外,駭客文化是什麼樣的呢?在 PDP-1 的時代,至少在最初,只有一個人可以使用機器。幾年後,他們編寫了一個分時系統,並為其添加了許多硬體。但在最初,你只需要登記一些時間。當然,現在從事官方專案的教授和學生總是在白天來。因此,想要獲得大量時間的人會登記晚上的時間,那時競爭較少,這就形成了駭客晚上工作的習慣。即使在分時系統出現後,晚上仍然更容易獲得時間,你可以獲得更多的週期,因為使用者較少。因此,想要完成大量工作的人仍然會在晚上來。但到那時,它開始變成另一種情況,因為你不再孤單,那裡還有一些其他駭客,因此它變成了一種社會現象。在白天,如果你來了,你可能會遇到不真正喜歡這台機器的教授和學生,而如果在晚上你來了,你會遇到駭客。因此,駭客在晚上來是為了與他們的文化在一起。他們還發展了其他傳統,例如在凌晨三點吃中國菜。我記得從唐人街回來的車上看到過許多日出。實際上,看到日出是一件非常美麗的事情,因為那是一天中最平靜的時刻。這是一天中準備睡覺的美好時光。在光線剛剛變亮,鳥兒開始鳴叫的時候走回家真是太好了,你可以真正感受到一種溫柔的滿足感,一種對你那天晚上所做工作的寧靜感。
我們開始的另一個傳統是在實驗室裡設置睡覺的地方。自從我第一次去那裡以來,實驗室裡總是至少有一張床。我可能比大多數人在實驗室裡住的時間更長一點,因為每隔一兩年,由於某種原因,我就沒有公寓,我會在實驗室裡住幾個月。我一直覺得它非常舒適,而且夏天也很涼爽。但是,在實驗室裡發現有人睡著並不是什麼不尋常的事情,這也是因為他們的熱情;你會盡可能長時間地熬夜駭客,因為你就是不想停下來。然後當你完全筋疲力盡時,你就會爬到最近的柔軟水平面上。一種非常隨意的氛圍。
但是,當駭客們全部離開實驗室後,這引起了人口結構的變化,因為不真正喜歡這台機器的教授和學生仍然和以前一樣多,因此他們現在是主要群體,他們非常害怕。他們說,沒有駭客來維護系統,“我們將面臨一場災難,我們必須使用商業軟體”,他們說“我們可以期望公司來維護它。” 事實證明他們完全錯了,但他們還是這樣做了。
那時正是一台新的 KL-10 系統應該到貨的時候,問題是,它會執行不相容分時系統還是執行 Digital 公司的 Twenex 系統。一旦那些可能支持使用 ITS 的駭客們離開了,學院派人士選擇執行商業軟體,這產生了幾個直接的影響。其中一些影響實際上並不是那麼直接,但它們是必然會發生的,任何思考過這個問題的人都會明白。
其中一件事是,該軟體的編寫質量很差,而且更難以理解;因此,人們更難以做出實際需要的更改。另一個是,該軟體帶有安全性,這不可避免地導致人們彼此之間的合作減少。在過去的 ITS 上,每個人都可以查看任何檔案、更改任何檔案被認為是可取的,因為我們有理由這樣做。我記得一件有趣的醜聞,有人發送了一個關於如何使用 Macsyma 的求助請求。Macsyma 是一個符號代數程式,是在麻省理工學院開發的。他向一位從事該程式的人發送了一個求助請求,幾個小時後,他收到了另一個人的回覆。他感到震驚,他發送了一條訊息“某某人一定在讀你的郵件,難道你們系統上的郵件檔案沒有得到適當的保護嗎?” “當然,我們系統上沒有任何檔案受到保護。有什麼問題嗎?你更快地得到了答案;你為什麼不高興?我們當然會讀取彼此的郵件,以便找到像你這樣的人並幫助他們。” 有些人就是不知道自己身在福中不知福。
但當然,Twenex 不僅具有安全性,並且預設開啟安全性,而且它的設計也基於安全性正在使用的假設。因此,有很多事情很容易做到,但可能會造成很大的損害,而唯一能阻止你意外地做這些事情的就是安全性。在 ITS 上,我們發展出了其他方法來阻止人們意外地做這些事情,但在 Twenex 上,你沒有這些方法,因為他們假設會實施嚴格的安全性,只有老闆才能擁有這樣做的權力。因此,他們沒有加入任何其他機制來防止意外發生。這樣做的結果是,你不能 просто 取消 Twenex 的安全性,然後得到你真正想要的東西,而且也不再有駭客來進行更改以加入這些其他機制,因此人們被迫使用安全性。大約在機器到位六個月後,他們開始發生一些政變。也就是說,一開始我們假設每個在實驗室工作的人都會擁有 wheel bit,這賦予了他們凌駕於所有安全措施之上的完全權力,但有時你會在某個下午進來,發現幾乎所有人的 wheel bit 都被關閉了。
當我發現這些情況時,我推翻了他們。第一次,我碰巧知道一位被列入精英階層的人的密碼,所以我能夠用它來重新開啟所有人的權限。第二次,他更改了他的密碼,他現在改變了他的立場,他現在是貴族黨的一員。因此,我不得不關閉機器,並使用非分時 DDT 來四處查看。我在監視器中四處查看了一段時間,最終弄清楚如何讓它自行載入並讓我修補它,以便我可以關閉密碼檢查,然後我重新開啟了一大堆人的 wheel bit,並發布了一條系統訊息。我必須解釋一下,這台機器的名字是 OZ,所以我發布了一條系統訊息,內容是:“又一次企圖奪取政權。到目前為止,貴族勢力已被擊敗——自由 OZ 電台。” 後來我發現“自由 OZ 電台”是 Firesign Theater 使用的東西之一。當時我並不知道。
但漸漸地,情況變得越來越糟,這只是系統的建構方式迫使人們要求越來越多的安全性。直到最終我被迫停止使用這台機器,因為我拒絕使用秘密密碼。自從密碼首次出現在麻省理工學院人工智慧實驗室以來,我就得出結論,為了捍衛我的信念,為了遵循我應該沒有密碼的信念,我應該始終確保使用盡可能明顯的密碼,並且我應該告訴所有人密碼是什麼。因為我不認為在電腦上設置安全性是真正可取的,我不應該願意幫助維護安全制度。在允許這樣做的系統上,我使用“空密碼”,而在不允許這樣做,或者這意味著你根本無法從其他地方登入的系統上,等等,我使用我的登入名稱作為我的密碼。這已經是你能想到的最明顯的了。當人們指出這樣一來,其他人可能會以我的身份登入時,我會說“是的,這就是我的想法,有人可能需要從這台機器上獲取一些資料。我想確保他們不會被安全性搞砸。”
我總是做的另一件事是,我總是關閉我的目錄和檔案上的所有保護,因為我不時地在那裡儲存一些有用的程式,如果程式中有錯誤,我希望人們能夠修復它。
但這台機器的設計也沒有考慮到所謂的“旅遊”現象。現在,“旅遊”是人工智慧實驗室的一個非常古老的傳統,它與我們的其他形式的無政府狀態相伴而生,那就是我們會讓外來者來使用機器。在任何人都可以走到機器前並以他喜歡的任何身份登入的時代,這是自動發生的:如果你來參觀,你可以登入,你可以工作。後來,我們將其稍微形式化了一下,作為一個公認的傳統,特別是當 Arpanet 開始並且人們開始從全國各地連線到我們的機器時。現在我們所希望的是,這些人實際上會學會編程,並且他們會開始更改作業系統。如果你對其他任何地方的系統管理員說這句話,他會感到恐懼。如果你建議任何外來者可以使用這台機器,他會說“但是如果他開始更改我們的系統程式怎麼辦?” 但對我們來說,當一個外來者開始更改系統程式時,這意味著他對成為社群的貢獻成員表現出了真正的興趣。我們總是會鼓勵他們這樣做。當然,首先是編寫新的系統實用程式,小型的,我們會檢查他們所做的工作並進行更正,然後他們會繼續為現有的、大型的實用程式添加功能。而這些程式已經存在了十年甚至十五年,隨著一位又一位工匠不斷添加新功能而逐步發展。
你可以說,這有點像法國的城市,在那裡你可以看到非常古老的建築,上面有幾百年後一直到現在的附加建築。在電腦領域,一個於 1965 年開始的程式基本上就是這樣。因此,我們總是希望遊客能夠成為系統維護人員,也許在那之後他們會被聘用,在他們已經開始從事系統程式並向我們展示他們有能力做好工作之後。
但是 ITS 機器還有一些其他的功能,可以幫助防止這種情況失控,其中之一就是“間諜”功能,任何人都可以監視其他任何人正在做的事情。當然,遊客們喜歡當間諜,他們認為這是一件很酷的事情,這有點調皮,你看,但結果是,如果任何遊客開始做任何會引起麻煩的事情,總會有人在監視他。因此,很快他的朋友們就會非常生氣,因為他們知道旅遊業的持續存在取決於遊客是否負責任。因此,通常會有人知道這個傢伙是誰,而且我們能夠讓他放過我們。如果我們做不到,那麼我們會做的是,我們會暫時完全關閉來自某些地方的訪問,當我們重新開啟訪問時,他就會離開並忘記我們了。就這樣持續了好多年好多年。
但是 Twenex 系統並不是為這種事情設計的,最終他們無法容忍我使用每個人都知道的密碼,遊客總是兩三個一起以我的身份登入,所以他們開始清除我的帳戶。在那個時候,我主要在其他機器上工作,所以最終我放棄了,不再開啟它了。就這樣結束了。我沒有以自己的身份登入那台機器…… [此時 RMS 被熱烈的掌聲打斷。] …為了。
但是當他們第一次獲得這個 Twenex 系統時,他們心中已經有了幾個他們想要做的更改。安全性工作方式的更改。他們還想讓機器同時連接到 ARPA 網路和麻省理工學院混沌網路,但事實證明他們無法做到這一點,他們找不到任何足夠 компетентный 的人來進行這些更改。不再有可用的天賦來做到這一點,而且它太難以更改了。該系統更難以理解,因為它的編寫質量太差,而且當然,Digital 公司不會做這些事情,因此他們認為商業系統基本上會自行維護的想法被證明是錯誤的。他們同樣需要系統駭客,但他們不再有吸引系統駭客的手段。而且現在在麻省理工學院,對駭客 ITS 感興趣的人比對駭客 Twenex 感興趣的人更多。
造成這種情況的最終原因是,Twenex 無法共享。Twenex 是一個專有程式,只有當你以某些令人討厭的方式對原始碼保密時,才允許你擁有原始碼,這給了它們一種糟糕的味道。除非一個人毫不在意(在電腦領域有些人就是這樣,有些人為了好玩什麼都願意做,而且不會花一分鐘時間去想他們是否在與其他人合作,但你必須非常毫不在意才會注意不到在這樣的程式上工作是一件多麼可悲的事情,這也是一個進一步的阻礙)。如果這還不夠,還有一個事實,那就是他們大約每年都會給你發布一個新版本,其中包含 50,000 行額外的程式碼,這些程式碼都是由猴子編寫的。因為他們通常遵循“百萬隻猴子打字,最終他們會想出一些有用的東西”的系統開發學派。
從我所看到的這些專有系統中發生的事情,我清楚地認識到,我們能夠擁有舊人工智慧實驗室精神的唯一方法是擁有一個自由的作業系統。擁有一個由自由軟體組成的系統,可以與任何人共享。這樣我們就可以邀請所有人加入並改進它。這就是導致 GNU 計劃的原因。我想我們已經到了演講的第二部分。
大約三年半前,我很清楚我應該開始開發一個自由軟體系統。我可以看到兩種可能的系統可以開發:一種:類似 LISP 機器的系統,本質上是一個就像剛剛開發出來的麻省理工學院 LISP 機器系統一樣的系統,除了是自由的,並且在通用硬體上執行,而不是在特殊的 LISP 機器上執行。另一種可能性是更傳統的作業系統,我很清楚,如果我製作一個傳統的作業系統,我應該使其與 Unix 相容,因為這將使各地的人們更容易切換到它。過了一會兒,我得出結論,我應該做後者,原因是,我看到你不可能在通用硬體上擁有真正像 LISP 機器系統那樣的東西。LISP 機器系統使用特殊的硬體加上特殊的可寫入微碼,以獲得良好的執行速度和對執行時錯誤(特別是資料類型錯誤)的強大檢測能力。為了使 LISP 系統在普通硬體上執行得足夠快,你必須開始做出假設。假設某個參數是正確的類型,然後如果不是,系統就會崩潰。
當然,你可以加入顯式檢查,如果你願意,你可以編寫一個穩健的程式,但事實是,當你將錯誤類型的參數饋送給函數時,如果你沒有加入檢查它的東西,你就會遇到諸如記憶體定址錯誤之類的問題。
所以結論就是,你需要讓 LISP 系統底層運行一些東西,來捕捉這些錯誤,並讓使用者能夠繼續執行,以及除錯發生的問題。最後我得出結論,如果我必須在更底層有一個作業系統,我不如就做一個好的作業系統——這是在作業系統和 LISP 之間的選擇,或者只是作業系統;因此我應該先做作業系統,而且我應該讓它與 Unix 相容。最後,當我意識到我可以將英語中最有趣的詞彙用作這個系統的名稱時,我就清楚必須做出什麼選擇了。而這個詞當然就是 GNU,代表 “GNU's Not Unix”(GNU 不是 Unix)。遞迴縮寫在麻省理工學院 (MIT) 附近的駭客社群中是一個非常古老的傳統。我相信它始於一個名為 TINT 的編輯器,意思是:“Tint Is Not Teco”(Tint 不是 Teco),後來又經歷了諸如 “SINE” 代表 “SINE Is Not Emacs”(SINE 不是 Emacs),以及 FINE 代表 “Fine Is Not Emacs”(FINE 不是 Emacs),和 EINE 代表 “Eine Is Not Emacs”(EINE 不是 Emacs),以及 ZWEI 代表 “Zwei Was Eine Initially”(ZWEI 最初是 EINE),最終演變成了 GNU。
我想說的是,自從大約兩年半前我真正開始 GNU 的工作以來,我已經完成了超過一半的工作。當我準備開始這個專案時,我首先開始四處尋找我可以找到的免費資源。我發現了一個有趣的、可移植的編譯器系統,它被稱為“自由大學編譯器套件”,我當時想,名字都這樣取了,也許我可以擁有它。所以,我發訊息給開發它的人,詢問他是否願意將它提供給 GNU 專案,他說“不,大學可能是自由的,但他們開發的軟體不是”,但他接著說他也想要一個與 Unix 相容的系統,而且他想為它編寫一個核心,所以為什麼我不編寫實用程式,然後它們可以與他的專有編譯器一起發行,以鼓勵人們購買該編譯器。我認為這太卑鄙了,所以我告訴他,我的第一個專案將會是一個編譯器。
當時我對最佳化編譯器沒有真正的了解,因為我從未在這方面工作過。但我拿到了一個編譯器,當時有人告訴我它是免費的。它是一個名為 PASTEL 的編譯器,作者說它的意思是 “off-color PASCAL”(變色的 PASCAL)。
Pastel 是一種非常複雜的語言,包括參數化型別和顯式型別參數以及許多複雜的功能。這個編譯器當然是用這種語言編寫的,並且有許多複雜的功能來最佳化這些功能的使用。例如:該語言中的型別 “string” 是一個參數化型別;如果你想要特定長度的字串,你可以說 string(n)
;你也可以只說 string
,參數會從上下文中決定。現在,字串非常重要,並且許多使用它們的結構必須快速運行,這意味著它們必須有很多功能來偵測諸如:當字串的宣告長度是一個在整個函式中都已知為常數的參數時,為了儲存該值並最佳化它們將產生的程式碼,許多複雜的事情。但我確實在這個編譯器中看到了如何進行自動暫存器分配,以及關於如何處理不同種類機器的想法。
好吧,既然這個編譯器已經編譯了 PASTEL,我需要做的就是為 C 語言新增一個前端,我這樣做了,並為 68000 新增一個後端,我預期這將是我的第一個目標機器。但我遇到了一個嚴重的問題。因為 PASTEL 語言的定義是不需要你在使用某個東西之前宣告它,宣告和使用可以以任何順序排列,換句話說:Pascal 的 forward
宣告已經過時了,因為這樣做就必須讀取整個程式,並將其保存在核心記憶體中,然後一次性處理它。結果是編譯器中使用的中間儲存空間,所需的記憶體大小,與你的檔案大小成正比。這也包括堆疊空間,你需要大量的堆疊空間,我發現的結果是:我可用的 68000 系統無法運行編譯器。因為它是一個糟糕版本的 Unix,它給你一個類似 16K 字的堆疊限制,儘管機器中有六兆位元組,你只能有 16Kw 的堆疊或類似的東西。當然,為了產生它的衝突矩陣,以查看哪些暫時值與哪些其他值同時存在衝突或存活,它需要一個位元的二次矩陣,對於大型函式,那會達到數十萬位元組。所以我設法除錯了編譯器大約十個階段中的第一個階段,交叉編譯到那台機器上,然後發現第二個階段永遠無法運行。
當我思考如何處理這些問題,並想知道我是否應該嘗試修復它們還是編寫一個全新的編譯器時,我以一種迂迴的方式開始開發 GNU Emacs。GNU Emacs 是 GNU 系統的主要發行部分。它是一個可擴展的文字編輯器,很像我十年前開發的原始 Emacs,只是這個版本使用真正的 LISP 作為其擴展語言。編輯器本身是用 C 語言實作的,LISP 直譯器也是如此,因此 LISP 直譯器是完全可移植的,而且你不需要編輯器外部的 LISP 系統。編輯器包含它自己的 LISP 系統,並且所有的編輯命令都是用 LISP 編寫的,以便它們可以為你提供範例,讓你了解如何編寫自己的編輯命令,以及從哪裡開始,這樣你就可以將它們更改為你真正想要的編輯命令。
在那年的夏天,大約是兩年前,我的一個朋友告訴我,因為他在 Gosling Emacs 的早期開發工作,他從 Gosling 發給他的一則訊息中獲得了許可,可以發行他的版本。Gosling 最初建立了他的 Emacs 並免費發行,並讓許多人幫助開發它,基於 Gosling 自己在手冊中的話,他將遵循我最初開始使用原始 Emacs 的相同精神。然後他背叛了所有人,對它加上了版權,讓人們承諾不重新發行它,然後將它賣給了一家軟體公司。我後來與他個人的往來表明,他完全像你從那段歷史中所期望的那樣懦弱和卑鄙。
但在任何情況下,我的朋友給了我這個程式,我的意圖是更改頂層的編輯命令,使它們與我習慣的原始 Emacs 相容。並使它們處理所有數值參數的組合等等,以及擁有我想要的所有功能。但在進行了一小段時間後,我發現該編輯器的擴展語言,稱為 MOCKLISP,不足以完成這項任務。我發現我必須立即更換它,才能完成我計劃做的事情。在我之前,我曾想過有一天也許可以用真正的 LISP 取代 MOCKLISP,但我發現必須先完成這件事。現在,MOCKLISP 被稱為 MOCK 的原因是,它沒有任何類型的結構資料型別:它沒有 LISP 列表;它沒有任何類型的陣列。它也沒有 LISP 符號,即帶有名稱的物件:對於任何特定的名稱,只有一個物件,這樣你就可以輸入名稱,並且總是得到相同的物件。這極大地阻礙了許多種類程式的編寫,你必須透過複雜的字串操作來完成事情,而這些事情實際上並非如此進行。
所以我編寫了一個 LISP 直譯器並將其取代了 MOCKLISP,並且在這個過程中,我發現我必須重寫編輯器的許多內部資料結構,因為我希望它們成為 LISP 物件。我希望 LISP 和編輯器之間的介面是乾淨的,這意味著諸如編輯器緩衝區、子程序、視窗和緩衝區位置等物件都必須是 LISP 物件,這樣對它們進行操作的編輯器原始操作實際上可以作為帶有 LISP 資料的 LISP 函式來呼叫。這意味著我必須重新設計所有這些物件的資料格式,並重寫所有對它們進行操作的函式,結果是在大約六個月後,我幾乎重寫了編輯器中的所有內容。
此外,由於用 MOCKLISP 編寫東西非常困難,所有用 MOCKLISP 編寫的東西都非常不乾淨,透過重寫它們以利用真正 LISP 的強大功能,我可以使它們更強大、更簡單、更快。所以我這樣做了,結果是,當我開始發行這個程式時,只有一小部分來自我收到的東西。
此時,Gosling 認為他將程式賣給的公司質疑我的朋友發行它的權利,而訊息在備份磁帶上,所以他找不到它。而 Gosling 否認曾給予他許可。然後發生了一件奇怪的事情。他正在與這家公司談判,似乎該公司主要關心的是不要發行任何類似他們正在發行的東西。你看,他還在發行,而他工作的那家公司 Megatest,仍在發行他給我的同樣的東西,這實際上是舊版本的 Gosling Emacs,帶有他的修改,因此他將與他們達成協議,他將停止發行那個,並轉而使用 GNU Emacs,然後他們將承認他確實擁有許可,然後據說每個人都會很高興。而這家公司正在與我洽談,希望發行 GNU Emacs,當然是免費的,但也銷售各種支援協助,他們想僱用我來幫助完成這項工作。因此,他們後來改變主意並拒絕簽署該協議,並在網路上發布訊息說我不允許發行該程式,這真是奇怪。他們實際上並沒有說他們會做任何事情,他們只是說不清楚他們是否有一天可能會做些什麼。而這足以嚇跑人們,以至於沒有人再使用它了,這是一件令人難過的事情。
(有時我認為,也許我一生中可以做的最好的事情之一是:找到一大堆屬於商業機密的專有軟體,然後開始在街角分發副本,這樣它就不再是商業機密了,也許這會是一種比我實際編寫新自由軟體更有效的方式來為人們提供新的自由軟體;但每個人都太懦弱了,甚至不敢拿。)
所以我被迫重寫所有剩餘的部分,我這樣做了,花了大約一個半星期的時間。所以他們贏得了巨大的勝利。而且在那之後,我當然永遠不會以任何方式與他們合作。
然後在 GNU Emacs 相當穩定之後,總共花了大約一年半的時間,我開始回到系統的其他部分。我開發了一個除錯器,我稱之為 GDB,它是一個 C 程式碼的符號除錯器,最近已進入發行階段。現在這個除錯器在很大程度上是遵循 DBX 的精神,DBX 是 Berkeley Unix 附帶的除錯器。命令由一個表示你想做什麼的詞組成,後面跟著參數。在這個除錯器中,命令都可以縮寫,常用的命令有單字元縮寫,但總是允許任何獨特的縮寫。有可擴展的 HELP 功能,你可以輸入 HELP,後面跟著任何命令甚至子命令,並獲得關於如何使用該命令的詳細描述。當然,你可以輸入任何 C 語言的表達式,它會印出該值。
你還可以做一些在符號 C 除錯器中不常見的事情,例如:你可以引用任何記憶體位址上的任何 C 語言資料型別,以檢查該值或分配該值。因此,例如,如果你想在某個位址的單字中儲存一個浮點值,你只需說:“給我這個位址上的 FLOAT 或 DOUBLE 型別的物件”,然後分配它。你可以做的另一件事是檢查過去檢查過的所有值。每個檢查過的值都會被放入“值歷史記錄”中。你可以透過其數字位置引用歷史記錄中的任何元素,或者你可以輕鬆地使用美元符號引用最後一個元素。這使得追蹤列表結構變得容易得多。如果你有任何類型的 C 語言結構,其中包含指向另一個結構的指標,你可以執行類似 PRINT *$.next
的操作,意思是:“從你上次顯示給我的東西中取得 next 欄位,然後顯示指標指向的結構。”你可以重複該命令,每次你都會看到列表中的下一個結構。然而,在我見過的所有其他 C 除錯器中,唯一的方法是每次輸入更長的命令。當這與只需輸入換行符即可重複你發出的最後一個命令的功能結合使用時,它變得非常方便。只需為你想看到的列表中的每個元素輸入換行符即可。
除錯器中還有顯式可設定的變數,數量不限。你輸入美元符號,後面跟著一個名稱,這就是一個變數。你可以為這些變數分配任何 C 語言資料型別的值,然後你可以在以後檢查它們。這些變數的用途之一是:如果有一個你將要檢查的特定值,並且你知道你將會經常引用它,那麼與其記住它在歷史記錄中的編號,不如給它一個名稱。當你設定條件斷點時,你可能也會發現它們很有用。條件斷點是許多符號除錯器中的一個功能,你可以說“當你到達程式中的這一點時停止,但前提是某個表達式為真。”除錯器中的變數允許你將程式中的變數與你保存在除錯器變數中的該變數的先前值進行比較。它們可以使用的另一個用途是用於計數,因為畢竟,賦值在 C 語言中是表達式,因此你可以執行 $foo+=5
將 $foo
的值增加五,或者只執行 $foo++
。你甚至可以在條件斷點中執行此操作,因此這是一種廉價的方式,讓它在第十次擊中斷點時中斷,你可以執行 $foo--==0
。大家都明白嗎?遞減 foo,如果它現在是零,則中斷。然後你將 $foo
設定為你想要跳過的次數,然後讓它繼續。你也可以使用它來檢查陣列的元素。假設你有一個指標陣列,那麼你可以執行
PRINT X[$foo++]
但首先你執行
SET $foo=0
好的,當你執行它 [指向 PRINT
表達式] 時,你會得到 X 的第零個元素,然後你再次執行它,它會得到第一個元素,假設這些是指向結構的指標,那麼你可能會在那裡放一個星號 [在 PRINT 表達式中的 X 之前],每次它都會印出陣列元素指向的下一個結構。當然,你可以透過輸入換行符來重複此命令。如果單一重複不足以滿足需求,你可以建立一個使用者定義的命令。你可以說 Define Mumble
,然後你給出一些命令列,然後你說 end
。現在就定義了一個 Mumble
命令,它將執行這些行。將這些定義放在命令檔案中非常有用。你可以在每個目錄中都有一個命令檔案,當你以該目錄作為你的工作目錄啟動除錯器時,它會自動載入。因此,對於每個程式,你可以定義一組使用者定義的命令,以一種有用的方式存取該程式的資料結構。你甚至可以為你的使用者定義的命令提供文件,以便它們像內建命令一樣由 help
功能處理。
這個除錯器中另一個不尋常的事情是能夠從堆疊中捨棄框架。因為我相信,不僅能夠檢查你正在除錯的程式中發生的事情很重要,而且能夠以任何可以想像的方式更改它也很重要。這樣,在你發現一個問題並知道問題出在哪裡之後,你可以修復問題,就好像該程式碼是正確的一樣,然後找到下一個錯誤,而無需先重新編譯你的程式。這不僅意味著能夠靈活地更改你的程式中的資料區域,而且還意味著能夠更改控制流程。在這個除錯器中,你可以透過說
SET $PC=<some number>
因此,你可以設定程式計數器。你也可以設定堆疊指標,或者你可以說
SET $SP+=<something>
如果你想將堆疊指標增加一定的量。但除此之外,你還可以告訴它從程式中的特定行開始,你可以將程式計數器設定為特定的原始碼行。但是,如果你發現你錯誤地呼叫了一個函式,而你實際上根本不想呼叫該函式怎麼辦?假設,那個函式太糟糕了,以至於你真正想做的是退出它,然後手動完成該函式應該完成的事情。為此,你可以使用 RETURN
命令。你選擇一個堆疊框架,然後你說 RETURN
,它會導致該堆疊框架以及其中的所有框架都被捨棄,就好像該函式現在正在返回一樣,你也可以指定它應該返回的值。這不會繼續執行;它假裝返回已經發生,然後再次停止程式,這樣你就可以繼續更改其他內容。
將所有這些東西放在一起,你就對程式中發生的事情有了相當好的控制。
此外,一個稍微有趣的事情:C 語言有字串常數,如果你在你正在除錯器中計算的表達式中使用字串常數會發生什麼?它必須在你正在除錯的程式中建立一個字串。嗯,它確實會這樣做。它設定對該除錯程式中的 MALLOC 的呼叫,讓 MALLOC 運行,然後重新獲得控制權。因此,它會隱式地找到一個放置字串常數的位置。
最終,當這個除錯器在真正的 GNU 系統上運行時,我打算在除錯器中加入一些功能,以檢查在其下運行的程序的全部內部狀態。例如,檢查記憶體對應的狀態,哪些頁面存在,哪些是可讀的,哪些是可寫的,以及檢查下級程式的終端機狀態。已經有一個命令位元;這個除錯器與 Unix 上的除錯器不同,它為除錯器和你正在除錯的程式完全分開維護終端機狀態,以便它適用於在原始模式下運行的程式,它適用於執行中斷驅動輸入的程式,並且還有一個命令可以讓你找到一些關於你正在除錯的程式實際使用的終端機設定的資訊。我相信,一般來說,除錯器應該允許你找出下級程序中發生的所有事情。
GNU 系統還有兩個主要的現有部分。一個是新的 C 編譯器,另一個是 TRIX 核心。
新的 C 編譯器是我今年自去年春天以來編寫的東西。我最終決定我必須丟棄 PASTEL。這個 C 編譯器使用了一些從 PASTEL 中汲取的想法,以及一些從亞利桑那大學可移植最佳化器中汲取的想法。他們有趣的想法是透過產生簡單的指令來處理許多不同種類的機器,然後在目標機器允許的情況下,將幾個簡單的指令組合成一個複雜的指令。為了統一地做到這一點,他們以代數符號表示指令。例如,ADD 指令可以像這樣表示
r[3]=r[2]+4
這將是它們編譯器內部的一個表示,表示指令是將暫存器二的內容,加上四,並將其儲存在暫存器三中。透過這種方式,你可以表示任何機器的任何可能的指令。因此,它們實際上確實以這種方式表示了所有指令,然後當需要嘗試組合它們時,它們會透過將一個表達式替換為另一個表達式來做到這一點,從而為組合指令建立一個更複雜的代數表達式。
有時,根據第一個指令的結果是否有任何進一步的用途,可能需要建立一個帶有兩個賦值運算子的組合指令。一個用於這個值 [指向???],另一個用於這個值 [指向???],並將第二個指令中的內容替換進去。但如果這個值只使用了一次,你可以在替換它之後消除它;就不再需要計算它了。因此,正確地進行替換,檢查中間的指令是否沒有更改這些值以及其他類似的事情,實際上是有些複雜的。當你支援諸如自動遞增和自動遞減定址等功能時,我現在就是這樣做的,你也必須對這些功能進行各種檢查,以檢查你所做的事情是否不保留值的情況。
但在檢查完所有這些事情之後,然後你將替換的組合表達式放入模式比對器中,該模式比對器會識別你選擇的目標機器的所有有效指令。如果它被識別,則你將這兩個指令替換為組合指令,否則你將它們保持原樣。它們的技術是以這種方式組合兩個或三個透過資料流程相關的指令。
在亞利桑那編譯器中,它們實際上將東西表示為像這樣的文字字串,並且它們的編譯器非常慢。首先,我有一些想法,只是使用它們的編譯器並對其進行更改,但對我來說很清楚,我必須完全重寫它才能獲得我想要的速度,所以我已經重寫了它,以使用列表結構表示來表示所有這些表達式。像這樣的東西
(set (reg 2)
(+ (reg 2)
(int 4)))
這看起來像 Lisp,但這些語義與 LISP 不完全相同,因為這裡的每個符號都是特別識別的。定義了一組特定的固定符號,即你需要的所有符號。並且每個符號都有特定的參數型別模式,例如:reg
總是帶有一個整數,因為暫存器是有編號的,但 +
接受兩個子表達式,等等。並且每個表達式也都有一個資料型別,它基本上說明它是固定型別還是浮點型別,以及它有多長(以位元組為單位)。如果需要,它可以擴展到處理其他東西。
我進行自動暫存器分配的方式是,當我最初產生這個程式碼時,以及當我進行組合和所有這些事情時,對於每個可以放入暫存器的變數,我都會分配一個我稱之為偽暫存器編號的東西,這個編號從十六或任何太高而不能成為你的目標機器的真實暫存器的編號開始。因此,真實暫存器的編號是零到十五或任何數字,而高於該編號的是偽暫存器。然後,編譯器的最後一部分包括遍歷並將所有偽暫存器更改為真實暫存器。它再次建立一個衝突圖,它查看哪些偽暫存器在同一時間點處於活動狀態,它們當然不能進入同一個真實暫存器,然後它嘗試盡可能多地將偽暫存器打包到真實暫存器中,並根據它們的重要性優先順序對它們進行排序。
最後,它必須修正程式碼以解決各種問題,例如當偽暫存器不適合真實暫存器時發生的問題,這些偽暫存器必須放入堆疊插槽中。在某些機器上發生這種情況時,某些指令可能會變得無效。例如,在 68000 上,你可以將暫存器新增到記憶體中,也可以將記憶體新增到暫存器中,但你不能將一個記憶體位置新增到另一個記憶體位置中。因此,如果你有一個 ADD 指令,並且你正要前往 68000,並且這兩個東西最終都進入了記憶體,那麼它就無效了。因此,最後的階段會遍歷並根據需要將東西複製到暫存器中和從暫存器中複製出來,以修正這些問題。
索引暫存器也可能出現問題。如果你嘗試透過某個東西進行索引,那麼大多數情況下,如果索引量在記憶體中,則該程式碼將會變得無效,除非在某些機器上的少數情況下,你可以透過間接定址來做到這一點。在你對索引暫存器執行自動遞增的情況下,你可能必須將值複製到暫存器中,執行指令,然後將遞增的值複製回它實際存在的記憶體插槽中。
有很多細節需要處理,我還沒有完成實作所有使它真正完全高效所需的細節。
這個編譯器目前的工作方式是,有一個剖析器,它將 C 程式碼轉換為有效的語法樹,並用 C 資料型別資訊進行註解。然後是另一個階段,它會查看該樹並產生像這樣的程式碼 [類似 LISP 的程式碼]。然後是幾個最佳化階段。一個是處理諸如跨越跳轉、跳轉到跳轉、跳轉到 .+1
等問題,所有這些都可以立即簡化。然後是一個常見的子表達式識別器,然後是尋找基本區塊,並執行資料流程分析,以便它可以告訴每個指令哪些值在該指令中使用,並且之後不再使用。並且還將每個指令連結到它使用的值的產生位置,因此如果我有一個指令產生偽暫存器 R[28],然後稍後又有另一個指令使用 R[28],並且它是使用 R[28] 的第一個位置,我使第二個指令指回第一個指令,並且這個指標用於控制嘗試組合指令。你不會組合相鄰的指令,你會組合一個使用值的指令和產生該值的指令。即使中間有其他指令,它們也無關緊要,你只需要檢查它們以確保它們沒有做任何干擾的事情。然後在組合器之後是動態暫存器分配器,最後是一些將其轉換為組合語言程式碼的東西。
在亞利桑那編譯器中,指令識別器是用 LEX 產生的。你的機器描述只是一個 LEX 程式,LEX 會將其轉換為 C 函式,以將有效指令識別為字串。我擁有的是一個特殊的用途決策樹,它是從以這種語法編寫的機器描述中產生的,就好像它是 LISP 一樣。這個識別器被用作編譯器許多不同部分的子常式。
目前,這個編譯器的運行速度與 PCC 大致相同。如果你告訴它不要執行複雜的暫存器分配,它的運行速度會明顯更快,在這種情況下,它分配暫存器的方式與 PCC 相同。在其超級複雜模式下,它在暫存器分配方面比 PCC 做得更好,並且我觀察到,對於 VAX,它產生了我見過的任何 VAX 上 C 編譯器產生的最佳程式碼。
對於 68000,程式碼仍然不理想。我可以看見早期階段做了一些不是最好的事情的地方,因為它無法充分向前看。它在早期階段有一個選擇,它會做它認為會是最好的事情,但實際上,如果它做了另一個選擇,後來的階段實際上足夠聰明,可以做得更好。但早期階段不知道後期階段會做什麼,所以我還有更多的工作要做在其中一些事情上。
有時這會導致它不必要地釋放暫存器。因為當東西最終進入記憶體並且需要將它們複製到暫存器中時,它需要獲得暫存器才能將它們複製進去。這意味著取得它已經分配給的暫存器,並將這些暫時量踢到堆疊插槽中。當然,現在這些東西在記憶體中而不是在暫存器中,這可能會使更多指令無效,因此它必須再次又再次檢查。有時它認為它必須將東西複製到暫存器中,但實際上它不必這樣做,因此它可能會釋放太多東西,因此沒有使用所有它可以使用的暫存器。
[問題:你有 32000 的程式碼產生器嗎?] 還沒有,但同樣,它不是程式碼產生器,你只需要機器描述即可。以這種 [類似 LISP 的] 形式描述的所有機器指令的列表。因此,事實上,除了實作關於哪些參數可以放在暫存器中以及哪種類型的暫存器中的約束的想法之外,這對於 68000 是需要的,而對於 VAX 則不需要,將這個編譯器從 VAX 移植到 68000 只花了幾天的時間。所以它非常容易移植。
編譯器目前產生組合語言程式碼,並且它可以產生 DBX 想要的格式或 GDB 特殊內部格式的除錯資訊。我想說的是,這個編譯器唯一需要做的工作是在三個方面。一:我必須新增一個“效能分析”功能,就像 Unix 編譯器擁有的那樣。二:我必須使這些暫存器分配的東西更聰明,這樣我才能停止看到輸出中出現愚蠢的東西。三:有各種錯誤,有些東西還沒有正確處理,儘管它已經正確地編譯了自己。我預計這只需要幾個月的時間,然後我將發布編譯器。
系統的另一個相當大的部分是核心。 [問題:暫停一下?] 啊,是啊,我想我們忘記了休息時間。要不我先說完關於核心的事情,這應該只需要大約五分鐘,然後我們可以休息一下。
現在,對於核心,我計劃使用一個名為 TRIX 的系統(據我所知,它不代表任何東西),它是麻省理工學院 (MIT) 作為研究專案開發的。這個系統是基於遠端程序呼叫的。因此,程式被稱為網域。每個網域都是一個位址空間和各種能力,而能力無非是呼叫網域的能力。任何網域都可以建立“能力埠”來呼叫它,然後它可以將這些埠傳遞給其他網域,並且呼叫系統和呼叫另一個使用者網域之間沒有區別。事實上,你無法分辨你擁有的是哪個。因此,很容易讓設備由其他使用者程式實作。檔案系統可以由使用者程式透明地實作。跨網路通訊也是透明的。你認為你正在直接呼叫另一個網域,但實際上你正在呼叫網路伺服器網域。它會取得你在呼叫中提供的資訊,並透過網路將其傳遞到另一個伺服器程式,然後該伺服器程式會呼叫你嘗試與之交談的網域。但你和另一個網域都認為這是隱式發生的。
TRIX 核心可以運行,並且它具有一定程度的 Unix 相容性,但它需要更多。目前,它有一個檔案系統,該檔案系統在磁碟上使用與舊 Unix 檔案系統相同的結構。這使得除錯變得更容易,因為他們可以使用 Unix 設定檔案,然後他們可以運行 TRIX,但該檔案系統不具備我認為必要的任何功能。
我認為必須加入的功能包括:版本號碼、取消刪除、關於檔案何時、如何以及在哪裡備份到磁帶上的資訊、以及檔案的原子性取代。我認為在 Unix 系統中,當檔案正在寫入時,你已經可以查看寫入了什麼內容,這點很好,例如,你可以使用 tail
來查看進度,這非常好。而且如果程式在部分寫入檔案後死掉,你可以看到它產生了什麼。這些事情都很好,但是,部分寫入的輸出永遠不應該被視為你預期最終得到的完整輸出。該檔案的先前版本應該繼續保持可見,並供所有嘗試使用它的人使用,直到新版本完全且正確地完成。這表示新版本應該在檔案系統中可見,但不能以它應該擁有的名稱顯示。它應該在完成時重新命名。順帶一提,這在 ITS 系統中就會發生,雖然在那裡每個使用者程式都必須明確地執行此操作。為了與使用者程式的 Unix 相容性,這必須隱式地發生。
我有一個奇怪又複雜的方案,試圖讓版本號碼與現有的 Unix 使用者程式相容。這個想法是,如果你以普通方式僅指定名稱,你可以指定一個檔案名稱,而版本號碼是隱含的。但是,如果你希望精確地指定名稱,無論是因為你想明確說明要使用的版本,還是因為你根本不想要版本,你都可以在名稱末尾加上一個點。因此,如果你給出檔案名稱 FOO
,它的意思是「搜尋 FOO 的現有版本,並採用最新的版本。」但如果你說 FOO.
,它的意思是「完全使用名稱 FOO,別的都不要。」如果你說 FOO.3.
,它的意思是「完全使用名稱 FOO.3」,這當然是 FOO 的第三個版本,別的版本都不要。在輸出時,如果你只說 FOO
,它最終會建立 FOO 的新版本,但如果你說 FOO.
,它會寫入一個名為 FOO 的檔案。
現在,在弄清楚所有這些細節,以及看看是否有任何潛在的問題,以及是否有一些 Unix 軟體實際上會崩潰,儘管餵給它們帶有句點的名稱等等,以試圖使其獲得相同的行為,這其中涉及一些挑戰。
我預期當你開啟一個用於輸出的檔案,其名稱以句點結尾時,你應該立即開啟該名稱,這樣你就可以得到與 Unix 相同的行為,部分寫入的輸出會立即可見;然而,當你輸出一個不以句點結尾的名稱時,新版本應該在你關閉它時才出現,而且只有在你明確關閉它的情況下。如果它因為工作終止、系統崩潰或任何類似原因而關閉,它應該以不同的名稱存在。
這個想法可以與「星號匹配」連結起來,方法是說,不以句點結尾的名稱會與所有沒有版本號碼的名稱進行匹配,所以如果某個目錄中有像這樣的檔案
foo.1 foo.2 bar.8
如果我說 *
,那等同於
foo bar
因為它會取得所有名稱並去除它們的版本,並取得所有不同的名稱。但如果我說 *.
,那麼它會取得所有精確的名稱,在每個名稱後加上一個點,並與它們匹配。所以這給了我所有現有版本的所有個別名稱。類似地,你可以看到 *.c
和 *.c.
之間的區別,前者 [第一個] 本質上會給你所有 .c
檔案的無版本參考,而後者 [第二個] 會給你所有版本... 嗯,實際上不會,你必須說 *.c.*.
;我還沒有完全弄清楚這裡的細節。
另一件事,它不是使用者可見的功能,而且肯定可以加入,是檔案系統的容錯性。也就是說,透過以正確的順序將所有資訊寫入磁碟,安排你可以隨時按下「halt」而永遠不會因此損壞磁碟上的檔案系統。如何做到這一點是眾所周知的,我無法想像為什麼有人會忽略它。另一個想法是進一步的冗餘資訊。我不確定我是否會這樣做,但我有一些想法,如何在每個檔案中儲存其所有名稱,從而使得如果磁碟上的任何目錄遺失,可以從磁碟其餘內容重建它。
我也認為我知道如何使檔案的任何部分能夠原子性地更新。因此,如果你想以這樣的方式替換檔案的某個子範圍,使其包含新資料,那麼任何讀取檔案的嘗試都只會看到舊資料,或只會看到新資料。我相信我可以做到這一點,甚至不需要任何鎖定。
對於網路支援,我最終打算為這個系統實作 TCP/IP。我也認為可以使用 KERMIT 來獲得實際上等同於 UUCP 的東西。
我相信 shell 已經被寫出來了。它有兩種模式,一種模仿 BOURNE shell,另一種在同一個程式中模仿 C-shell。我還沒有收到它的副本,我也不知道我必須在這上面做多少工作。還有許多其他工具存在。MAKE 存在,LS 存在,有一個名為 BISON 的 YACC 替代品正在發行。有一個非常接近 LEX 的東西存在,但它並不完全相容,需要一些工作。而且,總體而言,剩餘要做的事情比已經完成的事情少得多,但我們仍然需要很多人來幫忙。
人們總是問我「它什麼時候會完成?」我當然不知道它什麼時候會完成,但那是問我的錯誤問題。如果你計劃為它付費,那麼你想確切知道你會得到什麼以及何時得到,這是有道理的。但既然你不會為它付費,你應該問的正確問題是「你如何幫助它更快完成?」我有一個專案列表,它在 MIT 的一個檔案中,有興趣幫忙的人可以寄信到這個網際網路地址給我,我會回覆一個專案列表。(我想知道這是否有效(看著黑板))。這可讀嗎?這是「RMS@GNU.ORG」(只要跟著彈跳球。)現在讓我們休息一下,休息之後,我會說一些真正有爭議的事情。所以現在不要離開。如果你現在離開,你將會錯過真正的體驗。
[這裡我們休息了 15 分鐘]
有人要求我宣布你如何取得 GNU 軟體的副本。嗯,當然一種方法是如果你認識有副本的朋友,你可以複製它,但如果你不認識有副本的朋友,而且你沒有連上網際網路,你無法 FTP 下載它,那麼你總是可以在自由軟體基金會訂購發行磁帶並寄一些錢給他們。當然,自由程式與自由發行並不相同。稍後我會詳細解釋這一點。
這裡我有一本 EMACS 手冊,是精美印刷的版本。它經過照相排版,然後膠印印刷。雖然你也可以從 EMACS 發行版中包含的原始碼自行列印它,但你可以從自由軟體基金會取得這些副本。你可以稍後過來看看這個,而且這個也包含一張訂購單,你可以從中複製一些資訊,而且這張 [正面] 照片有時也很受歡迎。這個 [指向一個被騎著 GNU 的 RMS 追逐的人形] 是一個害怕的軟體囤積者,我稍後會談論他。
軟體是一種相對較新的現象。人們大約在三十年前開始發行軟體。大約在二十年前才有人想到把它變成一門生意。這是一個沒有關於人們如何做事或任何人擁有什麼權利的傳統領域。而且對於你可以從哪些其他生活領域類比傳統,有幾種想法。
歐洲的許多教授喜歡的一種類比是程式和數學之間的類比。程式有點像一個大型公式。現在,傳統上沒有人可以擁有數學公式。任何人都可以複製和使用它們。
對普通人來說最有意義的類比是食譜。如果你仔細想想,你在日常生活中擁有的最像程式的東西就是食譜,它是做某事的指示。不同之處在於食譜是由人遵循的,而不是由機器自動遵循的。食譜的原始碼和目標碼之間確實沒有區別,但它仍然是最接近的東西。而且沒有人被允許擁有食譜。
但是,選擇的類比是與書籍的類比,書籍有版權。為什麼做出這個選擇?因為那些從做出這個特定選擇中獲得最大利益的人被允許做出決定。撰寫程式的人,而不是使用程式的人,被允許決定,他們以完全自私的方式做出決定,結果他們把程式設計領域變成了一個醜陋的領域。
當我進入這個領域時,當我 1971 年開始在 MIT 工作時,我們開發的程式可能不被分享的想法甚至沒有被討論過。史丹佛大學和卡內基美隆大學以及每個人,甚至是迪吉多公司也是如此。當時迪吉多公司的作業系統是免費的。而且我不時從迪吉多系統獲得程式片段,例如 PDP-11 交叉組譯器,我將它移植到 ITS 上運行,並添加了許多功能。那個程式沒有版權。
只是在七十年代後期,這種情況才開始改變。我們擁有的分享精神給我留下了極其深刻的印象。我們正在做一些我們希望有用的事情,並且很高興人們可以使用它。所以當我開發第一個 EMACS 時,人們想要開始在 MIT 之外使用它,我說它屬於 EMACS「公社」,為了使用 EMACS,你必須成為公社的成員,這意味著你有責任貢獻你所做的所有改進。對原始 EMACS 的所有改進都必須送回給我,以便我可以將它們併入更新版本的 EMACS 中,以便社群中的每個人都可以從中受益。
但是當 SCRIBE 在卡內基美隆大學開發出來,然後賣給一家公司時,這種情況開始被破壞。這對許多大學的我們來說非常令人不安,因為我們看到這是一個擺在每個人面前的誘惑,不合作是如此有利可圖,而我們這些仍然相信合作的人沒有武器來試圖強迫人們與我們合作。顯然,人們會一個接一個地背叛並停止與社會其他成員合作,直到只剩下我們這些良知非常堅定的人仍然合作。而這就是發生的事情。
程式設計領域現在已經變成一個醜陋的領域,每個人都憤世嫉俗地思考著透過對這個領域的其他人和使用者不好可以賺多少錢。
我想確立擁有軟體的做法在物質上是浪費的,在精神上對社會有害,而且是邪惡的。所有這三件事都是相互關聯的。它在精神上是有害的,因為它使每個接觸電腦的社會成員都參與到一種顯然對其他人來說是物質浪費的做法中。而且每次你為了自己的利益做某事,而你知道這件事對其他人的傷害大於對你的幫助時,你都必須變得憤世嫉俗才能在你的腦海中支持這樣的事情。而且它是邪惡的,因為它是有意浪費社會中完成的工作並導致社會衰敗。
首先,我想解釋一下試圖擁有軟體和其他通常有用的資訊所造成的各種危害,然後我將繼續駁斥為支持這種做法而提出的論點,然後我想談談如何對抗這種現象,以及我如何對抗它。
擁有資訊的想法在三個不同的層次上是有害的。在三個不同的層次上是物質上有害的,而且每種物質上的危害都對應著一種精神上的危害。
第一個層次只是它阻礙了程式的使用,它導致更少的人使用程式,但事實上,為更少的人製作程式並不需要更少的工作。當你對程式的使用定價時,這是一種誘因,這是這些軟體囤積者喜歡使用的詞,價格是人們不使用程式的誘因,這是一種浪費。例如,如果只有一半的人因為程式定價而使用它,那麼程式就浪費了一半。相同的工作量只產生了一半的財富。
現在事實上,你不需要做任何特別的事情來讓程式傳播到所有想要使用它的人,因為他們可以自己完美地複製它,而且它會傳播到每個人。在你編寫完程式後,你所要做的就是坐下來,讓人們做他們想做的事情。但事實並非如此;相反,有人故意試圖阻礙程式的分享,事實上,他不僅試圖阻礙它,他還試圖向其他人施壓,讓他們幫忙。每當使用者簽署保密協議時,他基本上就出賣了他的同胞使用者。他沒有遵循黃金法則,說:「我喜歡這個程式,我的鄰居也會喜歡這個程式,我希望我們倆都有它」,而是說:「好吧,給我吧。管他我的鄰居!我會幫助你阻止它傳播給我的鄰居,只要給我它!」而這種精神就是造成精神傷害的原因。那種說「管他我的鄰居,給我一份副本」的態度。
在我遇到有人說他們不會讓我擁有某些東西的副本,因為他們簽署了一些保密協議之後,當有人要求我簽署類似的東西時,我知道那是錯誤的。我不能對別人做讓我自己感到如此憤怒的事情。
但這只是其中一個層次的危害。第二個層次的危害發生在人們想要更改程式時,因為沒有一個程式真正適合所有想要使用它的人。正如人們喜歡改變食譜一樣,例如少放點鹽,或者他們可能喜歡加入一些青椒,所以人們也需要更改程式,以便獲得他們需要的效果。
現在,軟體所有者並不真正在乎人們是否可以更改程式,但阻止人們對他們的目的是有用的。通常,當軟體是專有的時,你無法取得原始碼,你無法更改它,這會導致程式設計師浪費大量工作,以及使用者的大量挫敗感。例如:我有一個朋友告訴我,她在一家銀行工作了幾個月,她是一名程式設計師,正在編寫一個新程式。現在,有一個市售程式幾乎是正確的,但它只是不太符合他們的需求,事實上,就其現狀而言,它對他們來說是無用的。要使其執行他們所需的功能,所需的更改量可能很小,但由於該程式的原始碼不可用,因此這是不可能的。她不得不從頭開始,浪費大量工作。我們只能推測世界上有多少程式設計師以這種方式浪費他們的時間。
然後還有這樣一種情況,程式雖然足夠應付,但用起來不舒服。例如:當我們第一次在 MIT 擁有一台圖形印表機時,我們自己編寫了軟體,我們加入了許多很棒的功能,例如,當你的列印工作完成時,它會給你發送訊息,如果印表機沒紙了,而你的工作仍在佇列中,它也會給你發送訊息,以及許多其他我們想要的功能。然後我們得到了一台更好的圖形印表機,最早的雷射印表機之一,但隨後軟體是由全錄公司提供的,我們無法更改它。他們不願意加入這些功能,我們也無法加入,所以我們不得不湊合著使用「半成品」。而且知道我們已經準備好、願意並且能夠修復它,但卻不被允許,這非常令人沮喪。我們被破壞了。
然後還有所有使用電腦的人說電腦對他們來說是個謎,他們不知道 [如何] 它們工作。好吧,他們怎麼可能知道?他們無法閱讀他們正在使用的程式。人們學習程式應該如何編寫,或者程式如何執行他們所做的事情的唯一方法是閱讀原始碼。
所以我只能懷疑,將電腦僅僅視為工具的用戶的想法,實際上是否是一種自我實現的預言,是將原始碼保密的做法的結果。
現在,伴隨這種物質危害的精神危害是自給自足的精神。當一個人花費大量時間使用電腦系統時,該電腦系統的配置就變成了他居住的城市。正如我們的房屋和家具的佈局方式決定了我們在其中生活的方式一樣,我們使用的電腦系統也是如此,如果我們不能更改我們使用的電腦系統來適應我們,那麼我們的生活實際上就受到他人的控制。看到這一點的人在某種程度上會變得士氣低落:「試圖改變這些事情是沒有用的,它們總是會很糟糕。甚至沒有必要去煩惱它。我只是打發時間... 當結束時,我會離開並盡量不再去想它。」那種精神,那種缺乏熱情,是源於當你有公德心時,卻不被允許讓事情變得更好的結果。
第三個層次的危害在於軟體開發人員之間的互動。因為任何知識領域的進步,在人們可以建立在他人工作之上時,進展最快,但資訊的所有權明確地旨在阻止任何人這樣做。如果人們可以建立在他人工作之上,那麼所有權就會變得不明確,所以他們確保該領域的每個新進入者都必須從頭開始,從而大大減緩了該領域的發展。
所以我們可以看看:有多少個試算表系統是由不同的公司製作的,所有這些系統都沒有從理解以前是如何完成的而受益?是的,沒錯,第一個編寫的試算表並不完美。它可能只在某些類型的電腦上運行,而且它並沒有以最佳方式完成某些事情。所以有各種各樣的原因導致某些人想要重寫它的部分內容。但如果他們只需要重寫他們真正想要改進的部分,那就會減少很多工作。你可能會看到如何使系統的某個方面更好,你可能看不到如何使同一個系統的另一個方面更好,事實上,你可能很難做到同樣好。現在,如果你可以拿走你喜歡的部分,只重做你有靈感的部分,那麼你就可以擁有一個在各方面都更好的系統,而且比現在編寫一個全新的系統花費的工作量要少得多。我們都知道,一個系統通常可以從完全重寫中受益,但前提是你必須先閱讀舊系統。
因此,程式設計領域的人們已經發展出一種浪費大量時間的方式,從而表面上造成了對程式設計師的需求比我們實際需要的更多的假象。為什麼會出現程式設計師短缺?因為有了智慧財產權,程式設計師們安排浪費他們所做工作的一半,所以我們似乎需要兩倍的程式設計師。因此,當人們指出智慧財產權系統並說「看看龐大的就業統計數據,看看這個產業有多大」時,這實際上證明的是人們正在浪費大量的金錢和時間。如果他們談論尋找提高程式設計師生產力的方法,如果這涉及優越的工具,他們很樂意這樣做,但要透過消除明確地降低程式設計師生產力的事情來提高程式設計師生產力,他們是反對的。因為那會減少受僱的程式設計師人數。這裡面有點精神分裂。
與這種層次的物質危害相對應的精神危害是科學合作的精神,這種精神曾經非常強大,以至於即使在交戰國家的科學家也會繼續合作,因為他們知道他們所做的事情與戰爭無關,它只是為了人類的長遠利益。如今,人們不再關心人類的長遠利益。
為了了解阻礙程式使用的感覺是什麼樣的,讓我們想像一下,我們有一個三明治,你可以吃它,而且它不會被消耗掉。你可以吃它,另一個人可以吃它,同一個三明治,任何次數,它都會永遠保持和原來一樣的營養豐富。
最好的做法,我們應該對這個三明治做的事情是,把它帶到有飢餓人口的地方;盡可能多地把它送到嘴邊,這樣它就能餵飽盡可能多的人。無論如何,我們不應該對吃這個三明治定價,因為那樣人們就買不起它,它就會被浪費掉。
程式就像這個三明治,但更勝一籌,因為它可以同時在許多不同的地方被吃掉,被不同的人一個接一個地使用。這就像這個三明治足以永遠餵飽每個地方的每個人,但這是不允許發生的,因為有人認為他應該擁有它。
現在,那些相信他們可以擁有程式的人,通常會提出兩種論點來支持這一點。第一個是「是我寫的,它是我的精神、我的心、我的靈魂的孩子。誰能把它從我身邊奪走?無論它走到哪裡,它都是我的,我的,我的!!」嗯,有點奇怪的是,他們中的大多數人簽署協議,聲明它屬於他們工作的公司。
所以我認為這是你可以很容易地說服自己相信很重要的事情之一,但你也可以很容易地說服自己它根本不重要。
通常,這些人使用這個論點來要求控制人們如何更改程式的權利。他們說:「任何人都不能搞砸我的藝術作品。」好吧,想像一下,發明你計劃烹飪的菜餚的人有權控制你如何烹飪它,因為這是他的藝術作品。你想不放鹽,但他會說「喔,不。我設計了這道菜,它必須有這麼多鹽!」 「但我的醫生說我吃鹽不安全。我該怎麼辦?」
顯然,使用程式的人更接近事件本身。程式的使用直接影響到他,而它只與編寫程式的人有某種抽象的關係。因此,為了讓人們盡可能多地控制自己的生活,必須由使用者來決定這些事情。
他們提出的第二個論點是經濟方面的。「人們如何獲得程式設計的報酬?」他們說,這裡面確實存在一點真正的問題。但他們說的很多話都是混淆。而混淆之處在於,說「如果我們想要有很多人從事程式設計,我們必須安排他們不需要以任何其他方式謀生」與說「我們需要有目前的系統,你需要透過程式設計致富」完全不同。僅僅賺取維持生計的工資和賺取程式設計師(至少在美國)現在賺的錢之間存在很大差異。他們總是說:「我將如何吃飯?」但真正的問題不是「他會吃飯嗎?」而是「他將如何吃壽司?」 「我將如何擁有遮風避雨的屋頂?」但真正的問題是「他如何才能負擔得起公寓?」
目前的系統是由投資軟體開發的人選擇的,因為它讓他們有可能賺取最多的錢,而不是因為它是任何人都能想出錢來支持系統開發工作的唯一方法。事實上,即使在最近的十到十五年前,以其他方式支持軟體開發也很常見。例如,那些在七十年代初甚至是免費的迪吉多作業系統,是由那些為他們的工作獲得報酬的人開發的。許多有用的程式是在大學開發出來的。如今,這些程式通常被出售,但在十五年前,它們通常是免費的,但人們為他們的工作獲得了報酬。
當你擁有像程式、像無限三明治、像道路這樣,必須建造一次的東西時,一旦它被建造出來,你使用它的次數多少幾乎無關緊要,使用它沒有任何成本,通常如果我們不對使用它定價會更好。而且我們現在開發了很多這樣的東西,並付錢給人們建造。例如,外面的所有街道。很容易找到願意在沒有報酬的情況下編寫程式的人;真的不可能找到願意在沒有報酬的情況下建造街道的人。建造街道不像程式設計那樣具有創造性和樂趣。但我們有很多街道在那裡,我們確實想辦法付錢給他們,而且我們現在的做法比我們說:「讓我們讓公司去建造街道並設置收費站,然後每次你轉彎到另一條街道時,你都要支付另一筆通行費。然後那些選擇了放置街道的好地方的公司就會盈利,而其他公司就會破產。」要好得多。
每當有人想出透過囤積某物來賺大錢的方法時,就會發生一件有趣的事情。在此之前,你可能已經有很多人對這個領域充滿熱情和渴望工作,唯一的問題是他們如何才能獲得任何形式的生計。如果我們想到數學家,例如,想要成為純數學家的人比任何資助純數學家的人都多得多。即使你確實獲得了資助,你也不會得到很多,他們生活得不好。對於音樂家來說,情況更糟。我看到一個關於平均音樂家,即平均將大部分時間投入到成為音樂家的人,在麻薩諸塞州賺多少錢的統計數據;大約是收入中位數的一半或更少。這幾乎不足以維持生計,這很困難。但是有很多他們在嘗試這樣做。然後,不知何故,當普遍有可能透過做某事獲得豐厚報酬時,所有這些人就消失了,人們開始說「除非他們獲得那麼高的報酬,否則沒有人會做它。」
我看到了這種情況在程式設計領域發生。那些曾經在人工智慧實驗室工作,領取很少的薪水卻熱愛它的人,現在做夢也想不到會以低於每年五萬美元的價格工作。發生了什麼事?當你將賺大錢的可能性懸在人們面前時,當他們看到做類似工作的其他人獲得如此高的薪水時,他們會覺得他們也應該得到同樣的薪水,因此沒有人願意繼續以舊的方式工作。在這件事發生之後,很容易認為付給人們很多錢是唯一的可能方式,但事實並非如此。如果賺大錢的可能性不存在,你就會有人願意接受以少量金錢來做它,特別是當它是具有創造性和樂趣的事情時。
現在我看到人工智慧實驗室這個獨特的世界被摧毀了,我也看到販售軟體是摧毀它的內在因素之一,而且我也看到了,如同我之前解釋的,為了擁有那樣的社群,你必須擁有自由軟體。但更深入思考後,我意識到囤積軟體以各種方式傷害整個社會,尤其會迫使人們出賣鄰居,並導致社會衰敗。這種精神就像人們在街上看到有人被刺傷卻袖手旁觀,不告訴任何人一樣。我們可以不斷地在周遭的許多公司看到這種精神。我很清楚自己有一個選擇,我可以成為那個世界的一份子,對自己的人生感到不快樂,或者我可以決定與之對抗。所以我決定與之對抗。我奉獻我的職業生涯來重建軟體分享社群,試圖終結囤積通用資訊的現象。GNU 系統是達成這個目標的手段。它是達成社會目標的技術手段。我希望透過 GNU 系統,讓使用者對抗軟體囤積者的威脅,如同接種疫苗一般。
現在,囤積者基本上聲稱擁有讓個人電腦變得無用的權力。以前在美國,大約五十年前,最常見的是黑手黨,他們會去商店和酒吧,特別是以前非法的酒吧。他們會走上前說:「最近這附近很多地方都發生火災。你不會希望你的店也燒起來吧?我們可以保護你免於火災,你只需要每個月付我們一千美元,我們就會確保你的店裡不會發生火災。」這被稱為「保護費勒索」。現在我們遇到類似的情況,有人會說:「你有一台不錯的電腦,而且你有一些正在使用的程式。如果你不希望這些程式消失,如果你不希望警察來找你麻煩,你最好付我一千美元,我就給你一份附帶授權的程式副本,」這被稱為「軟體保護費勒索」。
實際上,他們所做的只是妨礙其他人完成該做的事情,但他們對自己以及對我們其他人假裝他們正在提供有用的功能。我希望當那個軟體黑手黨的人走過來說:「你希望你電腦上的那些程式消失嗎?」使用者可以說:「我不再害怕你了。我有自由的 GNU 軟體,你現在對我無可奈何。」
現在,人們有時會為擁有軟體提出一種理由,那就是為了激勵人們生產東西。我基本上支持私人企業的概念,也支持希望透過生產其他人喜歡使用的東西來賺錢的想法,但這在軟體領域已經變得失控。生產專有程式與生產相同的程式並使其自由,對社會的貢獻是不同的。因為編寫程式只是對社會的潛在貢獻。對社會財富的真正貢獻只有在程式被使用時才會發生。如果你阻止程式被使用,那麼貢獻實際上並未發生。因此,社會需要的貢獻不是這些每個人都有強烈動機去製作的專有程式,我們真正想要的貢獻是自由軟體,因此我們的社會正變得失控,因為它激勵人們去做沒有太大用處的事情,卻沒有激勵人們去做有用的事情。因此,私人企業的基本理念並未被遵循,你甚至可以說這個社會是神經質的。畢竟,當個人鼓勵他人在他人身上產生對該個人不利的行為時,我們稱之為神經質。這裡的社會正以這種方式運作,鼓勵程式設計師去做對社會不利的事情。
我很不尋常。我寧願相信自己是社會的好成員,並且正在做出貢獻,也不願感覺自己成功地在剝削社會,這就是為什麼我決定做我所做的事情。但至少每個人都會因為他們領取薪水做著實際上沒有用的事情而感到有些困擾。因此,讓我們停止為這種激勵人們做錯事的想法辯護,至少嘗試提出一些安排來鼓勵人們做正確的事情,那就是製作自由軟體。
謝謝各位。
[在這次演講之後,RMS 回答了約一個小時的問題。在這個版本中,我只收錄了極少數的問題和答案。錄音帶狀況不佳,而且我沒有時間對所有內容進行適當的處理。]
- 問: 有人試圖找你麻煩嗎?
答: 唯一一次有人試圖找我麻煩的是那些所謂的、自稱擁有 Gosling Emacs 的人。除此之外,他們沒有任何理由這樣做,所以他們也做不了什麼。順帶一提,我想提醒大家注意人們使用語言的方式,試圖鼓勵人們思考某些想法,而不要思考其他想法。這個領域中許多常用的術語都是自稱軟體擁有者的人所選擇的,目的是試圖鼓勵你將軟體視為類似於可以擁有的實體物品,並忽略它們之間的差異。其中最明顯的例子就是「盜版」這個詞。請拒絕使用「盜版」這個詞來形容那些希望像好公民一樣與鄰居分享軟體的人。
我忘了告訴你們這件事:著作權的概念是在印刷術發明之後才出現的。在古代,作者們互相自由地抄襲,這不被認為是錯誤的,甚至非常有用:某些作者的作品之所以能夠倖存下來,即使只是片段,也是因為其中一些作品被大量引用在其他倖存的作品中。
這是因為書籍是一次複製一本的。製作十本副本比製作一本副本困難十倍。然後印刷術被發明了,這並沒有阻止人們手抄書籍,但與印刷相比,手抄太過麻煩,以至於幾乎是不可能的。
當書籍只能透過大量生產來製作時,著作權才開始變得有意義,而且它也沒有剝奪讀者的自由。作為不擁有印刷機的公眾成員,你無論如何都無法複製書籍。所以你並沒有因為有著作權而失去任何自由。因此,著作權被發明出來,並且由於技術變革而在道德上變得有意義。現在正在發生相反的變化。個人複製資訊變得越來越容易,我們可以預見技術的最終進步是使複製任何種類的資訊成為可能。[錄音帶結束中斷]
因此,我們又回到了與古代相同的情況,當時著作權沒有意義。
如果我們考慮我們的財產觀念,它們來自於實體物品。實體物品基本上符合守恆定律。是的,沒錯,我可以把粉筆折成兩半,這不是重點,而且它會被磨損,它會被消耗。但基本上這是一張椅子 [指向一張椅子]。我不能只是彈一下手指就變出兩張椅子。獲得另一張椅子的唯一方法是像第一張椅子一樣建造它。這需要更多的原材料,需要更多的人工生產,而我們的財產觀念是為了使道德意義符合這些事實而演變出來的。
對於任何人都可複製的資訊,事實是不同的。因此,適合的道德態度也不同。我們的道德態度來自於思考做某些事情會對人們有多少幫助,以及會對人們造成多少傷害。對於實體物品,你可以來拿走這張椅子,但你不能來複製它。如果你拿走了椅子,它就不會產生任何東西,所以沒有藉口。如果有人說:「我努力製作了這張椅子,而且只有一個人可以擁有這張椅子,那最好是我,」我們或許會說:「是啊,這說得通。」當有人說:「我把位元刻錄在這張磁碟上,只有一個人可以擁有這張磁碟,所以別想拿走它,」嗯,這也說得通。如果只有一個人要擁有這張磁碟,那最好是擁有這張磁碟的人。
但是當另一個人走過來說:「我不會傷害你的磁碟,我只是要神奇地製作出另一張一模一樣的磁碟,然後我就會拿走它,然後你就可以像以前一樣繼續使用這張磁碟,」嗯,這就像有人說:「我有一個神奇的椅子複製機。你可以繼續享受你的椅子,坐在上面,隨時想要它時它都在那裡,但我也會有一張椅子。」這很好。
如果人們不必建造,他們可以彈一下手指就複製它們,那真是太棒了。但是這種技術的變革不適合那些希望能夠擁有個別副本並從個別副本中獲利的人。這種想法只適用於守恆的物體。因此,他們盡最大努力將程式呈現得像實體物品一樣。你有沒有想過,當你去軟體商店購買程式副本時,它為什麼會裝在看起來像書本的東西裡?他們希望人們認為他們獲得的是實體物品,而不是意識到他們真正獲得的是數位可複製資料的形式。
電腦歸根究柢是什麼?不過是一台通用機器嗎?你可能研究過通用圖靈機,這種機器可以模仿任何其他機器。通用機器如此優秀的原因是因為你可以讓它模仿任何其他機器,而且方向可以被複製和更改,這正是你無法對實體物品做的事情。而這些正是軟體囤積者想要阻止公眾做的事情。他們想要享受技術變革(通用機器)帶來的好處,但他們不希望公眾獲得這種好處。
本質上,他們試圖保留「實體物品時代」,但它已經過去了,我們應該使我們的正確與錯誤觀念與我們所處世界的實際情況同步。
- 問: 所以這歸結為資訊的所有權。你認為在任何情況下,你認為擁有資訊是正確的嗎?
答: 對於那些不具有普遍用途,或具有個人性質的資訊,我會說這是可以接受的。換句話說,不是關於如何做事的資訊,而是關於你打算做什麼的資訊。對他人來說,其唯一價值是投機性的資訊,也就是說,他們可以從你那裡拿走一些錢,但他們實際上無法用它創造任何東西。我認為將這類東西保密和控制是完全合理的。
但在創意資訊方面,也就是人們可以使用或享受的資訊,而且擁有它的人越多,它就會被更多人使用和享受,我們應該始終鼓勵複製。