上个月,Python之父GuidovanRossum转发了一篇文章《The Origins of Python》,引起了我的浓厚兴趣。众所周知,Guido在1989年圣诞节期间开始创建Python,当时他在荷兰数学与计算机科学研究所(CWI)工作,并参与了一种用于教学的ABC语言的设计和实现。这段工作经历和ABC语言的一些设计思想对Python产生了重要的影响。文章的标题是“Python的起源”。这篇文章的作者LambertMeertens是Guido在CWI的导师。他以亲眼目睹的同事的视角,从零开始讲述了Python的起源。我从来没有看过这样的文章,所以我很感兴趣。文章中与Python直接相关的部分并不多。作者花了很多时间介绍ABC项目的演变和讨论编程语言的设计(特别强调Simplicity)。最引起我兴趣的内容是:缩进语法的设计!更引人注目的是缩进的使用。尽管在用ALGOL60或其后代(如Pascal)编写的程序中,使用缩进作为排版布局特征来阐明命令的分组很常见,但这是一个完全可选的表示选择,纯粹是为了人类读者的利益.在P.J.Plauger的一篇题为“编程语言中的信号和噪声”的文章中,16我们发现了(当时)激进的想法“让编译器读取与我们人类相同的信号,并让缩进控制分组”,这是我们的建议热情地跟着。指示一组命令属于一起的缩进随后在B0程序中成为强制性的,这种设计选择在所有迭代中都得到了维护。17——摘自《The Origins of Python》简单总结:当时在设计一种新的编程语言时,受一篇文章的强烈影响,决定只使用缩进语法来控制代码块的分组。核心思想是“让编译器读取与我们人类相同的信号”。为了代码简单和理解一致性,其他代码分组方案被丢弃。我强烈推荐Python的强制缩进语法。我曾经写过一篇文章《Python为什么使用缩进来划分代码块?》,介绍了8个这样设计的理由。不过这篇文章收到了很多反对意见,所以我又写了一篇文章《Python 的缩进是不是反人类的设计?》。我知道我的两篇文章还不足以说服那些讨厌Python缩进的人,但是如果有更多关于这种设计的原因和想法来源的信息,也许可以稍微改变一些人的看法,同时时间给喜欢这种设计的人提供一些信心~作为ABC语言的继承者,Python的缩进语法应该主要是来源于它。因此,我决定顺着上一篇文章的线索,继续深挖他们缩进语法的由来。上面提到的这篇文章的标题是《编程语言中的信号与噪声》(SignalandNoiseinProgrammingLanguages),发表于1975年ACM年会的ProceedingsoftheACMAnnualConference。作者P.J.Plauger是世界著名的计算机科学家、C/C++技术专家和TheStandardC库的作者、标准C:参考和标准模板库。本文想要区分编程语言的哪些语法对读者来说是有用的信号,哪些只是无用的噪音。文中提到了一个编程理论:“Thingswhichgetsaidlotshouldbeconcise(Thingswhichgetsaidlotshouldbeconcise)”。因为代码经常被分组到块中,所以“信号与噪声”一文批评了begin...end和do...end这两种当时常见的代码分组语法,认为它们是糟糕的设计。它并不反对花括号“{...}”的语法设计,而是提出了一种更激进的设计,即只使用缩进来控制代码分组(lettheindentingcontrolgrouping)。据我了解,P.J.Plauger建议我们从编程语言中去除噪音。人们在阅读代码时,可以直观地根据代码的缩进层次进行分组,因此缩进本身就是一个有意义的信号。如果机器能够彻底做到“所见即所得”,那么连“{...}”这样简洁简洁的设计都不需要了。P.J.Plauger是一个善于总结编程风格/原则的人。他与人合着了一本书《The Elements of Programming Style》(译:编程风格),介绍了70多个最佳实践和编程规则。然而,与他提出的经典编程规则相比,“使用缩进对代码块进行分组”不仅在40多年前是一种激进的、不太被接受的风格,在今天仍然让一些人无法接受。CWI团队在最初设计ABC语言时,积极采用缩进的设计来进行分组。通过追溯那篇“老”文章的出处,我们知道这个设计并不是他们突然冒出来的,而是有一定的设计思想引导的。除了个人对“BDFL”的喜好,也暗示了这一层思想的渊源。此外,在《The Origins of Python》中给出了比《编程语言中的信号与噪声》更早的两个起源:1965年的ISWIM编程语言(“IfyouSeeWhatIMean”的首字母缩写词)。它可能是第一个使用缩进来对块进行分组的文档化语言代码(虽然没有实现),其设计者在《The Next 700 Programming Languages》DonaldKernuth1974DonaldKnuth(唐纳德·克努斯,著名计算机科学家,图灵奖获得者,经典名著作者《计算机程序设计艺术》)中将其称为“越位规则”)在ACMnewsletter上发表了文章《?Structured Programming with?Go To?Statements》。当他想象未来的编程语言时,他说:我们可能最终只编写小模块,这些小模块在构建大模块时会用名称来标识,这样缩进而不是定界符之类的设备可能会成为表达本地语言的可行方法源语言中的结构。值得注意的是,Donald提供的参考资料是ISWIM之父1965年的文章《The Next 700 Programming Languages》,里面包含了很多大佬对缩进的讨论观点。受限于当时的计算机硬件和编辑工具,考虑到印刷对代码排版的现实影响,纯缩进分组的代码确实会带来一些麻烦。因此,这些编程界的先驱们只是在大胆想象未来编程语言的语法,当时并没有实现任何编程语言。从1965年的ISWIM,到1974年Donald的想象,再到1975年P.J.Plauger的激进想法,再到80年代ABC和Python的实现。20多年确实是很长的时间。如今2022年即将过去,Python已经过了它的“三十岁”,受这种设计思想影响的编程语言也遍地开花:据维基百科统计,近30种语言使用了“Off-side”规则”。虽然某些语言(例如Scala、Nemerle、Haskell)仅提供可选或部分支持,但这份列表意味着在花括号称霸的时代,缩进的火花依然鲜活。展望未来,我相信会有更多的语言加入到这个列表中,届时有望打破Python的统治地位。现在总结一下。本文首先关注Python之父导师年轻时写的《Python起源》一文,但发现最引人入胜的话题是缩进,于是文章话题转向《Python缩进语法起源》。不可否认,Python的缩进语法是一种比较大胆的编程风格,但从另一个角度,你也可以认为它非常前卫,因为它源于计算机科学家在畅想未来编程语言时的一种创造力。缩进语法简洁、紧凑、清晰,是Python之美的最大贡献者之一。人生苦短,我用Python!最后,如果你对Python其他语法的由来、为什么这样设计、与其他语言的区别等话题感兴趣,请关注“WhyPython”系列(请在Github上给个小star,喵~)
