在新聞組和郵件列表裡、在電腦科學實驗室裡、在各大陸之間,流傳著一個神秘的故事,那是關於 Perl 與動態網站之間的不得不說的往事。
早期網際網際網路歷史中,有一些膾炙人口的開創性事件:如 蒂姆·伯納斯·李(Tim Berners-Lee)在郵件組上宣佈 WWW-project 的那天,該檔案隨同 CERN 釋出的專案程式碼進入到了公共域,以及 1993 年 1 月的第一版 NCSA Mosaic 瀏覽器。雖然這些獨立的事件是相當重要的,但是當時的技術的開發已經更為豐富,不再是由一組的孤立事件組成,而更像是一系列有內在聯絡的故事。

這其中的一個故事描述的是網站是如何變成動態的,通俗說來就是我們如何使站群伺服器除了提供靜態 HTML 檔案之外做更多的事。這是個流傳在新聞組和郵件列表間、電腦科學實驗室裡、各個大陸之間的故事,重點不是一個人,而是一種程式語言:Perl 。
CGI 指令碼和資訊站群軟體
在上世紀 90 年代中後期,Perl 幾乎和動態網站是同義詞。 Perl 是一種相對來說容易學習的解釋型語言,並且有強大的文書處理特性,使得它能夠很容易的編寫指令碼來把一個網站關聯到資料庫、處理由使用者傳送的表單資料,當然,還要創造那些上世紀 90 年代的網站的經典形象——計數器和留言簿。
類似的網站特性漸漸的變成了 CGI 指令碼的形式,其全稱為通用閘道器介面(Common Gateway Interface),首個實現由 Rob McCool 於 1993 年 11 月在 NCSA HTTPD 上完成。 CGI 是目的是直面功能,並且在短短几年間,任何人都可以很容易的找到一些由 Perl 寫的預製的指令碼存檔。有一個聲名狼籍的案例就是 Matt’s Scripts Archive,這是一種流行卻包含各種安全缺陷的原始碼庫,它甚至使得 Perl 社群成員建立了一種被稱為 Not Matt‘s Scripts 的更為專業的替換選擇。
在當時,無論是業餘愛好者,還是職業程式設計師都採用 Perl 來製作動態網站和應用,Tim O’Reilly 創造了詞彙 “資訊站群軟體”(infoware)來描述網站和 Perl 怎樣成為變化中的計算機工業的一部分。考慮到 Yahoo!和 Amazon 帶來的創新,O‘Reilly 寫道:“傳統站群軟體在大量的站群軟體中僅僅包含了少量的資訊;而資訊站群軟體則在少量的站群軟體中包含了大量的資訊。” Perl 是一種像瑞士軍刀一樣的完美的小而強大的工具,它支撐了資訊媒體從巨大的網站目錄向早期的使用者生成內容(UGC)平臺的轉變。
題外話
儘管使用 Perl 來製作 CGI 簡直是上佳之選,但是程式語言和不斷提升中的動態網站之間的關係變得更加的密切與深入。從第一個網站(在 1990 年的聖誕節前)出現到 1993 年 McCool 實現 CGI 的短暫時期內,Web 上的各種東西,比如表單、圖片以及表格,就這麼逐漸出現在上世紀 90 年代乃至後來。儘管伯納斯·李也對這些早期的歲月產生了影響,但是不同的人看到的是 Web 不同的潛在作用,並將它推向各自不同的方向。一方面,這樣的結果來自一些著名的辯論,例如 HTML 應該和 SGML 保持多近的關係、是否應該實現一個影象標籤等等。在另一方面,在沒有直接因素影響的情況下改變是極其緩慢的。後者已經很好的描述了動態網站是如何發展的。
從某種意義上說,第一個 “閘道器” 的誕生可以追溯到 1991 至 1992 年之間(LCTT 譯註:此處所謂 “閘道器” 的意義請參照 CGI 的定義),當時伯納斯·李和一些電腦科學家與超文字愛好者編寫服務程式使得一些特定的資源能夠連線到一起,例如 CERN 的內部應用程式、通用的應用程式如 Oracle 資料庫、廣域資訊查詢系統(WAIS)等等。(WAIS 是 Web 的前身,上世紀 80 年代後期開發,其中,開發者之一 Brewster Kahle,是一個數字化圖書管理員和 Internet Archive 的創始人。)可以這樣理解,“閘道器” 就是一個被設計用來連線其它 Web 、資料庫或者應用程式的定製的 Web 站群伺服器。任何的動態功能就意味著在不同的埠上執行另外一個守護程式(參考閱讀,例如伯納斯·李對於在網站上如何新增一個搜尋功能 的描述)。伯納斯·李期望 Web 可以成為不同資訊系統之間的通用介面,並且鼓勵建立單一用途服務。他也提到 Perl 是一種強大的(甚至是不可思議)、可以將各種東西組合起來的語言。
然而,另一種對 “閘道器” 的理解指出它不一定是一個定製裝置,可能只是一個指令碼,一個並不需要額外站群伺服器的低吞吐量的附加指令碼。這種形式的首次出現是有爭議性的 Jim Davis 的 Gateway to the U Mich Geography server,於 1992 年的 11 月釋出在了 WWW-talk 郵件列表中。 Davis 的指令碼是使用 Perl 編寫的,是一種 Web API 的原型,基於格式化的使用者查詢從另外的站群伺服器拉取資料。我們來說明一下這兩種對於閘道器的理解的不同之處,伯納斯·李回覆了 Davis 的郵件,期望他和 Michigan 站群伺服器的作者 “能夠達成某種共識”,“從網際網路的角度來看的話” 僅使用一臺站群伺服器來提供這樣的資訊可能會更有意義。伯納斯·李,可能是期待著 Web 的發明者可以提出一種有秩序的資訊資源訪問方式。這樣從不同站群伺服器上拉取資料的閘道器和指令碼意味著一種潛在的 Web 的質的變化,雖然不斷增多,但也可能有點偏離了伯納斯·李的原始觀點。
回到 Perl HTTPD
在 Davis 的地理站群伺服器上的閘道器向標準化的、低吞吐量的、透過 CGI 方式實現的指令碼化閘道器邁進的一步中,Perl HTTPD 的出現是很重要的事件,它是 1993 年初由印地安納大學的研究生 Marc Van Heyningen 在布盧明頓(Bloomington)完全使用 Perl 語言實現的一個 Web 站群伺服器程式。從 Van Heyningen 給出的設計原則來看,基於使用 Perl 就不需要任何的編譯過程這樣一種事實,使得它能夠成為一種極易擴充套件的站群伺服器程式,這個站群伺服器包含了 “一個向程式碼中增加新特性時只要簡單的重啟一下就可以,而不會有任何的宕機時間的特性”,使得這個站群伺服器程式可以頻繁的加入新功能。
Perl HTTPD 代表了那種站群伺服器程式應該是單一、特定目的的觀點。相應的,這種模式似乎暗示了在 Web 開發中像這樣漸進式的、持續測試的站群軟體產品可能會最終變成一種共識。 Van Heyningen 在後來提到過他從頭編寫這樣一個站群伺服器程式的初衷是當時沒有一種簡便的方式使用 CERN 站群伺服器程式來生成 “虛擬檔案”(例如,動態生成的頁面),他打趣說使用 Perl 這樣的 “神之語言” 來寫可能是最簡單的方式了。在他初期編寫的眾多指令碼中有一個 Sun 作業系統的使用者手冊的 Web 介面,以及 Finger 閘道器(這是一種早期用來共享計算機系統資訊或者是使用者資訊的協議)。
雖然 Van Heyningen 將印地安納大學的站群伺服器主要用來連線現存的資訊資源,他和研究生們同時也看見了作為個人釋出形式的潛在可能。其中一件廣為人知事件是在 1993-1994 年之間圍繞著一個著名的加拿大案件而公佈的一系列的檔案、照片和新聞故事,與此形成鮮明對比的是,所有的全國性媒體都保持了沉默。
Perl HTTPD 沒有堅持到現在的需要。今天,Van Heyningen 回憶起這個程式的時候認為這個程式只是當時的一個原型產品。它的原始目的只是向那些已經選擇了 Gopher 作為大學的網際網路介面的資深教員們展示了網際網路的另一種利用方式。 Van Heyningen 以一種基於 Web 的、可搜尋的出版物索引的方式,用程式碼回應了他的導師們的虛榮。就是說,在站群伺服器程式技術方面關鍵創新是為了贏得爭論的勝利而誕生的,在這個角度上來看程式碼做到了所有要求它所做的事。
不管該站群伺服器程式的生命是否短暫,伴隨者 Perl HTTPD 一起出現的理念已經傳播到了各個角落。 Van Heyningen 開始收到了獲取該程式碼的請求,而後將它分享到了網上,並提示說,需要了解一些 Perl 就可以將它移植到其它作業系統(或者找到一個這樣的人也行)。不久之後,居住在奧斯汀(Austin)的程式設計師 Tony Sanders 開發了一個被稱為 Plexus 的輕便版本。 Sander 的站群伺服器程式是一款全功能的產品,並且同樣包含了 Perl HTTPD 所建議的易擴充套件性,而且新增一些新的特性如圖片解碼等。 Plexus 直接影響了 Rob McCool 給 NCSA HTTPD 站群伺服器上的指令碼開發的 “htbin”,並且同樣影響到了不久之後誕生的通用閘道器介面(CGI)。
在這些歷史遺產之外,感謝妙不可言的網際網際網路時光機(Internet Archive)使得 Perl HTTPD 在今天依然保留在一種我們依然可以獲取的形式,你可以從這裡下載 tarball 。
歷史展望
對於技術世界的顛覆來說,技術的改變總是在一個相互對立的過程中。現有的技術是思考新技術的基礎與起點。過時的程式設計形式啟迪了今天人們做事的新方式。網際網路世界的創新可能看起來更像是對於舊技術的擴充套件,不僅僅是 Perl 。
在萌芽事件的簡單的時間軸之外,Web 歷史學者也許可以從 Perl 獲取更多的線索。其中一部份的挑戰在於材料的獲取。更多需要做的事情包括從可獲取的大量雜亂的資料中梳理出它的結構,將分散在郵件列表、歸檔網站,書本和雜誌中的資訊內容組合在一起。還有一部分的挑戰是需要認識到 Web 的歷史不僅僅是新技術釋出的日子,它同時包括了個人記憶、人類情感與社會程式等,並且這不僅僅是單一的歷史線而是有許許多多條相似的歷史線組合而成的。就如 Perl 的信條一樣 “殊途同歸。(There’s More Than One Way To Do It.)”