Python的起源和发展

2019年6月15日 / 91次阅读 / Last Modified 2019年8月22日
故事

不了解点历史,就不能很好地把握现在和未来。对于程序员来说,了解一门编程语言的起源和发展,很有趣,也很有价值。除了去思考很多当时的为什么以外,还可以假设一下,如果自己处在当时的场景,是否会去做点什么!?计算机和编程语言的发展历史并不是很长,Python的更短。

Python的起源

Python的作者,Python之父,Guido van Rossum,是荷兰人,生于1956年1月31日。1982年,Guido从阿姆斯特丹大学(University of Amsterdam)获得了数学和计算机硕士学位。然而,尽管他算得上是一位数学家,但他更加享受计算机带来的乐趣。用他的话说,尽管拥有数学和计算机双料资质,他总趋向于做计算机相关的工作,并热衷于做任何与编程相关的活儿。

Guido van Rossum,拍于2014年
Guido van Rossum,拍于2014年

在那个时候,他接触并使用过诸如Pascal、C、 Fortran等语言。这些语言的基本设计原则是让机器能更快运行。在80年代,虽然IBM和苹果已经掀起了个人电脑浪潮,但这些个人电脑的配置很低 (在今天看来)。比如早期的Macintosh,只有8MHz的CPU主频和128KB的RAM,一个大的数组就能占满内存。所有的编译器的核心都是做优化,以便让程序能够在有限的资源里运行。为了增进效率,编程语言也迫使程序员像计算机一样思考,以便能写出更符合机器口味的程序。在那个时代,程序员恨不得用手榨取计算机每一寸的能力。有人甚至认为C语言的指针是在浪费内存。至于动态类型,内存自动管理,面向对象…… 别想了,那会让你的电脑陷入瘫痪。

然而,这种思考方式让Guido感到苦恼。Guido知道如何用C语言写出一个功能,但整个编写过程需要耗费大量的时间 (即使他已经准确的知道了如何实现)。他的另一个选择是shell。Bourne Shell作为UNIX系统的解释器(interpreter)已经长期存在。UNIX的管理员们常常用shell去写一些简单的脚本,以进行一些系统维护的工作,比如定期备份、文件系统管理等等。Shell可以像胶水一样,将UNIX下的许多功能连接在一起。许多用C语言要写上百行的程序,在shell下只用几行就可以完成。然而,shell的本质只是调用命令。它并不是一个真正的编程语言。比如说,shell没有数值型的数据类型,加法运算都很复杂。总之,shell不能全面的调动计算机的功能。

Guido希望有一种语言,这种语言能够像C语言那样,能够全面调用计算机的功能接口,又可以像shell那样,可以轻松的编程。ABC语言让Guido看到希望。ABC是由荷兰的CWI (Centrum Wiskunde & Informatica, 数学和计算机研究所)开发的。Guido在CWI工作,并参与到ABC语言的开发。ABC语言以教学为目的。与当时的大部分语言不同,ABC语言的目标是“让用户感觉更好”。ABC语言希望让语言变得容易阅读,容易使用,容易记忆,容易学习,并以此来激发人们学习编程的兴趣(所以取名为ABC,表示很easy的意思)。比如下面是一段来自Wikipedia的ABC程序,这个程序用于统计文本中出现的词(word)的总数:

# ABC语言,已成为历史
HOW TO RETURN words document:
   PUT {} IN collection
   FOR line IN document:
      FOR word IN split line:
         IF word not.in collection:
            INSERT word IN collection
   RETURN collection

一个Python程序员应该很容易理解这段程序。

HOW TO用于定义一个函数。使用冒号(:)和缩进来表示程序块(C语言使用{}来表示程序块),行尾没有分号。for和if结构中也可以没有括号()。如果将HOW TO改为def,将PUT行改为collection = [],将INSERT行改为collection.append(word),这就几乎是一个标准的Python函数。上面的函数读起来就像一段自然的文字。

