Python 之父在 EuroPython 大会上谈论 Python

587 查看

2015 年 EuroPython 大会,Guido van Rossum 原本是用准备好的演讲稿和现场问答,但当他登台的时候,他用现场问答代替了之前准备的东西。在接受观众提问之前,他先自问自答地解释了一些问题:包括 Python 3(及3.5),为何没有 Python 2.8,为何有许多 Open bugs,PyPy 和 Python 中他所讨厌的部分。

Django Girls

Van Rossum自己的第一个问题聊了一下大会前一天的主题 Django Girls。他说那是很精彩的演讲,他喜欢讲故事。但在现在的演讲里没有相关的内容,也没有漂亮的幻灯片。他非常震惊,当他听到 Ola为这些幻灯片画松鼠和獾的时候。

他喜欢的另一个方面是,他们申明不知道自己在做什么的。这让他想起了25年前,当他开始写 Python 的时候。在那时,他也不知道之后做什么。比如,他不知道编程语言需要一个有许多不同角色的社区。

他对在一年内创造如此“有影响力的品牌”印象十分深刻。“我预言Ola and Ola 和 Django Girls会走得很远”

Python 版本

他的下一个疑问是关于为何开发者要换到 Python 3。“为何你不能放弃Python 3?”,他自问。但他并没有说开发者应该换到 Python 3。虽然他希望切换,但因为开发者还有许多困难的工作要做,比如应用或网站的功能。Python 2.7 还没过气,可能在接下来五年里,还会继续在安全修复上得到支持。移植到Python 3 有很多枯燥乏味的工作,何必自找麻烦?

[Guido van Rossum]

一方面,Python 3是比Python 2更好的编程语言,教学更容易。比如,Python Grils 的研习会全是基于Python 3。要说 Django 开发者没有做过基于框架接口的垃圾工作,那从来都是不可能的。这样一来,使得首次体验Python(和Python框架)的人感觉更愉快。

随着时间推移Python也在变得更好,比如,在Pyhon 3.5中有许多酷的新东西。他说,Python 2是一种好的编程语言,而且仍将是一如既往的这样,这让它渐渐地向完美2.7靠近。从核心开发人员所有工作中获益的唯一方式是迁移到Python 3。

接下来是,长期存在的问题是,为何没有发布 Python 2.8。虽然 Van Rossum注意到,可能这个的问题有些过时了在这个点。Python2.8 没有解决任何开发人员想使用它解决的问题,或者没有新的特性,这表明没有理由只是停留在 2.7,而移植到 Python 3 的闸门被打开了,这使得移植到 2.8 与移植到 3 所需的工作基本相同。

当然,Unicode 是移植到Python 3 的障碍,但是“适可而止”。Python2  处于不会再新增特性的状态,这让核心开发人员集中注意力做好Python 3。

他接下来谈及了即将在 9 月份完成的Python 3.5。从这个发布版本选择最喜欢的特性很麻烦,因为里边有太多酷的东西。比如,os.scandir()极大提升了 性能,但这可能没被大多数人注意到。一小部分Python用户会高兴看到新的矩阵乘法运算符(matrix multiplication operator)。像NumPy等科学计算包,将开始使用这个运算符,这将使得写矩阵运算用“一种更自然的方式而不是函数调用”。

或许他最喜欢的 Python 3.5 特性是输入提示 , 因为这是他自己做的PEP。为了让PEP接受它,他可下了不少功夫。自己做为自己的特性当裁判,说服接受自己的工作,这也有点奇怪。不过他还是希望还是有人来给帮他做一个独立的评审,就像Mark Shannon 曾经作为 BDFL 代表做过的事情一样,他说。

如果你对这个也不感到意外的话,上一个 PEP 接受的 Python 3.5 特性就是他个人偏好的异步与等待关键词命名。这个提供一种更自然的方式去写协程代码。

开放的bug

最近有人问及他关于 Python bug 跟踪器里所有开放 bug 的问题。如果你随便找一个开放的 bug 看,你会发现这个 bug可能已经打上了补丁,还有一长串的讨论,甚至核心的开发人员也说补丁可以合并进主干了,但是其实 bug并没有修复。这是由于一个老好人,或者是蹩脚的核心开发者造成的?那获得这些补丁还能做些什么?

他说,对于任何大项目都是这样的。bug没有马上关闭,像误读文档之类的原因,导致堆积起来更多bug。比如,由于硬件或者环境问题,重现bug很困难。但是,这种bug没有补丁。

还有这种功能特性的bug,并附上补丁,但通常对于接受这种变化很犹豫,因为考虑到它们并不有用,与其他相似的语言特性不一致 ,或是会引起向下不兼容。一直不破坏现有的东西打补丁很困难。

另外,核心开发者都有许多自己负责的工作,没人付钱来为Python核心代码合并补丁。所有如果核心组没人关心某个补丁或特性,一般不会插入到合并流程。

在公司,事情略有不同。人们付钱做一些烦琐的工作,但是对于开源社区是你自愿去做不舒服的任务。一些核心开发者做了很长时间这种烦琐的工作,他们想脱离这种烦琐的工作。在bug跟踪器上有许多有很长时间的开放bug,是有许多原因的。

