Home 《为什么编号应该从0开始》
Post
Cancel

《为什么编号应该从0开始》

这篇文章初稿写于1982年,作者是计算机科学奠基人之一、编程界先驱的传奇级人物——艾兹格·W. 迪杰斯特拉(Edsger W. Dijkstra)。四十年前的文章,在计算机科学领域,算是考古文献了。有天查资料看到,觉得挺有意思,这么一个细节还有人专门写文章讨论,所以随手翻译了了一下放到博客。文章不长,也很好懂,翻译本身并不麻烦,翻译出来一来是雕琢一下自己的语言能力,另外也算是阅读笔记,迫使自己更细致地跟着作者的思路推导一遍

img

原文: Why numbering should start at zero

为什么编号应该从零开始


表示自然数子序列 2, 3, …, 12 而不用有坏处的这三个点号,我们有4个方式可选:

a) $2 ≤ i < 13$
b) $1 < i \leq 12$
c) $2 \leq i \leq 12$
d) $1 < i < 13$

是否有理由相对某种方式更倾向另一种? 是的,有。 可以看出,方式 a) 和 b) 的优点是上下界的差等于子序列的长度。还可以得出,在这两个表示方式中,两个子序列相邻都意味着其中一个的上限等于另一个的下限。 这些结果在两个方式中都是有效的,所以并不能让我们在 a) 和 b) 之间做出选择。 让我们从头再来。

有最小的自然数。 不包含下界的值——如 b) 和 d) 中——使得对于从最小自然数开始的序列,不得不使用非自然数作为表示下界的值。 这不好看,所以考虑下界的表示,我们更倾向于≤,如 a) 和 c)。 现在考虑从最小自然数开始的子序列:当该序列缩为空时,包含上界将迫使上界变成非自然数。 这不好看,所以对于上界,我们更喜欢 a) 和 d) 中的 <。 我们得出结论,方式 a) 是首选。

备注 Xerox PARC 开发的编程语言 Mesa 对所有四种整数区间表示方式都有特殊的表示法。大量的Mesa 的使用经验显示,使用其他三个约定一直是笨拙和错误的源头,基于这些经验,Mesa 程序员现在强烈建议不要使用后三种方式。我提到这个实践证据——不管它能说明多少——是因为有些人对未经实践证实的结论感到不舒服。


当处理长度为 N 的序列时,我们希望通过下标来区分其元素,那么又一个令人烦恼的问题是,对于起始元素用什么下标值。 依照 a) 方式来,当从下标 1 开始时,下标范围是 1 ≤ i < N+1; 而从 0 开始则得到更好的范围 0 ≤ i < N。因此让我们从零开始我们的序数:元素的序数(下标)等于序列中它前面的元素个数。 这个故事的寓意是,我们最好——在经历了这么多世纪之后!——将0视为最自然的数字。

备注 许多编程语言在设计中都没有合适地注意到这个细节。 在 FORTRAN 中,下标总是从 1 开始; 在 ALGOL 60 和 PASCAL 中,方式 c) 被采用; 最近的 SASL 又回到了 FORTRAN 方式:SASL 中的序列同时也是一个正整数上的函数。 遗憾!


上面这些讨论由最近的一件事引发的,当时我在大学的一位数学家同事——不是计算科学家——在一次情绪爆发中指责许多年轻的计算科学家“迂腐”,因为——照他们一贯的习惯——他们从零开始编号。他把有意识地采用最明智的方式当作一种挑衅。 (另外,”End of …“【译者注:此处代表在文档结束出写上“结束”】 习惯被认为是挑衅;但这个约定是有用的:我知道有一个学生在考试中差点不及格,因为他默认考卷在第一页的底部结束。 )我认为Antony Jay是对的,他说:

“在企业宗教中和在其他宗教中一样,异端必须被驱逐,不是因为他有可能是错的,而是因为他有可能是对的。”

This post is licensed under CC BY 4.0 by the author.

容易被忽略误解的Python细节列表

gunicorn 文档学习笔记与配置实践