The History of Python

2009年4月24日星期五

介绍与概述

英文原文链接:http://python-history.blogspot.com/2009/01/introduction-and-overview.html
原文作者:Guido van Rossum

介绍

Python, 如同Perl、Tcl、PHP以及新进的Ruby语言那样,是最流行的动态编程语言之一。虽然常被称作“脚本”语言,Python是一门功能齐全的通用编程语言,就像Lisp和Smalltalk以及其他通用编程一样。发展到今日Python的应用已经无所不在,从随写随丢的简单脚本到24x7不间断大规模网络服务应用随处可见其身影。Python的应用场所包括GUI和数据库编程、网络客户端和服务器端编程 、程序测试。科学家在世界上运行最快的超级计算机上编写程序用到了Python,Python还是小朋友初次学习编程时的好帮手。

在这个Blog中,我将讨论重点放在Python的发展历史上,特别是如下方面:Python是如何开发的,设计时所受到的主要影响,所犯的错误和从中吸取的教训,以及Python语言未来的发展方向。



感谢: 我要感谢 Dave Beazley ,为这个Blog提供的许多优美语句。(有关这个Blog起因的更多信息,参考我另外Blog的一篇博文。)



Python鸟瞰



人们初次浏览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为代表的编程语言另外一个主要区别在于Python的动态类型。在C语言中,变量必须被清晰的声明并指定类型,例如int类型或double类型。该信息在静态编译时可用于类型检查,并分配存储变量所需内存。在Python中,变量只是引用对象的名字,变量在赋值前不需提前声明,甚至在程序运行中变量类型还可以发生变化。如同其他动态语言那样,所有的类型检查是在运行时由解释器完成的,而非一个单独的编译步骤。

Python基本内置数据类型包括布尔类型、数值型(机器字整数、任意精度整数,实数和复数)、字符串(8bit以及Unicode类型)。这些基本类型是不可变的,也就是说这些类型的对象所包含的值在创建后不能被改变。组合内置数据类型有tuple(不可变数组)、list(可变数组)和dictionary(hash表)。

在程序结构方面,Python支持包(由模块和/或包组成)、模块(由相关代码组成的单个源代码文件)、类、方法和函数等多个级别。对于程序流控制,则有 if/else, while, 和一种对任意可迭代对象适用的高级for语句,对于出错处理,Python采用了(不可恢复的)异常机制。raise语句抛出异常,try/except/finally 语句处理异常。在遇到错误时,内置操作就抛出异常。

在Python中所有可以被命名的对象都可以被称作“一类公民”(“first class”)。这意味着函数、类、方法、模块以及其它可命名对象在运行时可被随意赋值给其它对象、被查看或者被放入各种数据结构中(例如list或者dictionary)。提到对象,还要说的是,Python全面支持了面向对象编程,包括用户自定义类、继承、运行时方法动态绑定等。

Python有丰富的标准库,这也是Python流行的主要原因之一。标准库超过了100多个模块且继续改进丰富中。这些模块包括了正则表达式匹配、标准数学函数、线程、操作系统接口、网络编程、标准互联网协议(HTTP、FTP、SMTP等)、email模块,XML处理、HTML解析以及一个GUI模块(Tcl/Tk)。

另外,还有极其丰富的第三方模块和包,其中大部分是开源的。有web开发框架(数目之多数不胜数),许多GUI开发工具箱、高效的数值计算库(流行的Fortran包也有Python封装),Oracle、MySQL等多种数据库的Python接口,SWIG是将各种C++库封装为Python模块的工具……还有许多优秀模块,不胜枚举。

Python的一个主要优势在于有些复杂的任务可以用很少几行代码轻松完成(这也是动态语言的共同优点)。以下为一个示例,这个简单的Python脚本抓取一个网页,分析内容,得到其中URL链接,并打印前10条。


#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# 扫描网页,获得其中的超链接

import re
import urllib

regex = re.compile(r'href="([^"]+)"')

def matcher(url, max=10):
"打印从当前URL获取内容中所包括的前面几个URL"
data = urllib.urlopen(url).read()
hits = regex.findall(data)
for hit in hits[:max]:
print urllib.basejoin(url, hit)

matcher("http://python.org")



这个程序很容易改进为Web爬虫,而且,Scott Hassan 确实告诉过我Google的第一个Web爬虫就是由他用Python写成的。现在Google有数以百万行计的代码用于管理运行的各个方面,从自动构建到广告管理。(声明:作者目前为Google员工。)

更近距离的继续观察,Python的实现是由字节码编译器和解释器组合而成的。模块被加载时,编译器缺省被调用,有几条Python语句还要求在运行时可以使用编译器。虽然Python的最主要实现是用C语言完成的,还存着其它几种正在流行的Python实现。Jython 是一个运行在JVM上可以和Java无缝连接的版本。IronPython是微软.NET平台上可以和其它.NET语言集成在一起的实现。PyPy 是一个由Python实现的优化Python编译器/解释器(PyPy是欧盟资助项目,目前仍处在研究阶段)。还有Stackless Python,这是一个C实现的变种,特点在于函数/方法调用时减少了对C堆栈的依赖,以实现协程, continuations,和微线程。

没有评论: