Python 缩进语法的起源:上世纪 60-70 年代的大胆创意!

简介: Python 缩进语法的起源:上世纪 60-70 年代的大胆创意!

上个月,Python 之父 Guido van Rossum 在推特上转发了一篇文章《The Origins of Python》,引起了我的强烈兴趣。

image.png

众所周知,Guido 在 1989 年圣诞节期间开始创造 Python,当时他就职于荷兰数学和计算机科学研究学会(简称 CWI),曾参与设计与实现了一门用于教学的 ABC 语言。这段工作经历以及 ABC 语言的某些设计思想对 Python 有着重要的影响。

文章标题是“Python 的起源”,文章作者 Lambert Meertens 是 Guido 在 CWI 时的导师,以同事亲历者的视角,讲述 Python 从无到有的起源过程。这样的文章我还未曾读过,因此饶有兴趣。

文章内容跟 Python 直接相关的部分并不多,作者花了较大篇幅介绍 ABC 项目的演变,讨论了编程语言的设计(特别强调的是简洁性 Simplicity)。

最引起我兴趣的内容是:缩进语法的设计!

More striking is the use of indentation. Although it was common in programs written in ALGOL 60 or its descendants, such as Pascal, to use indentation as a typographical layout feature for clarifying the grouping of commands, this was an entirely optional presentation choice, made purely for the benefit of the human reader. In an article by P. J. Plauger entitled “Signal and Noise in Programming Languages,”16 we found the (then) radical idea to “have the compiler read the same signal as we human beings, and let the indenting control grouping,” a suggestion we followed with enthusiasm. Indentation to indicate that a suite of commands belong together subsequently became mandatory in B0 programs, a design choice that has been maintained throughout all iterations.17

——节选自《The Origins of Python》

简单概括:当时在设计新的编程语言时,他们受到了一篇文章的强烈影响,决定仅采用缩进语法来控制代码块的分组。核心思想是“have the compiler read the same signal as we human beings”,为了代码简洁性及理解一致性,舍弃了其它的代码分组方案。

我极为推崇 Python 的强制缩进语法,曾写过一篇《Python为什么使用缩进来划分代码块?》介绍了这种设计的 8 个原因,但是,该文收到了大量的反对声,因此,我又补写了一篇《Python 的缩进是不是反人类的设计?》。

我知道自己的两篇文章不足以说服那些讨厌 Python 缩进的人,但是,如果有更多资料介绍这项设计的原因及思想来源的话,或许就能稍微地改观某些人的看法,同时也提供给那些喜欢这项设计的人一些信心~

作为 ABC 语言的继承者,Python 的缩进语法应该主要来源于它。因此,我决定沿着前文的线索,继续挖掘它们设计缩进语法的起源。

上文提到的文章标题为《编程语言中的信号与噪声》(Signal and Noise in Programming Languages),发表于 1975 年的 ACM 年会论文集,作者 P.J. Plauger 是全球知名的计算机科学家、C/ C++技术专家以及 The Standard C Library、Standard C : A Reference 和 The Standard Template Library 等图书的作者。

该篇文章想要区分编程语言的哪些语法是对读者有用的信号、哪些仅是无用的噪声。文中提到了一个编程理论:“常说的东西应该言简意赅(things which get said a lot should be concise)”。

image.png

由于代码经常要分组分块,因此,“信号与噪声”一文将begin...enddo...end 这两种当时常见的代码分组语法批评为糟糕的设计。它不反对花括号“{...}”的语法设计,但是提出了一种更为激进的设计,也就是仅用缩进来控制代码分组(let the indenting control grouping)。

按我的理解,P.J. Plauger 建议我们移除编程语言中的噪声。人们在阅读代码时,可以直观地根据代码的缩进层级将它们分组,因此缩进本身就是一种有意义的信号,如果激进地让机器也做到“所见即所得”的话,那甚至连“{...}”这种足够言简意赅的设计也不需要了。

P.J. Plauger 是个擅于总结编程风格/原则的人,他曾合作编写过一本《The Elements of Programming Style》(译本:编程格调),全书介绍了 70 多条最佳实践和编程规则。

