by 蕭永慶, 1995. 本文為初稿, 歡迎來信指教 --yhsiao@cae.wisc.edu
Project GNU 的起源,來自十年前, Richard Stallman, 目前為 Project GNU 的計劃主持人, 在網路討論區的一篇文章( http://www.cs.pdx.edu/~trent/gnu/begin, 10 years ago on Internet )。Richard Stallman 在這篇文章中明白的說明了他為什麼 要發起這計劃。 這篇文章就是後來的 GNU Manifesto, GNU 宣言。 更詳細的背景資料可參考工研院電通所楊景翔先生的UNIX使用手冊中最 後一章的引言。 Richard Stallman 後來成立 Free Software Foundation 全力投入 Project GNU 的工作, 是 FSF 的終身義工。
GNU 是 GNU's Not Unix 的縮寫, 在 Manifesto 內 Stallman 提到 UNIX 雖然不是最好的作業系統,但是至少不會太差,而他自信有能力把 UNIX 不足的地方補全, 使它成為一個優良的作業系統, 就是名為 GNU 的作業系統。
GNU 當初的策略就是先發展 UNIX 現有的程式。(因為確定 GNU 會是一 個與 UNIX 相容的系統,而 UNIX 下的標準介面都已經蠻完備了, 只要 照著標準完成的程式, 將來 GNU Kernel (註一)完成後,立刻可以有 所有 UNIX 的公用程式),因此會先有 emacs,gcc 等 utility 出來。 其中 gcc 更是 Project GNU 能夠自立更生的主力(不需要依靠 Non-Free Software 來產生 / 編譯自己),如今程式發展工具成熟了, 再來大家屏息以待的,就是 GNU Kernel,也就是 Hurd 了。 一旦 Hurd 完成,GNU 就是一套能夠自我開機,真正自給自足,完整的作業系統。
註一:一套 OS 就是週邊的公用程式加上一個 kernel,即系統資源 管理程式。
Hurd 是架構在 Mach 這個 micro kernel 上的作業系統核心。 Micro kernel 的由來是當初 BSD ( UNIX )發展到最後,Kernel 越寫越大, 每次要多加新的功能,就要更換並 reboot 系統, 變的很不模組化,也 沒有彈性。Micro kernel 的觀念也應運而生,目的就是把 kernel 中最 基本的部份、最與硬體相關的部份抽取出來,形成 micro kernel。其他 的部份則降到 user program 的層次, 稱為 server。 可以說 micro kernel 把硬體抽象 / 封裝起來,形成一個虛擬機器,server 則在這個 虛擬機器上跑,提供傳統 OS 所應該提供的功能。Server 有兩種,一種 叫 Si ngle Server,一種叫 MultiServer。
Single Server 就是一個 Server 就完成了所有 OS kernel 該提供的功 能。CMU 卡內基大學當初的 micro kernel 計劃,就是先把 4.3 BSD 拆 成兩部份,一個 micro kernel ( Mach )和一個 Single Server。 因 為一個 micro kernel 可以執行不少 Server,所以這的確是個蠻大的進 步, 修改 OS 後可以執行另一個 Server 來觀察結果, 不用每次都 reboot 整個系統。但是這樣的設計還是有盲點,就是要更動正在使用中 的 kernel,還是要終止( shutdown )該 Server,再執行新的 Server 。 充其量只是一個較 portable 的 OS 而已。因此 Multi Server 應運 而生。 MS 把 kernel 拆開成幾個小單元,彼此間互相合作。比如說有 一 network server, 用來處理 tcp/ip 網路, file system server, exec server 用來執行程式等等。 如此一來,可以增加彈性,比如說一 個 exec server 可以執行 Linux 的 binary。 一個可以執行(載入) FreeBSD 的 binary,數個 file system server,分別處理不同的 file system 等,而且也減少置換 server 需要 reboot 的機會。 Hurd 就是 這樣子的一組 server(s) (詳情請看 Toward a New Strategy of OS Design, http://www.cs.pdx.edu/~trent/gnu/hurd-paper.html)
Hurd 目前以 i386 PC 為發展平台, 以 CMU 的 Mach 為 micro kernel , 但是以後會使用 Utah (猶他)大學的 Mach4,也就是 flexmach 為 micro kernel,flexmach 是 fast&flexible 之意。micro kernel 帶引 入了不少的 overhead。 Flexmach 則引進了一些新的 idea, 讓 micro kernel 不僅方便,也有好的 performance。由於 Hurd 是架在 mach 上 之故, 所以只要 Mach 能在那些機器上跑,Hurd 也能很快的 suppport 該硬體架構,換句話說,GNU 就可以是該機型電腦的 OS。
Hurd 其實不是 UNIX,真正讓程式設計師感覺 Hurd 是 UNIX 的, 是它 的 Library,glibc -- Hurd 的 C Library。 Hurd 的 glibc 用來提供 / 處理與 UNIX 相容的系統呼叫,並轉換成 Hurd 系統呼叫, 讓使用者 感覺 Hurd 是 UNIX 的, 則是那些依照 UNIX 標準( IEEE 1003.1, POSIX.1 )寫成的公用程式(這就是所謂的 personality )
gcc 是 FSF 最有名的程式之一,目前是 C,C++.Pbkectove C 三合一的 compiler。 gcc 的作法是有一個先導程式( front end ),把 C,C++ , Objective C 的語法轉換成一個內部的型式(一個類似 lisp 的高階 組合語言,稱為 RTL,或者說先把高階語言轉成一個想像的 CPU 的組合 語言),再由 backend 對這個虛擬組合語言進行最佳化,最後產生目的 CPU ( target )的組合語言碼( UNIX 的哲學是 compiler 產生組合 語言碼,再由 assembler 產生機器碼),如此架構下,只要寫好一個新 的語言的 frontend, 那麼因為 gcc backend 己經支援不少架構,該語 言立刻就可以在不少不同架構下的機器編繹執行。 有了一種新的 CPU, 也只要完成把虛擬 ASM 轉換成真正 asm 的部份, 立即就有多種語言的 最佳化編譯器。 除了 C 家族之外, gcc 還有 Fortran 90, ada9x, Pascal 的 frontend,其中 Fortran 是最晚問世的 frontend, 版本號 碼 0.5。
Project GNU 的 GUI 介面會架構在 MIT X Window 上。自從 Next 公司 公布 OpenStep 標準,把她的 Next Step OS API 公開之後, 引起一群 人的興趣, 決定為 GNU 發展一個更完整的 GUI 介面,即 GNU Step 並 希望能夠通過 Next 公司 OpenStep test suite 確認符合 OpenStep 的 標準。Next 公司自從放棄硬體事業之後,成為一個專業的系統軟體公司 ,原來的作業系統已 port (移植)到 i486, HP-PA RISC 上,而 GUI 介面也有 port 到 Solaris,OSF/1, NT,Window 95 的計劃。 簡言之, OpenStep 可以算是NextStep中與OS無關, 物件導向化的應用程式介面。
OpenStep 由 3 部份組成, Display Postscript, Foundation Kit, AppKit。 GNU Step 計畫修改 ghostscript, 來完成 Display Postscript 的功能。 PostScript 原來是用在印表機的一個繪圖語言。 DPS 則是讓 PostScript 指令也能夠作用在螢幕上,用以繪圖。Display 與 Printing 用同一套程式碼可以達到 What You See Is What You Get 的功能。
NextStep/OpenStep 發展環境使用的是 Objective C,另一種以 C 為基 礎的物件導向語言。GNU C Compiler 中的 ObjC 程式碼,就是 NeXT 公 司發展後,貢獻出來的。 一個程式語言除了有了定義完整的語法和編譯 器的支援之外, 更需要一個通用的標準程式庫, 方便寫作, 這就是 OpenStep 中的 Foundation Kit。Foundation Kit 的內容是 ObjC 處理 物件時所必要的函式。 GNU Step 的作法是擴充 libobject 這套 library 來達成目標。
OpenStep 最重要的部份就是 AppKit 了。 寫個 GUI Application 最重 要的就是有個好用的 Library。AppKit 就是 OpenStep 最吸引人的部份 ,是個蠻不錯的 Library 架構。 GNU Step 在這方面已經有個雛型,即 objcX。 objcX 目前是利用 Motif Widget 寫成的。 由於 Motif 不是 free software,將來會用其他的方法取代掉。
GNU 的精神在 GNU Manifesto 裡面闡述的很明白,就是認為軟體的原始 碼應該要自由流通, 軟體公司該做的,不應該是把原始碼據為己有,賺 取發行 binary 的金錢,而是整合與服務的費用而已, 因為原始碼自由 流通的軟體才能讓軟體的品質提高, 讓軟體程式設計師可以自由的與他 人交換心得,不受智慧財產權的約束。 但是現實的環境是惡劣的,為了 怕有好利之徒把自由流通的軟體佔為己有, FSF 制定的 GPL,先依著作 權法獲得軟體的智慧財產權,再透過 GPL 釋放此權力給大眾:只要你遵 守 GPL,不把原始碼,以及你對原始碼所作的修改據為己有, 你就擁有 使用 GPL 軟體的權力。GPL 的規定不怎麼適用於 Library,(太嚴了, 有些人不認同)為了能夠鼓勵更多人使用 GNU 軟體, 因此 FSF 另外制 定了 LGPL--Library GPL,限制比較鬆一點。
GNU maniesto/GNU General Public License/Libray GPL 皆可在 GNU mirror sites 找到(其中 GPL 放在檔名為 COPYING 的檔案內, LGPL 則在 COPYING.LIB 內)。另外,FSF 每年的一月與七月都會定期公佈一 份名為 GNU bulletten 的文件,說明 FSF 現況與動態。 GNU bulletin 電子版只公告在 gnu.announce 上。
1992(1991 年末?) 一位芬蘭的年青資訊系學生, Linus Torvards 為了 實習使用 Andrew S. Tanenbaum 先生的 MINIX 作業系統, 買了他第一 部 486PC。但是他發現MINIX裡面缺乏很多他想要的功能,於是開始了他 的偉大事業 ─ 自己寫一個保護模式下的作業系統。 最開始的時候, Linus 是在 USENET 討論區,comp.os.minix 呼朋引伴的, 然後這個娃 娃作業系統 ( 名為 Linux) 就以兩個禮拜出一次修正版的速度快速的成 長茁壯,討論區也從原來寄生的 comp.os.minix 中獨立成非主流的 alt.os.linux,然後正名為 comp.os.linux。 之後因為使用者眾多,討 論區因此再細分成 comp.os.linux.*。 Linux 如此的受歡迎,儼然成為 正統UNIX 的繼成者。
在 Linux 早期的版本,因為發展者怕自己的程式被不肖的廠商竊據,甚 至喧賓奪主, 因此使用了一個相當嚴格的版權聲明,禁止一切的商業行 為。 後來因為大家希望有人能夠把 Linux 壓成 CD-ROM,推廣 Linux, 且造福那些不方便上 Internet FTP 的朋友, 所以將版權宣告換成 GPL 。從此之後,Linux便是公認的GNU作業系統。
前面提到 GNU 的 Kernel 會是 Hurd。但是 Linux 在短短的幾年內崛起 ,也使用 GNU 的版權聲明,儼然有取代 Hurd 之勢。甚至有不少人認為 Hurd 應該停止發展, 因為 Linux 已經成熟, GNU 實際上可以使用 Linux 當 kernel,也是一套完整的系統。FSF 的人也承認,要是 Linux 在早幾年出現,也許就不須要發展 Hurd 了。但是 Linux 還是晚了一步 ,Hurd 已經規劃了很久了,而且是個十分前衛的設計,能夠支援的機器 也比 Linux 多,不完成太可惜了。1994 年 11 月,Hurd 的第一個雛形 (snapshot) 已經發表; 1995 年 4 月,也發表了第二次 snapshot。 不出幾次 snapshot, Hurd 應該就可以被包裝成一個簡單的自我開機安 裝套件。 然後再重演 Linux 的歷史。當然,這裡要強調一點,Hurd 與 Linux 不是敵對的關係, 彼此之間沒有誰會取代誰的問題,因為它們各 有市場,各自的定位也不一樣。
實際上,FSF 也有發行以 Linux 為核心的 GNU 系統計畫。 這個計畫就 是 FSF 大力支持的 Debian Linux。Debian Linux 是 GNU Software ( 與 Public domain Software )近幾年來最徹底的整合(就是一套完完 全全用 GNU 和 PD 架起來, 而且有 Commercial OS 水準的系統)。 Linux 目前的意義可以說是彌補 Hurd 未完成前的真空, 並且聚集 GNU 與 PD 軟體的力量,為以後 GNU 系統的基礎。 而以後 Hurd386 也能夠 執行 Linux386 的 binary,彼此相輔相成。
Berkerley 的 BSD UNIX 發展到 ver. 4.4 之後, 由於 DARPA( 國防先 進研究計畫署 ) 不再繼續經援該計畫, 因此有喊停之聲, 有末代 BSD 之稱。 再加上 AT&T 控告 BSD 內含有它的程式碼,使得 4.4 的原始碼 遲遲無法公開,不見天日。
幾乎與 Linux 開始發展的同時, William Jolitz 先生也開始利用 BSD4.3 為基礎 ( 詳細的說是 Berkerley 發表過的 Net/2),把 BSD 移 植到 386 的 PC 上,作為 BSD 計畫的延續, 並方便作業系統的研究者 繼續以 BSD 作為 OS 研究的基台。 這就是 386BSD。 一開始的時候, 386BSD 發展速度太慢了,所以引起了變異,幾乎同時間有兩組人馬發表 他們自己加強的 386BSD,即 NetBSD 與 FreeBSD。 NetBSD 以 OS 研究 用途為主,很快的又被移植回原來 BSD 支援的機器上。FreeBSD 則以實 用為主,目的就是把BSD包裝的漂漂亮亮的,容易入門與安裝的系統。
這些 BSD 家族可以說都是在 Berkerley vs AT&T 的官司中發展的, 直 到官司結束, Berkerley 依照判決發表 BSD4.4Lite, 一個沒有侵犯 AT&T 版權的 BSD source code 後,紛紛更新為以 4.4Lite 為基礎,真 正擺脫了AT&T的陰影。
BSD 使用的版權宣告與 GPL 大相逕庭。 我們可以說 BSD 這批人屬於自 由派的, 他們認為不應該把公開的程式做任何的限制, 即使他人把 source code 拿去改一改,便佔為己有也沒關係, 只要不抹滅他們的貢 獻就可以了。這就是一般公認的PD (Public Domain) 的定義。也因為 這個原因,FSF 與 PD 軟體通常是保持距離,他們寧願自己重寫一些 PD 本來就有的程式,目的就是為了不讓 PD 與 GPL 混淆不清。簡單的說, GPL 限制程式碼與程式碼的加工品都屬於 GPL,必須自由流通。 而PD 的話允許私人更改加工的部份不屬於PD。 至於GPL與PD哪種比較 好也就是見仁見智的問題了。