《自由軟體,自由社會》:應用自由軟體判斷準則

1 贊 回覆發表於2017-06-06

Copyright © 2015 理查德·斯托曼Richard Stallman

四項基本自由為判斷某一特定程式碼片斷是否為自由的(即尊重使用者自由)提供了準則(參見《什麼是自由軟體?》一文以獲知自由軟體的完整定義)。我們應當如何將它們應用於判斷一個軟體包、一套作業系統、一臺計算機、或是一個網頁是否適合被推薦使用呢?

一個程式是否是自由的首先影響到的是我們對於自己的私人行為的決定:為了捍衛我們自己的自由,我們需要拒絕那些將會剝奪我們自由的程式。然而,這也會影響到我們應當對別人怎樣說和怎樣做。

一個非自由程式是一種不公。釋出一個非自由程式、向他人推薦非自由程式、或是更為普遍地將它們引入課程以誘導人們使用非自由軟體,以上這些行為意味著引導人們放棄自己的自由。可以肯定的是,引導人們使用非自由軟體並不等同於在他們的計算機上安裝非自由軟體,但我們不應該將人們引入歧途。

在更深層次上,我們不能提出一個非自由程式作為一個解決方案,因為這將會承認其合法性。非自由軟體是一種問題;將其以一種解決方案的方式呈現否認了這一問題的存在(我的文章《避免破壞性的妥協》詳細論述了這一問題)。

本文闡述了我們應當如何應用自由軟體的基本準則來判斷不同種類的事物,並且決定是否應該推薦它們。

軟體包

一個軟體包若要成為自由的,其中所有程式碼必須都是自由的。但不僅限於程式碼。由於文件檔案包含手冊、自述(README)、更新日誌等,這些都是軟體包的必要的技術組成部分,它們必須也是自由的(參見《自由軟體需要自由的文件》以獲知關於這一問題的更多細節)。一個軟體包通常與很多其他軟體包一起使用,並且與其中的一些進行互動。與非自由軟體進行的何種互動才是倫理上可接受的呢?

我們著手開發 GNU 的目的是帶來一款自由的作業系統,由於在 1983 年還沒有這樣的自由作業系統。當我們於 20 世紀 80 年代開發出最早的 GNU 元件時,其中每個元件都依賴於非自由軟體是不可避免的。例如,沒有任何一個 C 程式可以離開非自由的 C 編譯器而執行,直到 GCC 可以正常工作,並且它們也不能離開 Unix libc 而執行,直到 glibc 可以正常工作。每個元件都只能執行在非自由作業系統上,因為當時所有的作業系統都是非自由的。

每當我們釋出一款可以執行在某些非自由作業系統上的元件時,使用者將其移植到其他非自由作業系統上。從倫理上講,這些移植並不比我們曾經用於開發這些元件的限定平臺程式碼更壞,因此我們整合了他們的修補程式。

當 Linux 核心於 1992 年變為自由之時,它填補了 GNU 作業系統的最後一塊空缺(Linux 最初於 1991 年以一種非自由許可證釋出)。GNU 和 Linux 的組合成為了一種完全自由的作業系統——GNU/Linux(參見《Linux 和 GNU 作業系統》一文以獲知更多資訊)。

此時,我們可以選擇移除對非自由平臺的支援,但是我們決定不這樣做。一個非自由作業系統是一種不公,但使用者執行非自由作業系統並不是我們的過錯。支援該非自由作業系統上的自由軟體並不構成這種不公。並且這將是實用的,不僅對於那些非自由作業系統使用者,也對於吸引更多人為開發該自由軟體做貢獻。

然而,在自由程式上執行非自由程式是一個完全不同的問題,因為這是在誘導使用者在自由之路上倒退。在某些情況下我們完全禁止這樣做:例如 GCC 禁止任何非自由外掛(如需獲知為何 GCC 拒絕任何非自由外掛,參見我在 GCC 郵件列表中的回覆)。當一個程式允許非自由擴充套件的時候,它至少不應該引導使用者使用它們。例如,我們更傾向於選擇 LibreOffice 而非 OpenOffice,由於後者提示使用者使用非自由擴充套件,而 LibreOffice 則拒絕它們。我們開發冰貓IceCat起初也是為了避免向使用者推廣由火狐FireFox建議使用的非自由擴充套件。

事實上,如果冰貓解釋如何在 MacOS 上執行冰貓,這將不會引導使用者去執行 MacOS。但如果它介紹了一些非自由擴充套件,它將會鼓勵冰貓使用者安裝這些非自由擴充套件。因此,冰貓軟體包及其手冊和網站不應該介紹這些東西。