image.png

只不过,相比于他提出的那些经典的编程规则,“使用缩进来分组代码块”不仅在 40 多年前是一条激进而少人接受的风格,它直到今天依然令某些人无法认同。

CWI 的团队当初在设计 ABC 语言时,激进地采用了缩进作分组的设计。通过溯源那篇“古老的”文章,我们知道了这种设计不是他们突然蹦出的,而是有着某种设计思想的指导,同时这也意味着,Python 的缩进设计除了有“终身仁慈独裁者(BDFL)”的个人偏好外,还隐含了这一层思想脉络的渊源。

另外,《The Origins of Python》中还提供了两个比《编程语言中的信号与噪声》更早的起源:

  • 1965 年的 ISWIM 编程语言(“If you See What I Mean”的首字母缩写)。它可能是有据可考最早使用缩进分组代码块的语言(尽管它没有实现),其设计者在《The Next 700 Programming Languages》中称之为“Off-side rule”(越位规则)
  • 1974 年唐纳德·克努特(Donald Knuth,著名计算机科学家、图灵奖获得者,经典巨著《计算机程序设计艺术》的作者)发表在 ACM 通讯的文章《 Structured Programming with Go To Statements》,他在畅想未来的编程语言时说:We will perhaps eventually be writing only small modules which are identified by name as they are used to build larger ones, so that devices like indentation, rather than delimiters, might become feasible for expressing local structure in the source language。

image.png

值得注意的是,唐纳德提供的参考材料正是 1965 年 ISWIM 之父的文章《The Next 700 Programming Languages》,里面收录了多位大佬对于缩进的讨论观点。

受限于当时的计算机硬件及编辑器工具,以及考虑到印刷对代码排版的现实性影响,纯缩进分组的代码确实可能会带来一些麻烦。因此,这些编程界的先驱们仅仅是在大胆畅想未来的编程语言的语法,当时并没有编程语言作出了实现。

从 1965 年的 ISWIM,到 1974 年唐纳德的畅想,再到 1975 年 P.J. Plauger 激进的想法,再到 1980 年代 ABC 及 Python 的落地实现。20 多年的时间,说长确实是挺长了。

如今 2022 年即将过去,Python 已经度过了它的“而立之年”, 受这种设计思想影响的编程语言也遍地开花:据维基百科统计,有近 30 门语言使用“Off-side rule”。

image.png

尽管某些语言(如 Scala、Nemerle、Haskell)只是可选性或部分性支持,但这份列表意味着在花括号占据统治地位的时代,缩进的星星之火依然迸发着顽强的生命力。畅想未来,我相信这份列表会加进更多语言,但愿那时可以打破 Python 一枝独秀的局面。

现在作一下总结吧。本文最先关注的是 Python 之父年轻时的导师的文章“Python 的起源”,但是我发现最吸引人的还是老生常谈的缩进话题,于是文章主题转向了“Python 的缩进语法的起源”。

不可否认,Python 的缩进语法属于是较为大胆的编程风格,但换个角度,你也可以认为它很前卫,因为它本就起源于计算机科学家们在畅想未来的编程语言时的一种创意。

缩进语法简洁、紧凑、清晰,它是营造出 Python 之美的最大功臣之一。人生苦短,我用 Python!

最后,如果你对 Python 其它语法的起源、为什么这样设计、跟其它语言的区别等等话题感兴趣,欢迎关注“Python 为什么”系列(请在 Github 上给颗小星星吧,喵~)