尽管已经具备了良好的可读性和易用性,ABC语言最终没有流行起来。在当时,ABC语言编译器需要比较高配置的电脑才能运行。而这些电脑的使用者通常精通计算机,他们更多考虑程序的效率,而非它的学习难度。除了硬件上的困难外,ABC语言的设计也存在一些致命的问题:

  • 可拓展性差。ABC语言不是模块化语言。如果想在ABC语言中增加功能,比如对图形化的支持,就必须改动很多地方。
  • 不能直接进行IO。ABC语言不能直接操作文件系统。尽管你可以通过诸如文本流的方式导入数据,但ABC无法直接读写文件。输入输出的困难对于计算机语言来说是致命的。你能想像一个打不开车门的跑车么?
  • 过度革新。ABC用自然语言的方式来表达程序的意义,比如上面程序中的HOW TO (如何)。然而对于程序员来说,他们更习惯用function或者define来定义一个函数。同样,程序员也习惯了用等号(=)来分配变量。这尽管让ABC语言显得特别,但实际上增加了程序员的学习难度 (程序员大都掌握不止一种语言)。
  • 传播困难。ABC编译器很大,必须被保存在磁带(tape)上。当时Guido在CWI工作期间,就必须用一个大磁带来给别人安装ABC编译器。 这样,ABC语言当然就很难快速传播。

1989年,为了打发圣诞节假期,Guido开始写Python语言的编译/解释器。Python这个名字,来自Guido所挚爱的电视剧Monty Python's Flying Circus (BBC 1960-1970年代播放的室内情景幽默剧,以当时的英国生活为素材)。他希望这个新的编程语言叫做Python,能实现他的理念(一种C和shell之间,功能全面,易学易用,可拓展的语言)。Guido作为一个语言设计爱好者,已经有过设计语言的(不很成功)的尝试。这一次,也不过是一次纯粹的hacking行为。

在各种偶然和必然之间,Python就这样开始萌芽了。

Python的早期历史

1991年,第一个Python解释器诞生。它是用C语言实现的,并能够调用C库(.so文件)。从一出生,Python已经具有了:类(class),函数(function),异常处理(exception),包括表(list)和词典(dictionary)在内的核心数据类型,以及以模块(module)为基础的拓展机制。

python logo 1990-2006, 由Guido的兄弟Just van Rossum设计
python logo 1990-2006, 由Guido的兄弟Just van Rossum设计

Python语法很多来自C,但又受到ABC语言的强烈影响。来自ABC语言的一些规定直到今天还富有争议,比如强制缩进。但这些语法规定让Python容易读。另一方面,Python聪明的选择服从一些惯例(特别是C语言的惯例)。比如使用等号赋值,使用def来定义函数。Guido认为,如果“常识”上确立的东西,没有必要过度纠结。

