2002 年 5 月
” 代数符号压缩的含义量,是我们习惯通过它们进行推理的另一个有利条件。” — 查尔斯・巴贝奇,引自艾弗森的图灵奖演讲
在 LL1 邮件列表上讨论《呆子的复仇》引发的问题时,保罗・普雷斯科德写了一些让我印象深刻的话。
Python 的目标是一致性和可读性,而不是简洁性。
乍一看,这似乎是对一种编程语言的一种相当严厉的评价。据我所知,简洁性等于力量。如果是这样的话,那么替换一下,我们得到:
Python 的目标是一致性和可读性,而不是力量。
这似乎不是一个你想要做出的折衷(如果它确实是一个折衷)。这距离说 Python 的目标不是作为一种高效的编程语言来使用,似乎还有一段距离。
简洁性等于力量吗?这对我来说是一个重要的问题,也许是对任何对语言设计感兴趣的人来说最重要的问题,并且直接面对这个问题可能是有用的。我还不确定答案是否简单为肯定,但似乎这是一个很好的假设。
假设
我假设简洁性就是力量,或者说它们非常接近,除了在病态例子中,你可以将它们视为相同的。
在我看来,简洁性是编程语言的目的。计算机同样愿意直接用机器语言告诉它们该怎么做。我认为我们花费精力发展高级语言的主要原因是为了得到杠杆,这样我们就可以用一种高级语言的 10 行代码表达(更重要的是思考)相当于需要 1000 行机器语言来表达的内容。换句话说,高级语言的主要目的是使源代码更小。
如果源代码更小是高级语言的目的,而一种东西的力量取决于它实现其目的的程度,那么编程语言的力量度量标准就是它能使你的程序变得多么小。
相反地,一种不能使你的程序变小的语言做的不好,就像一把刀切不好,或者印刷品不清晰。
度量
不过,在什么意义上更小呢?代码大小的最常见度量是代码行数。但我认为这个度量标准之所以最常见,是因为它最容易测量。我认为没有人真正相信这是程序长度的真正测试。不同的语言对于一行代码应该放多少内容有不同的约定;在 C 语言中,很多行都只有一个或两个定界符。
另一个简单的测试是程序中的字符数,但这也不是很好;一些语言(例如 Perl)只使用比其他语言更短的标识符。…
我认为一个更好的程序大小度量标准应该是元素的数量,…
这种度量标准需要进一步细化,并且可能需要在特定语言的情况下进行解释,但我认为它试图衡量正确的事物,即程序的部分数量。我认为你在这个练习中画的树是你必须在脑海中构想程序所必须做的工作量,因此它的大小与你编写或阅读它所需的工作量成比例。
设计
这种度量标准将允许我们比较不同的语言,但至少对我来说,这不是它的主要价值。简洁性测试的主要价值在于设计语言时作为指南。最有用的语言比较是两种相同语言的潜在变体之间的比较。我可以在语言中做什么来使程序更短?…
如果一个程序的概念负荷与其复杂性成正比,而一个给定的程序员可以容忍固定的概念负荷,那么这就等同于问,我可以做什么来让程序员完成更多工作?…
(顺便说一句,没有什比设计语言更明显地表明 “所有语言都是等价的” 这个老生常谈是错误的。当你设计一种新语言时,你不断比较两种语言 — 如果我这样做了,和如果我没有这样做 — 来决定哪个更好。如果这真的是一个毫无意义的问题,你也许可以一样好地抛硬币。)…
追求简洁性似乎是发现新想法的一个好办法。如果你可以做一些让许多不同程序变短的事情,这可能不是巧合:你可能发现了一个有用的新抽象。你甚至可以编写一个程序来帮助搜索源代码中的重复模式。在其他语言中,那些以简洁性闻名的语言将是寻找新想法的地方:Forth、Joy、Icon。
比较
据我所知,第一个讨论这些问题的人是弗雷德・布鲁克斯在《神话般的程序员月度》中。他写道,程序员似乎每天生成的代码量大致相同,无论使用的语言是什么。…
…(略)…
品尝测试
最终,我认为你必须跟随你的直觉。在这种语言中编程是什么感觉?我认为找到(或设计)最好的语言的方法是变得对语言如何让你思考更敏感,然后选择 / 设计感觉最好。如果某种语言特性很笨拙或限制,不要担心,你会知道的。…
(略)…
限制性
我认为大多数黑客都知道语言感觉受限制是什么意思。当你感到如此时发生了什么?我认为当你感到这种感觉时,街道被封锁,你必须绕远路才能到达你想去的地方。有些东西你想要表达,但是语言不让你。…
(略)…
读性
我开始引用的语录提到了另外两个品质,一致性和可读性。我不确定一致性是什么,或者说一个代码是一致且可读的有什么优势。但我知道可读性是什么意思,…
(略)…