在新闻组和邮件列表里、在电脑科学实验室里、在各大陆之间,流传著一个神秘的故事,那是关于 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.)”