Python从一开始就特别在意可拓展性(extensibility)。Python可以在多个层次上拓展。从高层上,你可以引入.py文件(就是import模块,这个灵感来自Modula-3语言)。在底层,你可以引用C语言的库。Python程序员可以快速import模块。Guido形容模块机制为“一个Python主要的编程单元( one of Python's major programming units )”。当性能是考虑的重要因素时,Python程序员又可以深入底层,写C程序,编译为.so文件引入到Python中使用。Python的异常处理机制也很像Modula-3语言,只是添加了else部分。

Python就好像是使用钢构建房一样,先规定好大的框架。而程序员可以在此框架下相当自由的拓展或更改。

最初的Python完全由Guido本人开发。Python得到Guido同事的欢迎。他们迅速反馈使用意见,并参与到Python的改进。Guido和一些同事构成Python的核心团队。他们将自己大部分的业余时间用于hack Python (也包括工作时间,因为他们将Python用于工作)。随后,Python拓展到CWI之外。Python将许多机器层面上的细节隐藏,交给编译器处理,并凸显出逻辑层面的编程思考。Python程序员可以花更多的时间用于思考程序的逻辑,而不是具体的实现细节 (Guido有一件T恤,写着:人生苦短,我用Python)。这一特征吸引了更多程序员的注意。Python开始流行。

Version 1

1994年,Python发布1.0版本。这个版本主要的新特性包括一些函数式的编程工具,例如lambda,map,filter和reduce。

Guido van Rossum说:Python支持了lambda,reduce(),filter(),map(),这多亏了一个Lisp黑客,他很想在python中拥有这些特性并提交了补丁。

Guido在CWI工作期间发布的最后一个Python版本是1.2。到了1995年,Guido继续在位于Reston,Virginia的CNRI(Corporation for National Research Initiatives)从事Python的开发工作,并发布了几个版本。

到了版本1.4,Python有个几个新特性。比较受关注的是keyword arguments这个特性,这个特性也是被Modula-3语言启发,同时也很像Lisp。另一个主要新特性是支持复数(complex numbers)。

Guido van Rossum在CNRI工作期间,他发起了CP4E(Computer Programming for Everybody)项目,致力于使更多的人通过基本的,就像英语文本一样的编程语句,以及大多数雇员都需要掌握的数学技能,来接触编程。Python在这个项目中是主角,因为它的清晰的语法很适合CP4E的目标,就像它的前任ABC语言。这个项目由DARPA资助。到了2007年,CP4E不再活跃,而在此期间,Python尝试语法和语义的易于学习和非神秘,接触非程序员群体不在是主要的考虑。

BeOpen.com时期

2000年,Python核心开发团队加盟BeOpen.com,形成BeOpen PythonLabs团队。CNRI要求Python 1.6版本的发布,将团队离开CNRI之前的进展打包到这个版本。但这导致了1.6版本和2.0版本的发布重叠。Python 2.0版本是团队在BeOpen.com的唯一发布的版本。在2.0版本发布之后,Guido van Rossum和其它核心成员加盟了Digital Creations。

Python 1.6版本包含了一个新的CNRI许可(license),这个许可比之前版本使用的CWI需要要长很多。CNRI许可包含了这样一条说明,Python的license在Virginia州法律的管理之下。FSF(Free Software Foundation)说这条法律与GPL(GNU General Public License)不兼容。BeOpen,CNRI和FSF于是协商了一个改变,以使Python的免费软件许可能够与GPL兼容。Python 1.6.1版本本质上与1.6版本是一样的,只有很少的几个bugfix,附带了一个新的与GPL兼容的许可。

Version 2

2000年10月,Python 2.0发布,新增了List Comprehesions特性,这个特性借鉴了函数式编程语言SETL和Haskell。Python在这个特性的语法上,与Haskell很相似,借用了Haskell语言的标点符号,并结合了Python更热衷的字母关键词。Python 2.0版本还引入了垃圾收集系统(garbage collection system),这个特性用于统计对象的引用数量(对象的引用数量为0时,就清除这部分内存)。

Python 2.1版本,与1.6.1版本,以及2.0版本都很接近。这个版本的许可有了新的名字,叫Python Software Foundation License(Python软件基金会许可)。从Python 2.1 alpha版本开始,所有新增加的代码,文档和特性,都属于PSF(Python Software Foundation)。PSF是一个非盈利组织,成立于2001年,参照Apache Software Foundation(Apache软件基金会)的模式设立。2.1版本包含了一个语言特性,即支持内嵌的作用范围。(这个特性默认是关闭的,直到Python 2.2版本)

Python 2.2版本的一个主要创新,是Python types(用C实现的类型)和classes(Python自己实现的类型,即用Python语言写的类型)的统一,这个版本将这两者统一到了一个架构里面。这个统一使得Python的面向对象模型非常纯粹和一致。这个版本还新增了generator(生成器),这是受到了Icon语言的启迪。

Python 2.5版本于2006年9月发布,引入了with语句,with语句将一个代码块包含在context manager里面。with语句实现了类RAII行为模式(Resource Acquisition Is Initialization),并且替换了try/finally这样的使用习惯。

Python 2.6版本与Python 3.0版本同时发布。2009年6月26日,Python 2.7版本与Python 3.1版本同时发布。之后,并行的2.x和3.x版本发布取消,Python 2.7版本成为了Python2的最后一个版本。2014年11月,官方宣布2.7版本只支持到2020年,并鼓励用户尽快转移到Python3。

Version 3

Python 3.0版本于2008年12月3日发布,这个版本也被称为Python 3000,或Py3K。这个版本修正了Python编程语言的一些基础设计缺陷,由于无法实现与2.x版本的兼容,就有必要使用一个新的主版本号。Python3的设计指导原则是:通过移除旧的方法来减少重复特性。

Python3的开发哲学与之前的版本一样。然后,既然Python已经积累新的和冗余的编程方式来处理相同的事务,Python3的一个重点就是移除重复的结构和模块,以此来与“import this”中的哲学“应该有且只有一种更好的明显的方式来解决问题”。(import this会打印出Python之禅

尽管如此,Python3还是成为了一种多范式编程语言。程序员依然有在面向对象编程,结构式编程,函数式编程等几种编程范式中选择的自由。虽然有如何广泛的选择,相关细节在Python3中比在其它2.x版本中更加明确清晰。

Python的各版本发布日期

  • Implementation started - December, 1989
  • Internal releases at Centrum Wiskunde & Informatica, 1990
  • Python 0.9.0 - February 20, 1991
    • Python 0.9.1 - February, 1991
    • Python 0.9.2 - Autumn, 1991
    • Python 0.9.4 - December 24, 1991
    • Python 0.9.5 - January 2, 1992
    • Python 0.9.6 - April 6, 1992
    • Python 0.9.8 - January 9, 1993
    • Python 0.9.9 - July 29, 1993
  • Python 1.0 - January 1994
    • Python 1.2 - April 10, 1995
    • Python 1.3 - October 12, 1995
    • Python 1.4 - October 25, 1996
    • Python 1.5 - December 31, 1997
    • Python 1.6 - September 5, 2000
  • Python 2.0 - October 16, 2000
    • Python 2.1 - April 15, 2001
    • Python 2.2 - December 21, 2001
    • Python 2.3 - July 29, 2003
    • Python 2.4 - November 30, 2004
    • Python 2.5 - September 19, 2006
    • Python 2.6 - October 1, 2008
    • Python 2.7 - July 3, 2010
  • Python 3.0 - December 3, 2008
    • Python 3.1 - June 27, 2009
    • Python 3.2 - February 20, 2011
    • Python 3.3 - September 29, 2012
    • Python 3.4 - March 16, 2014
    • Python 3.5 - September 13, 2015
    • Python 3.6 - December 23, 2016
    • Python 3.7 - June 27, 2018

Python的新Logo

新Logo如下:

Python现在的Logo
Python现在的Logo

BDFL

在学习Python的很多技术文档的时候,常常看到BDFL这个缩写。BDFL是 Benevolent Dictator for Life的缩写,翻译过来就是“仁慈的终生独裁者”,这个人指Python之父 Guido van Rossum。他创造了Python这门语言,被称为BDFL,看得出来人们对他的尊敬和喜爱。

现在和未来

Python经过这么长时间的发展和壮大,现在已经成了一门能够适用于各种不同领域和各种不同任务的编程语言。General purpose的编程语言很多,关键在于,使用Python,会让很多事情变得更加简单高效,成本更低。

Python在大数据分析,人工智能,运维,量化投资等领域,几乎是必选项。除了Python引以为傲的被称为“Battery Included”的标准库,还因为Python灵活的扩展特性,发展出来了一大堆非常优秀的第三方库,如numpy,scipy,pandas,requests等等等等。这些第三方库的存在,又反过来进一步推动Python本身的继续发展。

在几乎人人都需要懂一点编程技能的时代,结合Python易于学习的特性,这门编程语言未来应该是会无处不在。

Python官网:https://www.python.org/

-- EOF --

本文链接:https://www.pynote.net/archives/45

留言区

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


前一篇:
后一篇:

More


©Copyright 麦新杰 Since 2019 Python笔记

go to top