为什么 Python 是最好的
最近在 Geek Ranch,我们决定用 Python 实现一些软件。或者更准确地说,是我决定的,而且没有人反对。然后 Python 在 LJ 读者选择调查中被选为最佳脚本语言。这启发了我写这篇文章(并准备好迎接 Perl 和 Ruby 粉丝的叫喊)。
为了理解我的立场,您需要了解我的背景和经验。是的,这将会很长,但我认为这是必要的。
我学习的第一种编程语言是 40 多年前带有 Format 的 Fortran。Fortran 迅速发展,我学习了 Fortran II、Fortran IV 和 Fortran V。对于你们这些 Fortran 人士,我需要解释一下 Fortran V。
Fortran V 基于 Fortran IV,由计算机科学公司在 1960 年代后期在 Univac 1100 系列硬件(以及可能的其他 Univac 系统,如 494)上实现。它扩展了 Fortran,包括参数语句——基本上是一种定义常量、条件编译和语句函数的方式——基本上是生成内联代码的宏。
1970 年,我加入了计算机科学公司,从事他们正在开发的新分时系统 CSTS 的系统测试工作。虽然我的一些工作是用汇编语言完成的,但大部分是用 Fortran V 完成的。对我来说,它是当时我可用的“最佳脚本语言”。(在一段时间内,它也是我在 CSTS 本身上唯一可用的语言。)
除了玩过 Sympl(一种由 CSC 设计用于系统编程的语言,我在 CDC Cyber 系统上使用过),Fortran 一直是我的主要高级“解决问题”语言,直到 1980 年。我生命中的其他语言是各种处理器的汇编语言,包括 Motorola 6800、6809 和 68000。
其中一个例外是在 Pascal 上花了一些时间。这有点偶然。我在常青州立学院找到了一份兼职工作,教授编程风格课程。课程大纲对我来说很有意义,面试也很顺利。惊喜的是,当我接受这份工作时,我的老板说:“哦,这是我们使用的教科书”。虽然这门课主要是理论,但 Pascal 是“将理论付诸实践的工具”。
有了适用于我的 SWTP 6809 系统的 Pascal 编译器,我在学生之前两周学会了 Pascal,一切都很顺利。Pascal 被设计成一种教学语言,它很有道理。例如,它迫使您费尽周折进行类型转换,从而防止编程意外。
1980 年,我在一家制造半导体晶圆探针的公司找到了一份工作。他们过去的系统仅仅是通过一堆硬件逻辑控制的,但我们将要制造终极探针。这包括记忆芯片布局的能力,然后在放置新的晶圆(一种带有多个芯片的圆形硅晶片)时自动将探针与芯片对齐。
作为软件专家,我需要决定用哪种语言来实现这个系统。我最初认为 Pascal 可以工作,并为我们的 CP/M 系统订购了两个不同的 Pascal 编译器。长话短说,Pascal 还没有为黄金时代做好准备。为了使其成为“生产语言”,它被糟糕地扩展了。
这让我做出了一个新的决定:我们需要一个 UNIX 系统,我们将用 C 语言开发。我的老板相信了我(他对软件、UNIX 或 C 一无所知),我订购了一切。他当时不知道的是,我从未见过 UNIX 系统,也从未用 C 语言编程过。
UNIX 和 C 证明了它们的价值,项目取得了成功,我跳槽到下一家公司,几乎做了同样的事情。但是,随着我对 UNIX 越来越熟悉,我决定我的某些工作需要一种更高级的语言。在稍微考察了一下之后,我决定 awk 就是那种语言。它曾经是,而且对我来说,现在仍然是一种非常有用的语言,如果您需要处理一些字符数据。我甚至用 awk 编写了一个 Web 应用程序,允许客户查询他们的订单状态,只是为了证明这是可以做到的。而且做起来甚至不痛苦。
在一个更“awk 式”的冒险中,我的老老板(他当时在一家制造微处理器硬件模拟器的公司)问我是否可以为他做一个项目。他们正在从基于 6809 的模拟器转换为基于 68000 的模拟器,并且需要将数千行指令集编码和解码表从 6809 汇编语言转换为 C 语言。他估计如果用 C 语言完成这项任务需要一个月的时间。我用 awk 和 sed 大约三天就完成了。
所以,我现在是一名 C 程序员和一名 awk 脚本编写者。问题是我的工具集中存在一个空白。与 Fortran V 不同,在 Fortran V 中,我甚至找到了一种在 Fortran 框架内构建和执行汇编语言代码的方法,如果我想做任何字符处理以外的事情,我必须用 C 语言编写代码。在大多数情况下,这还不错,但有时 99% 的任务可以很容易地用几行 awk 完成,但却需要大量的 C 代码。
嗯,1999 年,我有机会采访了 Python 之父 Guido van Rossum。虽然我已经开始玩 Python 了,但我与 Guido 的聊天(不仅仅是一次采访)启发我更加认真地对待它。这次采访实际上解决了 awk 和 Perl 的问题,所以我不在这里赘述。
虽然我过去近十年的生活主要不是编程,但我确实将 Python 作为我的首选工具。我所做的一些事情可以称为脚本编写,但并非全部。例如,我用 Python 为 Visanet(所有可能的信用卡协议中最糟糕的)实现了一个信用卡处理系统。我还使用 Karrigell 做了一些工作,Karrigell 是一个用 Python 实现的 Web 框架。
好的,我谈到了 awk 的局限性,Guido 在采访中帮助我批评了 Perl。请注意,我对 Perl 的默认评论是,如果您不了解正则表达式和 UNIX/Linux shell 编程,Perl 不是了解脚本语言的最佳方式。那么,还剩下什么?显而易见的选择是 Ruby。
嗯,这就是我漫长而无聊的 Pascal 经验历史的用武之地。首先,让我说我喜欢 Ruby。它是一种设计精良且非常干净的语言。如果您还不了解 Python,您应该认真尝试一下。但是,它比 Python 更好吗?我认为不是。
Ruby 虽然不是真正的新语言,但它所做的工作不如 Python 多。就像 30 年前的 Pascal 一样,Ruby 在纸面上看起来不错。Pascal 的成名之处在于没有惊喜。Ruby 的成名之处在于它是纯粹的面向对象。这些都是好事。但是,随着 Ruby 做更多繁重的工作,在我看来,它很可能不得不进化。也就是说,它的纯粹性会像 Pascal 的纯粹性一样被颠覆。
无论如何,我将坚持使用 Python。多年来它肯定已经发展,但这种发展感觉就像是在坚实的基础上,看看是什么让它更有用,并干净利落地处理进化。对我来说,Python 2.5 比 Python 1.5.2 更容易向别人解释。