|
人们常常问我设计Tcl语言的目的是什么,为什么它会变得这么受欢迎。本文将重温一下当年产生设计Tcl和Tk的想法,回顾Tcl和Tk在过去十年间发展的过程,以及我从伯克利到sun到scriptics的人生经历。你将看到,起初Tcl是很简陋的;这个系统的成功令我很吃惊,其实我也是通过回顾它的历史才开始明白Tcl流行的原因是什么。
Tcl的诞生
Tcl脚本诞生于80年代初,我在加州大学伯克利分校的项目“集成电路设计工具”的研究。那时,我和我的学生已经写出了许多用于IC设计的交互工具,如Magic和Crystal。每个工具都需要一个命令语言(在那个年代,人们需要键入命令才能使用这些工具;图形用户界面还没有被广泛的使用)。不过我们的研究重点是工具而不是它们的命令语言,所以我们没有在命令语言上投入太多的精力,结果语言方面变得很薄弱。更糟的是,每个工具的语言之间是互不相通的。这样一来,经过一段时间后,就变得相当棘手。
1987年秋,在DEC的西部研究所的假期中,我有了设计一种嵌入式命令语言的想法。这个想法就是花费一些精力去创建一种优秀的解释型语言,然后进一步把它做成一个能够在许多不同的应用程序中重复利用的库包(library package),语言的解释器要提供一系列相对通用的工具,如变量,控制结构,过程。每个使用这个语言的程序都可以以扩展的形式把自己的功能加到语言中,达到用语言来控制程序的目的。Tcl的全称“工具命令语言”正说明了这一点。
可嵌入性是Tcl的特点之一,为了实现这个想法,我准备在以下三个方面进行着手:
★这个语言必须是可扩展的:它应该能够让每个应用程序可以很方便的把自己的功能加到语言的基本功能中,并且程序的特定功能必须使用起来非常自然,就好像一开始就是为这个语言设计的一样。
★这个语言必须非常的简单通用,能很方便的与许多不同的应用程序配合工作,而不会限制应用程序的功能。
★由于大部分出色的功能都来自于应用程序,所以这个语言的首要目的就是将扩展部件整合或“胶合”在一起,因此它必须要有很好的整合性能。
1988年初,假期一结束,我就开始着手设计Tcl的工作了。1988年春天的时候,我开始在一个图形化的文本编辑器中使用第一个版本的Tcl。在我停止IC设计工具的相关研究之前,Tcl的实验还大部分停留在理论阶段。当时我想除了我自己没有人会对这个嵌入式的语言感兴趣。
Tk的诞生
那时,我对图形用户界面也很感兴趣。80年代图形用户界面逐渐流行的时候,我注意到交互式软件的复杂性正在迅速的增长,最引人注目的发展趋势看起来好像是对巨额投资的庞大项目的需求在不断增加。作为一名教授,实验条件不是很充足,这使我开始担心像我们这样类似小团队的研究所是不是就不可能再做出交互式的系统了。
我得出的结论是,我们的唯一希望就是减少创建大型系统时除可重复利用的部件以外的部分对资源的需求,如果一个系统最复杂的地方是用部件来完成的,而且可以把部件从一个系统移植到另一个系统,也许我们就可以以小团队的规模来创建强大的系统,这要求花费一些精力来开发这些部件。不过如果有几个小组协同工作的话,完成它只是一个时间的问题。
我也在考虑这样一个问题,要想使基于组建的设计能够实现,需要有一个强大的有弹性的控件整合工具。这些想法在我一开始考虑做Tcl的时候就产生了,我觉得像Tcl这样的嵌入式命令语言作为脚本语言对整合部件会很有用。我决定创建一些作为Tcl扩展的GUI部件并且使用Tcl来把这些部件整合到图形用户界面中,借此实践一下这个理论。这个扩展就成为了Tk。
我1988年末开始做Tk。这只是一个兼职的项目,所以用了两年的时间才使Tk具有了一些实用的功能。
早期的集成套件
我已经记不清是什么时候开始让人们使用Tcl了,我记得我在伯克利“产学研大会”上作了一个关于Tcl的演讲,来自工业界的几百名与会者听了我们系的这个研究成果。我还被一些对此感兴趣的公司邀请去做演讲。在这几次演讲期间,一些人向我要Tcl的拷贝,于是在1989年,这一部分人最早接触到了Tcl。
1990年1月,我在USENIX会议上宣读了一篇关于Tcl的论文,听众有几百人。他们对Tcl的兴趣越来越浓厚,许多人开始向我要Tcl。大约在那个时候,我决定在伯克利的FTP站点上免费发放Tcl的源代码。从此,通过因特网,Tcl的用户开始与日俱增。
我在USENIX会议中作演讲的听众中有一个人叫Don Libes。他来自国家标准和技术研究院。Don一直想编写一个程序,这个程序能够自动的操作交互的UNIX应用程序,但这需要一种优秀的命令语言,而Don没有时间自己编写这样的一个语言。于是这个项目只能搁置在一边。听了我的演讲后,Don立即跑回家,下载了Tcl,编写了一个叫做Expect的非常优秀的程序,并且赶在下一次USENIX会议提交论文的最后期限之前完成了一篇关于它的论文。整个过程只用了三个星期。Don在1990年夏发表了他的论文之后,把Expect免费的提供给人们使用,于是在系统管理员界立即引起了一场不小的震动。Expect不仅是第一个广泛发布的Tcl应用程序,而且多年来一直也是最流行的。许多早期的Tcl用户都是通过使用Expect来了解到Tcl的。
在1990年末,Tk的基本功能变得很实用了,1991年1月,我同时在USENIX会议和X应用程序开发者大会上发表了一篇关于Tk的论文,这两次会议期间的几个星期中,我在因特网上发布了第一个Tk版本。Tk的第一版缺少许多重要的构件(比如,没有多行文本框构件),不过到了1992年夏天的时候,我就把文本框构件和一个强大的画布构件加了进去。这时Tk的用户开始迅速增长。
开始变得受欢迎
Tcl/Tk的用户从1990年初开始每年都在迅速增加。从1989年的几个使用者到1993年的成百上千的使用者,导致这种迅速增长的原因主要有两个方面:
Tcl/Tk使用者增加的第一个原因是:它提供了最简单的在UNIX(那时Tcl只能在UNIX系统下运行)下开发图形用户界面的方法。Tk的GUI工具既简单又强大;所编写出的出色的应用程序可以完全由Tcl编写而不用写一句C代码,换成基于C的工具来开发比如Motif工具则要变得复杂得多,而且功能也比较少。人们很快就发现用Tcl来开发GUI比起用Motif来可以少投入5到10倍的精力,这也证明了在工业界有许多人和我一样很关心开发交互式应用程序的高开支问题。
Tcl流行的第二个原因是它的可嵌入特性。在我开始做Tcl的时候,我猜想除了我没有人会想要可嵌入式的命令语言,但是我错了。包括Don Libes在内的许多人都想要编写脚本式的可扩展的应用程序,但却没有时间自己来创建这么一种语言。正因为可嵌入式的特性,Tcl为他们提供了一个完美的解决方案。结果Tcl一推出就被广泛的用于股票交易,科学观测,生产自动化等许多领域。
在Tcl用户之间每一两年都会有对Tcl和Tk的使用的讨论,许多Tcl的使用者认为Tk是他们使用Tcl的唯一原因,他们中的一些甚至不喜欢Tcl语言,而希望Tk能够和其他的脚本语言结合。(实际上,已经有人这么做了,如Tkperl和Python),而另一部分人认为Tcl正是他们的需求所在,他们把它作为可嵌入式的脚本语言来使用,而常常不去使用Tk。由于Tcl能够满足他们的特殊目的,所以他们很喜欢Tcl,从某种意义上说,这两部分人都没错。
Tcl社区
90年代初随着Tcl使用者的增加,人们在网上建立了一个关于这门语言的社区,目的是让大家发布功能强大的扩展和为新的用户提供帮助。Mark Diekhans和Karl Lehenbauer是早期开创者中的两位,。他们编写了Tclx,最早可用的Tcl扩展之一,Tclx提供了对文件的访问,时间和日期控制,以及许多其它有用的工具。随着时间的推移,Tclx的功能被证明是非常重要的,以至于其中的许多功能已经被整合到了Tcl的基本功能中。
许多早期的Tcl开创者编写了大量高质量的扩展并使这些扩展能够免费的使用,比如Michael Mclennan编写的[incr Tcl],为Tcl提供了面向对象的功能。George Howlett编写的BLT为Tk加进了许多重要的构件。Tom Poindexter编写的Sybtcl和Oratcl,提供了对主流数据库的访问。Brian Smith和Lary Rowe编写的TclDP提供了Socket接口及一些有用的编程功能。还有许多贡献者我已经记不太清了,在此我只能表示歉意。
社区中其他的论坛在这个时期也在发展。我起初为社区中的用户建立了一个邮件列表,但是短短几年里,这个列表变得相当冗长,以至于后来无法控制。在社区的帮助下,我们建立了comp.lang.tcl新闻组来代替原来的邮件列表,从此,它就成为了交换信息和讨论Tcl新功能的绝佳地点。
1993年Larry Rowe意识到社区中的人们需要面对面的交流。于是他在伯克利组织了第一届Tcl专题讨论会,大约有60人参加。由于这次大会开得非常成功,所以我们决定把它定为一年一届。1995年,USENIX协会开始对这个讨论会进行资助。从此,它就变为了一个有几百人参加的,发表大量论文、教程,开展众多活动的全方位的大会。Tcl大会也是世界上最大的参加者上身着装统一的大会之一,每年要分发5-10种不同设计图案的短袖衫来区别不同的扩展和活动。
在这段时间里,我大约每6到10个月发布一次Tcl/Tk的新版本。大部分新的功能都是采用的Tcl社区的建议。有时,使用者甚至直接给我提供新功能的源代码,然后,我再把它加到软件的核心代码中。通常,每次新版本发布前都有一个讨论的过程,我提供一份新功能的候选列表,然后在社区中由大家投票选出他们认为最重要的功能。我尽可能优先考虑得票最多的功能。
Ouster的得票
后来Tcl的发布周期就慢慢趋向于和Tcl大会保持一致。新版本通常在大会期间发布,这样我们就可以在大会中拿出一段时间来组织讨论下一个版本要加入的新功能,然后得到反馈信息。我经常让与会者即兴的举手表决,统计一下听众对一些问题的想法,然后对举手的人数做个大概的统计(“10,20,30,…,看起来我大约得了35票”)这些票数被大家称之为“ouster的得票”,得票数也常常被大家当作话题来讨论。不过一些人开玩笑说我的得票数一点也不客观…
|
|