LJ 采访 Guido van Rossum

作者:Andrew Kuchling
LJ Interviews Guido van Rossum

Guido van Rossum 是 Python 解释型语言的作者。我在七月底采访了他,以了解 Python 的最新进展以及对其未来的展望。

过去

Andrew: 是什么启发你编写 Python 解释器的?

Guido: 一方面,我在 Centrum voor Wiskunde en Informatica (CWI) 担任 Amoeba 分布式操作系统的程序员,我当时认为解释型语言对于编写和测试管理脚本会很有用。另一方面,我之前曾在 ABC 项目上工作过,该项目开发了一种旨在面向非技术用户的编程语言。我仍然有一些从 ABC 项目中遗留下来的有趣想法,并想加以利用。

我有一个为期两周的圣诞节假期,无事可做。因此,我在我的 Mac 上编写了 Python 解释器的最初部分,这样我就不必登录 CWI 的计算机了。

Andrew: 还有哪些语言或系统影响了 Python 的设计?

Guido: 影响有很多。当然,ABC 是一个主要的影响因素,因为我一直在 CWI 从事该项目。它启发了使用缩进来分隔代码块,这些代码块是高级类型和对象实现的一部分。我曾在 DEC 的系统研究中心度过一个夏天,在那里我接触到了 Modula-2+;Modula-3 最终报告大约在同一时间在那里编写。我在那里学到的东西在 Python 的异常处理、模块以及方法在其参数列表中显式包含“self”这一事实中有所体现。字符串切片来自 Algol-68 和 Icon。

C 语言是第二个影响因素,其重要性仅次于 ABC。Python 的大多数关键字,例如 breakcontinue 等,都与 C 语言的关键字相同,运算符优先级也是如此。C 语言也影响了早期的扩展模块;它们中的许多,例如 socket 和 POSIX 模块,只是将相应的 UNIX C 函数翻译成 Python,并进行了一些修改,以使编程更加舒适。例如,错误会引发异常而不是返回负值,并且套接字是对象。

Bourne shell 也是 Python 行为的典范。与 shell 类似,Python 可以通过指定文件名来执行脚本,但是当不带参数运行时,它会向您显示一个交互式提示符。这非常适合用于试验语言或您正在尝试学习的新模块。

现在

Andrew: 您见过的最有趣的 Python 应用程序是什么?

Guido: 人们正在使用它做许多很棒的事情。Infoseek 使用 Python 作为其 Ultraseek 搜索引擎的一部分;网络爬虫部分是用 Python 编写的,并且可以通过编写 Python 代码进行配置。劳伦斯·利弗莫尔国家实验室的一个小组正在使用 Python 来控制数值计算。Digital Creations 等公司正在 Web 相关产品中使用 Python。

Andrew: 您对 Python 的哪些功能最满意?

Guido: 整个系统的感觉非常适合我的编程风格,原因显而易见。交互式运行解释器的能力以及自下而上编写代码并逐步测试它的能力相结合,使我能够快速编写代码。其他人也发现它使他们更有效率。

Python 还很好地连接到它运行的环境。ABC 是单片式的,将其自身的抽象层置于操作系统之上。例如,ABC 具有持久的命名空间,可以在连续执行中携带变量的值。这些命名空间被实现为磁盘文件,但是无法读取任意文件或在文件系统中漫游。我认为这是一个严重的错误,因此可扩展性从 Python 的一开始就很重要,并且编写一个接口到新的 C 库的扩展并不困难。

LJ Interviews Guido van Rossum

Andrew 和 Guido 讨论 Python 的未来

Andrew: 用户社区如何让您感到惊讶?一旦开始被广泛使用,它如何影响了语言的方向?

Guido: 一旦源代码可供下载,它就迫使我使安装过程非常容易,只是为了避免一遍又一遍地回答相同的问题。它还迫使我编写更好的文档。

该语言的大部分仍然由我喜欢的东西组成,但是用户一直在提出新事物并进行微调方面发挥着重要作用。该语言的一些早期采用者,例如 Tim Peters 和 Steve Majewski,专注于非常细微的设计细节,并通过阐明各种功能应如何工作提供了极大的帮助;例如,他们说服我支持混合算术。当前(并且仍在增长)的一组与互联网相关的模块大部分是由用户贡献或建议的。

Andrew: 您对 Python 的哪个功能最不满意?

Guido: 有时我接受贡献太快了,后来才意识到这是一个错误。一个例子是一些函数式编程功能,例如 lambda 函数。lambda 是一个关键字,可让您创建小型匿名函数;诸如 mapfilterreduce 之类的内置函数在序列类型(例如列表)上运行函数。

实际上,结果并没有那么好。Python 只有两个作用域:局部作用域和全局作用域。这使得编写 lambda 函数很痛苦,因为您经常想访问 lambda 定义所在作用域中的变量,但是由于这两个作用域,您无法访问。有一种解决方法,但这有点像权宜之计。通常,在 Python 中,似乎使用 for 循环而不是摆弄 lambda 函数要容易得多。map 和朋友只有在已经存在执行您想要操作的内置函数时才能很好地工作。