有時一個自由軟體和一個非自由軟體協同工作,但其中任何一方都不是基於另一方的。我們針對這種情況的規則是,如果該非自由軟體非常有名,我們應當告知人們如何使用我們的自由軟體與之工作;但如果該專有軟體鮮為人知,我們不應該暗示其存在。有時我們會在該非自由軟體存在的情況下提供互操作支援,但避免告知使用者這麼做的可能性。

我們拒絕任何僅可用於某一非自由作業系統的“增強元件”。它們會鼓勵人們使用該非自由作業系統而非 GNU,如同自擺烏龍。

GNU/Linux 發行版

隨著 Linux 核心於 1992 年自由化,人們開始開發 GNU/Linux 發行版distros。但只有少數發行版是完全由自由軟體構成的。

適用於軟體包的規則也適用於發行版:一個符合倫理的發行版必須僅包含自由軟體並且只將使用者向自由軟體的方向引導。但是,對於一個發行版而言,“包含”一個特定的軟體包是什麼意思呢?

某些發行版通過作為其發行版一部分的二進位制包安裝軟體;而其他發行版從上游原始碼構建每個軟體,並且從字面意義上講,它們所包含的只是需要下載並構建的列表。對於自由的問題,發行版怎樣安裝一個給定的軟體包並不重要;如果它將某個軟體包作為可選項提供,或者它的網站這樣做,我們稱該發行版“包含”該軟體包。

自由作業系統的使用者擁有對它的控制權,於是他們可以安裝他們想要安裝的任何東西。自由發行版提供了使用者可用於安裝他們自己的程式以及他們對於自由軟體的修改版本的通用工具;他們也可以安裝非自由軟體。在這些發行版中提供這些通用工具並不是倫理瑕疵,由於該發行版的開發者對於使用者基於其自身的主動權獲取並安裝什麼軟體並不負有責任。

然而,當開發者引導使用者走向非自由軟體的時候,他們對於使用者安裝非自由軟體就應當負有責任了——例如,將非自由軟體置於流行發行版的軟體包列表中,或者從它們的伺服器進行分發,或者將其呈現為一種解決方案而非一種問題。這正是為何大多數 GNU/Linux 發行版具有倫理瑕疵的問題之所在。

自行安裝軟體包的使用者通常具有一定的判斷能力:如果我們告訴他們“Baby 包含非自由程式碼,而 Gbaby 是自由的”,我們可以預見他們能夠留心記住哪個是哪個。但發行版是推薦給那些不瞭解這些細節的普通使用者的。他們將會想“我應該使用他們所說的哪個呢?我想它應該是 Baby”。

因此,要想向公眾推薦一款發行版,我們堅持要求它們的名字不能與我們所拒絕的某個發行版相似,唯有如此,我們關於僅僅推薦自由發行版的資訊才能被可靠地傳達。

發行版和軟體包之間的另一個區別在於向其中新增非自由程式碼的可能性。程式開發者會仔細檢查他們向其中新增的程式碼。如果他們決定使該程式成為自由的,他們不太會向其中新增非自由程式碼。不過也有例外,包括 Linux 核心中新增“二進位制 blobs”這樣惡劣的案例,但它們與現存的自由軟體相比只佔一小部分。

與之相反,一個 GNU/Linux 發行版通常包含數千個軟體包,並且其開發者可能每年都會向其中新增數百個新的軟體包。如果未能盡力避免那些包含某種非自由軟體的軟體包,幾乎肯定會有一些非自由軟體混入其中。由於自由發行版的數量很少,作為列出那些發行版的條件,我們要求每位自由發行版的開發者通過移除任何非自由程式碼或惡意程式碼來承諾保持該發行版成為自由軟體。參見 GNU 自由作業系統發行版指導意見,它位於 http://gnu.org/distros/free-system-distribution-guidelines.html

我們不要求自由軟體包的開發者也做出這樣的承諾,這是不現實的,幸運地是,這也不是必需的。得到超過 30000 個自由軟體的開發者的承諾也許能夠避免少數問題,但其代價是極大增加自由軟體基金會(FSF)員工的工作量;此外,這些開發者中的大部分與 GNU 計劃並無關係,他們也不願意向我們做出任何承諾。因此我們只需在發現問題的時候應對這些使自由軟體變為非自由軟體的少數案例。

外設

計算機外設要求計算機中的軟體被作業系統載入到其中以便使其工作——這些軟體可以是驅動程式或韌體。因此,如果一件外設可以在一臺未安裝任何非自由軟體的計算機上使用——如果該外設的驅動程式以及任何需要由作業系統載入到其中的韌體都是自由的,那麼它是可接受並使用以及推薦的。