目录
相关文章
|
3月前
|
人工智能 Ubuntu IDE
【Python】基础:环境配置与基础语法
本文介绍了Python编程语言及其环境配置方法。Python由Guido van Rossum于1991年创建,以其简洁、易学和强大的功能著称。文章详细讲解了Python的主要特点、Windows和Ubuntu下的安装配置步骤、基础语法、控制流、函数、文件操作、模块使用及面向对象编程等内容,帮助读者快速入门Python编程。
87 4
|
2月前
|
IDE 数据挖掘 开发工具
Python作为一种广受欢迎的高级编程语言,以其简洁的语法和强大的功能吸引了众多初学者和专业开发者
Python作为一种广受欢迎的高级编程语言,以其简洁的语法和强大的功能吸引了众多初学者和专业开发者
40 7
|
5月前
|
XML 前端开发 数据格式
三分钟搞定 Python XPath 语法
XPath(XML Path Language)是一种用于在 XML 文档中查找信息的语言。它基于树状结构的 XML 文档,可以通过路径表达式来选取节点或节点集。也常常用来解析 HTML。 如果你是一个前端,对用路径获取元素可能陌生又熟悉。陌生是很多的路径,熟悉的路径上又有熟悉的属性和方法。下面我们就来探究一下 XPath 的魅力。
|
2月前
|
存储 索引 Python
Python 的基本语法
这些是 Python 的基本语法要素,掌握它们是学习和使用 Python 的基础。通过不断地实践和应用,你将能够更深入地理解和熟练运用这些语法知识,从而编写出高效、简洁的 Python 代码
77 5
|
2月前
|
存储 Python
Python编程入门:理解基础语法与编写简单程序
本文旨在为初学者提供一个关于如何开始使用Python编程语言的指南。我们将从安装Python环境开始,逐步介绍变量、数据类型、控制结构、函数和模块等基本概念。通过实例演示和练习,读者将学会如何编写简单的Python程序,并了解如何解决常见的编程问题。文章最后将提供一些资源,以供进一步学习和实践。
43 1
|
2月前
|
开发工具 Python
[oeasy]python043_自己制作的ascii码表_循环语句_条件语句_缩进_indent
本文介绍了如何使用Python制作ASCII码表,回顾了上一次课程中`print`函数的`end`参数,并通过循环和条件语句实现每8个字符换行的功能。通过调整代码中的缩进,实现了正确的输出格式。最后展示了制作完成的ASCII码表,并预告了下一次课程的内容。
29 2
|
2月前
|
机器学习/深度学习 数据挖掘 开发者
Python编程入门:理解基础语法与编写第一个程序
【10月更文挑战第37天】本文旨在为初学者提供Python编程的初步了解,通过简明的语言和直观的例子,引导读者掌握Python的基础语法,并完成一个简单的程序。我们将从变量、数据类型到控制结构,逐步展开讲解,确保即使是编程新手也能轻松跟上。文章末尾附有完整代码示例,供读者参考和实践。
|
2月前
|
存储 Python Perl
python正则语法
本文介绍了正则表达式的基础知识及其在 Python 中的应用。首先解释了为什么要使用正则表达式,通过一个判断手机号的示例展示了正则表达式的简洁性。接着详细介绍了 `re` 模块的常用方法,如 `match()`、`search()`、`findall()`、`finditer()` 等,并讲解了正则表达式的基本语法,包括匹配单个字符、数字、锚字符和限定符等。最后,文章还探讨了正则表达式的高级特性,如分组、编译和贪婪与非贪婪模式。
25 2
|
3月前
|
存储 程序员 开发者
Python编程入门:从零开始掌握基础语法
【10月更文挑战第21天】本文将带你走进Python的世界,通过浅显易懂的语言和实例,让你快速了解并掌握Python的基础语法。无论你是编程新手还是想学习一门新的编程语言,这篇文章都将是你的不二之选。我们将一起探索变量、数据类型、运算符、控制结构、函数等基本概念,并通过实际代码示例加深理解。准备好了吗?让我们开始吧!
|
2月前
|
人工智能 开发工具 Python
[oeasy]python040_缩进几个字符好_输出所有键盘字符_循环遍历_indent
本文探讨了Python代码中的缩进问题。通过研究`range`函数和`for`循环,发现缩进对于代码块的执行至关重要。如果缩进不正确,程序会抛出`IndentationError`。文章还介绍了Python的PEP8规范,推荐使用4个空格进行缩进,并通过示例展示了如何使用Tab键实现标准缩进。最后,通过修改代码,输出了从0到122的字符及其对应的ASCII码值,但未能找到竖线符号(`|`)。文章在总结中提到,下次将继续探讨竖线符号的位置。
23 0