最后,有些统计结果被很多人忽视。如果你随机挑个bug,包括已经关闭的,你可能得到一个关闭的bug。许多bug关闭得很快,容易修改的bug趋向于被快速修复。但是,开发bug的平均生命周期随着项目的年龄线性增长,他说。

GIL

一些观众询问关于全局解释器锁GIL,想要更深入了解问题和如何解决这个问题。Van Rossum笑着反问“你有多少时间?”。他简要讲了GIL由来的历史。在Python诞生后,计算机开始有更多的核。当线程运行在不同的核上,两个或以上的线程尝试更新同一对象会产生竞争条件,尤其是Python在垃圾回收中使用到的引用计数。

一个可行的解决方法是,每个对象有自己的锁,这样会防止数据被多线程访问。但是,当没有锁竞争的时候,这样做对上锁和解锁代价昂贵。一些实验表明,这种方法使得不需要锁的单线程的性能降低 2 倍。这表明,只有当三个或更多的线程和核使用的时候才有益处。

当然,GIL诞生了(虽然这个名字在它加入到解释器之前很久就有了)。它是单个锁同时有效地锁住所有对象,以至于所有对象访问都被排序。现在的问题是,10或15年后,遍地都是多核处理器,人们想要在不用多重处理的同时利用他们(例如,独立进程而不是线程通信)。

他说,如果你现在设计新的语言,你可以不用可变对象,或者限制可变性。然而,观众说“那就不是Python了”。Van Rossum 同意“你用的是我想说的话”。GIL 周围有很多开发者不断的努力,包括 PyPy 软件事务内存(STM),以及PyParallel。其他开发者也撞破了脑袋在想解决办法。如果有人知道有什么办法能够移除GIL 且让语言保持 Python 特性,Van 和其他人将很乐意听到。

PyPy

他被问到关于PyPy的问题,他是否使用PyPy,PyPy是否某天会变成默认解释器。他回答没有使用过,但他曾经下载过,玩了几分钟,他喜欢他看到的东西。他使用Python有两种模式,要么写个小脚本做事,这种情况他只用系统内置的解释器;要么作为Dropbox工程师往集群部署Python代码。

他说,Dropbox集群运行在修改过的Python2.7,这引起观众的笑声。他说,“我之前说过,这不是秘密”。Dropbox的一部分使用PyPy,使得它运行得更快,但是公司担心一些细微的不兼容会产生奇怪的bugs,这些bugs很难跟踪。“我们已经有足够多这样的问题”。

PyPy表明你能用它执行Python比CPython快。这也提供了试验台,在此平台上可以试验像STM之类的有趣的想法。不过保守的原创使得人们只在需要提速的时候使用PyPy。这样做的问题是,当你发现的时候,你已经部署到很多机器上了,这使得迁移很困难。在这种情况下,就像迁移到Python 3遇到的问题。

Dropbox有很多第三方依赖,有一些甚至不能从源代码重新构建。这种问题对于有上百万行Python代码在生产环境上的公司很常见,即便在Google也有这种问题。这同样使得迁移困难。

总之,PyPy是一个很酷的项目,但是它有很多复选框,需要变得更易检查。他半开玩笑地建议,或许PyPy需要从Django Grils雇 Ola and Ola 来创建一个围绕这个项目更大的社区。

最喜欢的

[Guido van Rossum]

接下来的五个小问题是关于他最喜欢的。最喜欢的web框架?他说,他只用框架写过一个web应用,他最后尝试的是 Flask。最喜欢的测试库?他大多数情况只用标准库写单元测试和mock测试。编辑器?它使用Emacs,但在开始使用VI(两种都得到不同听众的喝彩)。他仍就偶尔使用Vi(或VIM),但是如果使用 5 分钟后,他就要花上 15 分钟重新适应Emacs。

除了Python最喜欢的编程语言是什么?他过去常常说是 C 语言,但是“有点无聊”。他信赖的人告诉他现代 C++ 是个优秀的语言。他喜欢Go,但是没有用它编写任何有意义的东西。当他与设计师交谈后,他喜欢Swift,它从 Python 偷了一堆东西。从语言中抄袭你喜欢的不好的东西,并以一堆不合逻辑的特性而告终很容易,但是 Swift的设计者看起来没有这样做。最后,喜欢的异常?在更多的欢呼和笑声中,他轻轻地笑着回答是键盘中断。

他所讨厌的

最后的问题是他讨厌 Python哪些方面。他马上回答:“任何与打包发布有关的事情” 。总是有与版本交叉和依赖有关的问题引起“永无止境的混乱”。他害怕同事跑过来问他 “一个简单的 Python问题”,有一半是某种输入路径问题而且没有什么简单的解决办法。

然后,他的时间到了。EuroPython 会议主办方为每个主讲嘉宾提供了一份礼物:一顶巴斯克贝雷帽和一个大手帕。在 Van Rossum 演讲的最后呈上礼物了。