上个月,Python之父GuidovanRossum在推特上转发了一篇文章《TheOriginsofPython》,引起了我的强烈兴趣。 Guido的推文 众所周知,Guido在1989年圣诞节期间开始创造Python,当时他就职于荷兰数学和计算机科学研究学会(简称CWI),曾参与设计与实现了一门用于教学的ABC语言。这段工作经历以及ABC语言的某些设计思想对Python有着重要的影响。 文章标题是Python的起源,文章作者LambertMeertens是Guido在CWI时的导师,以同事亲历者的视角,讲述Python从无到有的起源过程。这样的文章我还未曾读过,因此饶有兴趣。 文章内容跟Python直接相关的部分并不多,作者花了较大篇幅介绍ABC项目的演变,讨论了编程语言的设计(特别强调的是简洁性Simplicity)。 最引起我兴趣的内容是:缩进语法的设计!Morestrikingistheuseofindentation。AlthoughitwascommoninprogramswritteninALGOL60oritsdescendants,suchasPascal,touseindentationasatypographicallayoutfeatureforclarifyingthegroupingofcommands,thiswasanentirelyoptionalpresentationchoice,madepurelyforthebenefitofthehumanreader。InanarticlebyP。J。PlaugerentitledSignalandNoiseinProgrammingLanguages,16wefoundthe(then)radicalideatohavethecompilerreadthesamesignalaswehumanbeings,andlettheindentingcontrolgrouping,asuggestionwefollowedwithenthusiasm。IndentationtoindicatethatasuiteofcommandsbelongtogethersubsequentlybecamemandatoryinB0programs,adesignchoicethathasbeenmaintainedthroughoutalliterations。17 节选自《TheOriginsofPython》 简单概括:当时在设计新的编程语言时,他们受到了一篇文章的强烈影响,决定仅采用缩进语法来控制代码块的分组。核心思想是havethecompilerreadthesamesignalaswehumanbeings,为了代码简洁性及理解一致性,舍弃了其它的代码分组方案。 我极为推崇Python的强制缩进语法,曾写过一篇《Python为什么使用缩进来划分代码块?》介绍了这种设计的8个原因,但是,该文收到了大量的反对声,因此,我又补写了一篇《Python的缩进是不是反人类的设计?》。 我知道自己的两篇文章不足以说服那些讨厌Python缩进的人,但是,如果有更多资料介绍这项设计的原因及思想来源的话,或许就能稍微地改观某些人的看法,同时也提供给那些喜欢这项设计的人一些信心 作为ABC语言的继承者,Python的缩进语法应该主要来源于它。因此,我决定沿着前文的线索,继续挖掘它们设计缩进语法的起源。 上文提到的文章标题为《编程语言中的信号与噪声》(SignalandNoiseinProgrammingLanguages),发表于1975年的ACM年会论文集,作者P。J。Plauger是全球知名的计算机科学家、CC技术专家以及TheStandardCLibrary、StandardC:AReference和TheStandardTemplateLibrary等图书的作者。 该篇文章想要区分编程语言的哪些语法是对读者有用的信号、哪些仅是无用的噪声。文中提到了一个编程理论:常说的东西应该言简意赅(thingswhichgetsaidalotshouldbeconcise)。 常说的东西应该言简意赅 由于代码经常要分组分块,因此,信号与噪声一文将begin。。。end及do。。。end这两种当时常见的代码分组语法批评为糟糕的设计。它不反对花括号{。。。}的语法设计,但是提出了一种更为激进的设计,也就是仅用缩进来控制代码分组(lettheindentingcontrolgrouping)。 按我的理解,P。J。Plauger建议我们移除编程语言中的噪声。人们在阅读代码时,可以直观地根据代码的缩进层级将它们分组,因此缩进本身就是一种有意义的信号,如果激进地让机器也做到所见即所得的话,那甚至连{。。。}这种足够言简意赅的设计也不需要了。 P。J。Plauger是个擅于总结编程风格原则的人,他曾合作编写过一本《TheElementsofProgrammingStyle》(译本:编程格调),全书介绍了70多条最佳实践和编程规则。 编程格调的豆瓣条目 只不过,相比于他提出的那些经典的编程规则,使用缩进来分组代码块不仅在40多年前是一条激进而少人接受的风格,它直到今天依然令某些人无法认同。 CWI的团队当初在设计ABC语言时,激进地采用了缩进作分组的设计。通过溯源那篇古老的文章,我们知道了这种设计不是他们突然蹦出的,而是有着某种设计思想的指导,同时这也意味着,Python的缩进设计除了有终身仁慈独裁者(BDFL)的个人偏好外,还隐含了这一层思想脉络的渊源。 另外,《TheOriginsofPython》中还提供了两个比《编程语言中的信号与噪声》更早的起源:1965年的ISWIM编程语言(IfyouSeeWhatIMean的首字母缩写)。它可能是有据可考最早使用缩进分组代码块的语言(尽管它没有实现),其设计者在《TheNext700ProgrammingLanguages》中称之为Offsiderule(越位规则)1974年唐纳德克努特(DonaldKnuth,著名计算机科学家、图灵奖获得者,经典巨著《计算机程序设计艺术》的作者)发表在ACM通讯的文章《StructuredProgrammingwithGoToStatements》,他在畅想未来的编程语言时说:Wewillperhapseventuallybewritingonlysmallmoduleswhichareidentifiedbynameastheyareusedtobuildlargerones,sothatdeviceslikeindentation,ratherthandelimiters,mightbecomefeasibleforexpressinglocalstructureinthesourcelanguage。 唐纳德的文章节选 值得注意的是,唐纳德提供的参考材料正是1965年ISWIM之父的文章《TheNext700ProgrammingLanguages》,里面收录了多位大佬对于缩进的讨论观点。 受限于当时的计算机硬件及编辑器工具,以及考虑到印刷对代码排版的现实性影响,纯缩进分组的代码确实可能会带来一些麻烦。因此,这些编程界的先驱们仅仅是在大胆畅想未来的编程语言的语法,当时并没有编程语言作出了实现。 从1965年的ISWIM,到1974年唐纳德的畅想,再到1975年P。J。Plauger激进的想法,再到1980年代ABC及Python的落地实现。20多年的时间,说长确实是挺长了。 如今2022年即将过去,Python已经度过了它的而立之年,受这种设计思想影响的编程语言也遍地开花:据维基百科统计,有近30门语言使用Offsiderule。 采用Offsiderule的编程语言 尽管某些语言(如Scala、Nemerle、Haskell)只是可选性或部分性支持,但这份列表意味着在花括号占据统治地位的时代,缩进的星星之火依然迸发着顽强的生命力。畅想未来,我相信这份列表会加进更多语言,但愿那时可以打破Python一枝独秀的局面。 现在作一下总结吧。本文最先关注的是Python之父年轻时的导师的文章Python的起源,但是我发现最吸引人的还是老生常谈的缩进话题,于是文章主题转向了Python的缩进语法的起源。 不可否认,Python的缩进语法属于是较为大胆的编程风格,但换个角度,你也可以认为它很前卫,因为它本就起源于计算机科学家们在畅想未来的编程语言时的一种创意。 缩进语法简洁、紧凑、清晰,它是营造出Python之美的最大功臣之一。人生苦短,我用Python! 最后,如果你对Python其它语法的起源、为什么这样设计、跟其它语言的区别等等话题感兴趣,欢迎关注Python为什么系列(请在Github上给颗小星星吧,喵)