本系列文章译自Python之父 Guido van Rossum 的系列博客“The History of Python”。这个博客系列对我们理解Python及其演变很有帮助,在这里翻译推荐给大家,希望大家喜欢,也请大家多多指教!
最近,Python已经和 Perl、Tcl、PHP 以及后来者 Ruby 一样,成为最受欢迎的动态编程语言之一。虽然常被当做一种“脚本”语言,但 Python 实际上和 Lisp 或 Smalltalk (及其他编程语言)一样,是一种通用语言。
如今,不论是一次性的脚本,还是需要 *724 **不间断运行的大型web服务器,或者是GUI编程、数据库管理、应用测试,都在使用 Python。科学家们可以使用 Python 为世界上最快的超级电脑编写应用,孩子们可以通过Python获得第一次编程的乐趣。
在本系列博客中,我将讲述 Python 历史中的一些故事。特别是这门语言是如何开发、演进的,它的设计主要受哪些因素影响,开发过程中犯了哪些错误,吸取了哪些经验教训,以及它未来的发展方向等。
Python 与 C
第一次接触 Python 的人,往往会感到迷惑,至少从表面看,Python 代码和传统的编程语言比如 C 或者 Pascal 非常类似。这不是偶然的——Python语法很大程度上借鉴了 C 语言。
比如说,Python 中的很多关键字(if , else, while, for 等等)与 C 语言一样,Python 标识符的命名规则也和 C 语言一样,而 Python 中的大多数操作符也和 C 语言中的操作符一个意思。
当然,Python和 C 也有明显的不同,其中一个主要区别,是 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中,所有类型检查都是在程序真正运行时,而不是单独的编译过程中执行的。
数据结构与流程控制
Python 内置的基本数据类型包括布尔值、数字(根据系统位数决定的整型、任意精度整型、实数以及复杂的浮点数)和字符串(8-bit字符串、Unicode字符串)。这些都是不可变类型,对象创建之后就无法修改。组合数据类型包括元组(不可变序列)、列表(可变序列)以及字典(哈希表)。
对于程序的组织,Python 支持的概念包括包(一组模块或包)、模块(组织在同一个文件中的相关代码)、类、方法以及函数等。对于流程控制,它提供的关键字包括 if / else、while 以及可以处理任意“可迭代”对象的 for 语句。对于错误处理,Python 使用了(不可恢复的)各类异常。通过 raise 语句可以抛出异常,通过 try / except / finally 语句可以进行异常处理,Python内置了遇到错误时抛出异常的操作。
在 Python 中,所有对象都是平等的。不论是函数、类、方法、模块,还是任何其它对象,都可以在程序运行过程中自由地传递、检测,或者置于各种数据结构中(比如说列表或字典)。并且 Python 是面向对象的,支持自定义类、继承以及运行时绑定的各种方法等。
丰富的资源与简洁的实现
作为其备受欢迎的原因之一 ,Python 拥有一个庞大的标准库,内含 100 多个模块并在持续发展中。包括正则表达式匹配、标准数学函数、线程管理、操作系统接口、网络编程、标准网络协议(HTTP、FTP、SMTP等)、邮件处理、XML解析、HTML解析、GUI套件(Tcl / TK)等。
同时,Python 拥有强大的第三方包资源,其中大多数都是开源的:web框架(太多了)、更多的GUI套件、高效的数据处理库(包括很多从流行的 Fortran 包转过来的)、关系型数据库接口(Oracle、MySQL 及其它)、SWIG(一种让 C++ 库可以在Python中使用的工具)等等。
Python 的一个魅力在于,似乎可以用极少的代码完成很复杂的任务(就这个问题而言,其它动态语言也一样)。举例来说,下面这个简单的脚本可以抓取一个网页,找到上面的 URL 并打印前 10 条:
''# 检索页面上的 URL
''import re
''import urllib
''regex = re.compile(r'href="([^"]+)"')
''def matcher(url, max=10):
'' "打印指定网页中首先匹配到的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 (译注:少为人知的谷歌“第三创始人”)曾跟我说,他为 Google 写的第一个爬虫就是用的 Python。如今,从自动化构建到广告管理,Google 在各类经营活动中使用了数百万行 Python 代码。(免责声明:我是 Google 员工(译注:本文写于2009年,后来他去了 Dropbox))
代码编译与解释
从底层看,Python 是典型的通过字节码编译器-解释器来运行的。编译过程会在模块加载时完成,而一些基本数据类型则在运行过程中进行编译(译注:因为是动态类型)。虽然 Python 事实上的标准解释器是用 C 语言写的(译注:CPython),可以运行在所有软硬件平台上,但也还有其它几种解释器比较流行。
Jython 是运行在 JVM 上的 Python 解释器,它使 Python 可以与 Java 无缝对接(译注:直接把Python代码编译成Java字节码)。
IronPython 运行在微软 .NET 平台,使 Python 可以与 .NET 平台的其它语言进行整合。
PyPy 是一个特别优化过的编译器 / 解释器,并且是用 Python 写的(目前还是一个研究项目,由欧盟基金支持(译注:注意,是2009年))。
另外,还有 Stackless Python,一种 C 语言解释器的变体,减少了调用函数 / 方法时对 C 堆栈的依赖,从而实现对协程(co-routines)、持续性(continuations)以及无堆栈线程(microthreads)的支持。
更多内容,欢迎关注公众号:读书录
网友评论