Why-numbering-should-start-at-zero[Translation]
下面翻译一篇Dijkstra关于为什么在编程语言中从0开始计数的文章,原文链接https://www.cs.utexas.edu/users/EWD/transcriptions/EWD08xx/EWD831.html
【译文】
为了不使用令人生厌的…来表示自然数2,3,…,12序列,有以下四种惯例表示法供我们选择:
- a) 2 ≤ i < 13
- b) 1 < i ≤ 12
- c) 2 ≤ i ≤ 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开始:这样一个元素的序号(下标)就和该序列中在本元素之前元素的数量相等(译注:比如数组元素a[2]表示该元素前有两个2元素)。这个故事的寓意就是在经历了数个世纪之后我们最好把0作为一个自然数。
【评注】很遗憾,很多编程语言在设计的时候并没有关注上面这些细节。在FORTRAN中下标总是从1开始;在ALGOL 60和PASCAL中采用了上述的惯例c);最近的SASL又按照FORTRAN的下标惯例进行实现:一个SASL上的序列同时也是正整数上的函数。
以上的讨论是由最近偶然发生的一件事引起的:我在大学的一位数学同事(非计算机科学家)指责一些年轻的计算机科学家过于“狂热”,因为他们总是习惯从0开始计数。他采用最明智的惯例表示法作为挑衅(当然惯例也是很有用的:据我所知一个学生差点在考试中挂了,因为他认为所有的问题在考卷第一页底部就结束了)。我认同Anthony Jay的观点:“在宗教和其他领域中,必须抛弃这个教义,不是因为他错了,而是因为他是对的”。
写在末尾:为了提高个人知识水品,顺便学一下英文,于是自作主张翻译一些感兴趣的外文文章,部分翻译有增删不保证逐字逐句翻译,另外个人英文水品有限,必有谬误,请不吝赐教及斧正!