翻译Python历史:介绍与概述

This post is for translating an article named “Python’s Design Philosophy” by Guido van Rossum.

原文地址:http://python-history.blogspot.com/2009/01/introduction-and-overview.html

介绍

Python是目前最流行的几种动态编程语言(包括Perl、Tcl、PHP,以及新成员Ruby)之一。尽管它经常被认为是一门“脚本式”语言,但它确实是一门通用的编程语言,就像Lisp和Smalltalk以及其它语言一样。在今天,Python被用于从用一次就扔到的脚本到提供24×7小时不间断服务的大型服务器的各个领域中。它被用于GUI和数据库编程、客户端和服务器端的网络编程,以及程序测试。它既被科学家用来给世界上最快的超级电脑写程序,也被儿童用来学习编程。

在这个blog里,我将把焦点放在Python的历史上。特别是关于Python语言如何被开发、设计上的主要影响,犯的错误、学到的教训、以及未来的方向。

鸣谢:我欠了Dave Beazley很多这个blog的好的句子。(关于这个blog的更多的起源,请看我的另一个blog。)

鸟瞰Python

当人们第一次看Python时,他们常常对于代码的样子感到冲击,至少从表面上来看,很像常规的程序设计语言,比方C或Pascal。这并不是意外──Python从C上借鉴了很多语法。例如,许多Python的关键字(if、else、while、for等等)和C一模一样;Python的标识符和C有着同样的命名规则;大多数的基础操作符和C有着相同的含义。当然,很明显Python并不是C,一个主要的不同就是Python不是用括号而是用缩进来分组语句。例如,不是像C一样这样写语句

if (a < b) {
max = b;
} else {
max = a;
}

Python完全抛弃了括号(同样抛弃了句尾的分号)并且使用如下的结构

if a < b:
    max = b
else:
    max = a

其它Python和C样式的语言的不同是它使用动态类型绑定。在C中,变量永远必须被显式的定义像成某些特定的类型,比如说int或double。这个信息被用在进行程序的静态的编译期检查和分配用来存储变量值的内存地址。在Python中,变量只是简单的只想对象的名字。变量不需要在赋值前被定义,而且它们甚至可以在程序运行中间改变类型。像其它动态语言一样,所有的类型检查都是解释器在运行的时候进行的,而不是在每次的编译的时候。

Python的基本内建数据类新有布尔、数值(机器整数、任意精度的整数、以及实数和复数类型的浮点数),和字符串(8比特和Unicode)。这些都是不可变的类型,意思是他们是用创建后就不能改动的对象描述的。内建的复合数据类型包括元组(不可变的数组)、序列(可以改变体积的数组)和字典(哈希表)。

Python通过支持包(一组模块和/或包)、模块、类、方法和函数来组织程序。它提供if/else、while和可以循环所有“可迭代的”对象高级for语句来控制程序流程。错误处理方面,Python使用了(不可恢复的)异常。一条语句抛出了一个异常,try/except/finally语句来指定如何处理这个异常。当错误发生时,内建的操作就会抛出异常。

在Python中,所有可以被命名的对象都被称为“first class”。这意味着函数、类、方法、模块和所有其它的有名字的对象都可以在运行的时候被任意的传来传去、检查、并放在不同的数据结构(例如序列或字典)里。而且谈到对象,Python也有对面向对象编程,包括用户定义的类、继承、和运行期方法绑定的全面支持。

Python有多方面的标准库,是它能够流行的主要原因。标准库有超过100个模块而且还在继续增长中。这些模块包括正则表达式配对、标准数学函数、线程、操作系统接口、网络编程、标准互联网协议(HTTP、FTP、SMTP等等)、电子邮件处理、XML处理、HTML解析和GUI工具箱(Tcl/Tk)。

此外,还有数量相当庞大的第三方提供的模块和包,其中多数是开源的。其中有网络框架(要列出来就太多了)、更多的GUI工具箱、高效率数值库(包括对许多流行的Fortran包的封装)、关系型数据库接口(Oracle、MySQL和一些其它的)、SWIG(可以让任意C++库编程Python可使用的模块的工具)和更多。

Python(和其它动态编程语言)的一个主要的吸引力是看上去复杂的任务通常可以用非常短的代码表达。举例来说,这是一段简单的Python脚本,它抓取一个网页、扫描它并获取URL地址,然后输出其中的前10个:

# Scan the web looking for references

import re
import urllib

regex = re.compile(r’href=”([^”]+)”’)

def matcher(url, max=10):
“Print the first several URL references in a given url.”
data = urllib.urlopen(url).read()
hits = regex.findall(data)
for hit in hits(:max):
print urllib.basejoin(url, hit)

matcher(“http://python.org”)

这个程序可以容易的修改成网络抓取器,而且Scott Hassan确实曾经告诉我他用Python写了Google的第一个网页抓取器。今天,Google使用了上百万行的Python代码来管理它的各方面操作,从自动化建立到广告管理(免责声明:我目前是Google的员工。)

在底层,Python是结合字节码编译器和解释器实现的。在模块导入时,他们被隐含的编译,而且许多语言的语句在运行时需要编译器。尽管Python的事实上的标准实现是用C写的,并且可以运行在每一个的可以想象到的硬件/软件平台上,一些其它的实现也开始流行。Jython是一个运行在JVM上的版本并且和Java无缝集成。IronPython是.NET平台的版本,它和其它运星在.NET平台上的语言一样的被集成。PyPy用Python写的优化了的Python编译器/解释器(它仍然是一个EU基金下管理的研究项目)。还有一个Stackless Python,一个C实现的减少函数/方法调用对C语言的栈依赖的变种,允许并行、连续以及微线程。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据