Andrew: 在您为 Mark Lutz 的著作《Programming Python》(O'Reilly,1996 年)所作的介绍中,您提到您的日常工作涉及编写 Python 代码。您的工作是什么,您如何在工作中使用 Python?

Guido: 我现在在弗吉尼亚州雷斯顿的国家研究创新公司 (CNRI) 工作。CNRI 对构建一个名为 Knowbot System 的移动代码系统很感兴趣,因为移动程序对于许多不同的目的都很有用。例如,假设您要为网站编制索引。通常,您会使用网络下载所有数据并为其编制索引,这会占用大量带宽。此外,如果不下载文档,您就无法检测两个文档是否是相同的副本,从而导致更多的时间和资源浪费。使用移动代码,您可以在服务器上运行索引程序,并在作业完成后仅发送索引(相对少量的数据)返回。

CNRI 意识到,移动代理必须在受限环境中执行,以防止它们损坏系统上的任何东西;因此,需要以解释型语言运行 Knowbot 代码。因此,CNRI 查看了当时可用的语言,最终确定 Python 是该工作的总体最佳语言,并聘请我从事 Knowbot 系统的工作。

从那时起,我们实际上构建了 Knowbot 系统,该系统对 Python 的更改相对较少;即使在我开始在 CNRI 工作之前,用于受限执行的大部分组件也已到位。在此过程中,CNRI 还开发了 Grail,这是一个用 Python 编写的网络浏览器,最近我们还开发了一个负载均衡系统,作为另一项研究工作的一部分。Knowbots 的另一个应用,也是未来研究的主题,是知识产权保护。为了防止人们非法复制以电子形式购买的文档,可以将文档嵌入到 Knowbot 程序中,该程序验证用户是否已获得查看它们的授权。如何使这项工作奏效仍然是一个悬而未决的问题!

未来

Andrew: 您认为哪些正在进行的与 Python 相关的开发最令人兴奋?

Guido: 我们正在致力于一个 Python 联盟,该联盟将资助 Python 的未来发展,但是目前(1998 年 7 月下旬)没有什么可报告的。看到 Python 进入越来越多的新产品和项目,真是令人兴奋。如果我必须说一件真正令人兴奋的大事,那就是 JPython。

Andrew: JPython 到底是什么,它适合做什么?

Guido: 原始的 Python 解释器是用 C 语言编写的。JPython 是用 Java 编写的 Python 的全新实现。它为 Java 带来了与 CPython 为 C 环境带来的许多相同的优势——交互性、高级语言、将组件粘合在一起的能力。它还可以将 Python 程序编译成 Java 字节码,然后可以被其他 Java 代码使用,作为 applet 运行或其他任何形式。

Jim Hugunin 在编写 JPython 方面做得非常出色,并且它与 Java 集成得非常好。在 CPython 中,要使用新的 C 库,您需要为其编写一个扩展模块。虽然有一些工具可以帮助完成此任务,例如 David Beazley 的 SWIG,但这仍然需要一些工作。Java 具有 Reflection API,它是用于获取有关类、函数及其参数信息的接口。JPython 使用 Reflection API 自动生成接口,因此它可以毫不费力地调用任何 Java 类。

Andrew: 您能谈谈计划在未来版本的解释器中添加的任何新功能吗?

Guido: Unicode 支持正变得越来越重要,JPython 已经将 Unicode 用于其字符串类型,因此 CPython 必须对此做些什么。Tk 接口可以在各个方面得到改进——主要是速度优化。我还考虑将 Numeric Python 的数组类型添加到核心语言中;这带来了一些问题,因为 NumPy 的数组在各个方面与标准 Python 列表的行为不太一样,这可能会造成混淆。另一个感兴趣的主题是消除在 Python 中实现的类和作为 C 模块实现的扩展类型之间的区别。JPython 在这方面比 CPython 具有更好的模型,因此这些改进可能会从 JPython 传播回 CPython。

已经为一些有趣的功能提出了几个建议,这些功能与当前的解释器完全不兼容,因此我不确定应该如何处理它们。例如,一个建议是静态类型;可以将给定的变量声明为整数或字符串。这种能力将使我们能够在编译时捕获更多错误,并且将使 JPython 能够生成更好的 Java 字节码转换。我们仍在考虑如何实现这一目标。

Andrew: 您希望看到 Python 朝哪些方向发展?

Guido: 更好的数据库访问模块、集成开发环境、更多文档以及更多用户,当然!

LJ Interviews Guido van Rossum
Andrew Kuchling 在华盛顿特区的 Magnet Interactive 担任网站开发人员。他过去的项目之一是使用 Python 在 Illustra 数据库之上实现的大型商业站点。您可以通过电子邮件 akuchling@acm.org 与他联系。
加载 Disqus 评论