驗證這一點是簡單的:將該外設連線到一臺執行完全自由的 GNU/Linux 發行版的計算機上並且觀察它是否正常工作。但是大多數使用者需要在購買外設之前獲知這一點,因此我們在 h-node.org 列出了很多外設的資訊,這是一個完全自由的作業系統的硬體資料庫。

計算機

一臺計算機在不同層次上包含不同的軟體。我們應當基於什麼準則來判斷一臺計算機是否“尊重您的自由”呢?

顯而易見的是:作業系統和其中的任何軟體都必須是自由的。在 20 世紀 90 年代,啟動載入軟體(當時是"基本輸入/輸出系統",即 BIOS)成為可替換的,並且由於它執行在中央處理器(CPU)上,它與作業系統所存在的是同一類的問題。因此,諸如韌體或驅動程式,不論安裝在作業系統中,或是隨作業系統一起安裝,或是啟動載入程式都必須是自由的。

如果一臺計算機擁有某些要求在作業系統中安裝的非自由驅動程式或韌體的硬體功能,我們可能仍然能夠推薦它。如果它在沒有那些功能的情況下仍然可用,並且我們認為大部分人不會為了使該功能可用而被引導安裝非自由軟體,那麼我們仍然能夠推薦它們。否則我們就不能。這將是一種主觀判斷。

一臺計算機可能在較低的層次上帶有預裝的可修改韌體和微碼。它也可能在真正只讀的記憶體中擁有程式碼。我們決定在現今我們所使用的認證準則中忽略這些程式,這是由於如若不然就沒有任何計算機可以滿足,並且因為通常不會被更改的韌體在倫理上與電路相同。因此我們的認證準則僅僅覆蓋那些執行在計算機的主處理器上而非真正只讀記憶體中的程式碼。當在其他層次上執行自由軟體成為可能,我們也會要求這些層次上的軟體是自由的。

由於認證一款產品是對它的積極推廣,我們要求它們的販賣者以支援我們作為回報,這可以通過談論自由軟體而非開源軟體(參見《如今自由軟體更加重要》和《“開放原始碼”為什麼不符合自由軟體的思想》)以及將 GNU 和 Linux 的結合體稱為 GNU/Linux (參見《名字的含義?》一文)來做到。我們沒有義務積極支援那些不認可我們的工作或是不支援我們運動的專案。

參見 http://www.fsf.org/resources/hw/endorsement/criteria 以獲知我們的認證準則。

網頁

現在的很多網頁都包含複雜的 JavaScript 程式並且需要它們才能工作。這是一種有害的實踐,因為它阻礙使用者對他們自己計算的控制。更壞的是,這些程式中的大部分是非自由的,這是一種不公。JavaScript 程式碼通常窺探使用者(參見《JavaScript 陷阱》一文)。JavaScript 已經變成了一種對使用者自由的威脅。

為了解決這一問題,我們開發了 LibreJS,這是一種用於阻止非普通非自由的 JavaScript 程式碼的火狐瀏覽器擴充套件(沒有必要阻止簡單的指令碼,如果它們只是實現一些次要的使用者介面特性)。我們請求網站將它們的 JavaScript 程式自由化並且標記其許可證以便 LibreJS 識別。

與此同時,連結至一個包含非自由 JavaScript 程式的網頁是否符合倫理呢?如果我們堅決不做任何妥協,我們將只能連結至自由的 JavaScript 程式碼。然而,很多網頁即使不執行它們的 JavaScript 程式碼也能工作。此外,除了追隨我們的連結,您會經常在其它網站遇到非自由的 JavaScript 程式碼;為了避免這些情況,您必須使用 LibreJS 或禁用 JavaScript。因此,我們決定做出讓步並且連結那些不執行非自由 JavaScript 程式也能工作的網頁,同時鼓勵使用者在普遍意義上保護自己不受來自非自由 JavaScript 程式的威脅。

然而,如果某個網頁不執行非自由 JavaScript 程式就不能實現其功能,連結到它將會不可避免地要求人們執行該非自由 JavaScript 程式碼。我們原則上不會連結這些網頁。

結論

將“軟體應當是自由的”這一基本理念應用到不同場合要求不同的實踐策略。隨著新情況的出現,GNU 計劃和 FSF 將會適配我們的自由準則,不論在實踐上還是原理上,都將計算機使用者引向自由。通過僅僅推薦尊重使用者自由的程式、發行版和硬體產品,並且宣示您的立場,您可以為自由軟體運動提供它所急需的支援。

相關文章