语言中区分大小写的目的是什么?

18

可能的重复问题:
大小写敏感的编程语言有什么优势吗?
为什么许多编程语言是大小写敏感的?

我一直很好奇,为什么编程语言要设计成大小写敏感的呢?

我这个蠢蛋无法理解它有任何帮助的可能性。

但我相信肯定有原因。在任何人提到一个变量名叫做dogDog区分大小写是非常不好的实践之前,请注意,这样做真的很糟糕,对吧?

欢迎任何评论,并可能提供有关此问题的历史!我对大小写敏感性不敏感,但对大小写敏感性的敏感性敏感,所以让我们保持所有答案和评论都文明礼貌!


1
大小写敏感性使得阅读更加容易...虽然与大小写无关,但是看看缩进;像Python这样的语言之所以成功,是因为它的“缩进”可以在某种程度上起到大小写敏感性的作用。 - anon235370
2
我认为,任何微小的好处都远远被误用、调试等负面因素所抵消。 - Tom Gullen
1
@Tom:假设你有一个名为PIT的类,其中有一个名为TAX的常量...或者如果你有一个名为hEllO的普通变量。 - anon235370
1
@m00st:使程序更易于阅读的因素是您是否输入多个大小写字母。这与语言是否区分大小写无关。 - Larry Lustig
1
@Tom:我同意你的观点(至少是用英语表达时)。在编程中,大小写通常并不决定含义(除非在极其有限的情况下),所以当它们被用来表达不同事物之间的关系时,我认为这是不自然的。那些使用首字母大写和小写版本来表示不同项之间关系的约定只是在寻找错误。这是我的观点。 - Larry Lustig
关闭的重复问题没有原始问题的链接?已重新打开。 - Ian Boyd
8个回答

17

在支持这种写法的编程语言中,拥有仅大小写区分的两个成员并非一定是不好的实践。例如,在C#中,以下代码是相当常见的:

private readonly string name;
public string Name { get { return name; } }

个人而言,我对大小写敏感很满意 - 特别是它允许像上面那样的代码,其中成员变量和属性遵循约定,避免混淆。

请注意,大小写敏感性也涉及文化方面... 不是所有文化都认为同样的字符是等效的...


4
最常被提及的例子是土耳其语中的"I"的变体。英语不区分大小写在这种情况下不敏感,因为在这种情况下"i"并不等于"I"。 - maxwellb
3
+1 Jon,因为我也喜欢使用小写相同名称来支持我的属性。我个人不喜欢在私有字段前使用“_”前缀。 - maxwellb
2
@Miel:哪些代码会让读者感到困惑?任何有能力的C#开发人员都应该知道他们正在阅读的代码约定,这种情况下变量(始终为私有)采用驼峰式命名,属性采用帕斯卡式命名。 - Jon Skeet
1
@Miel,这个有什么难以理解的呢?如果你把私有字段的声明放在离开1000行的地方,可能会很难阅读,但是在这里,你把所有内容都放在一起,没有错过的机会。 - Piotr Rochala
1
@Jon 和 @rochal,我想说的是“不要让人困惑”,这是为了与 Alexander 给出的答案形成对比。嗯,现在我好像把读者搞糊涂了... - Miel
显示剩余4条评论

9

编程语言中大小写敏感的最大原因之一是可读性。意思相同的事物也应该看起来相同。

我在相关讨论中发现了M. Sandin提出的下面有趣的例子

I used to believe case sensitivity was a mistake, until I did this in the case insensitive language PL/SQL (syntax now entierly forgotten):

function IsValidUserLogin(user:string, password :string):bool begin
   result = select * from USERS
            where USER_NAME=user and PASSWORD=password;
   return not is_empty(result);
end

This passed unnoticed for several months on a low-volume production system, and no harm came of it. But it is a nasty bug, sprung from case insensitivity, coding conventions, and the way humans read code. The lesson for me was that: Things that are the same should look the same.

你能立刻看到问题吗?我没有...


4
这是一个不区分大小写的代码,因此 PASSWORD=password 总是为真。 - Blorgbeard
1
我的猜测是?PASSWORD=password 总是评估为真?因此,任何有效的用户名都将登录... 至少如果我是对的 :P - Wayne Werner
2
PASSWORD=password 可能意味着如果表中 PASSWORD 列的值与传入参数相同,则为真。不幸的是,它们都指代参数或列。然而,这个例子是错误的。PASSWORD=password 看起来只是因为我们已经在大小写敏感的语言中编程了二十年或更长时间,并且我们被条件化地认为 PASSWORD 和 password 必须是两个不同的实体。 - JeremyP
2
@JeremyP:你的想法很好,但是为什么不让不同的东西看起来不同,让相同的东西看起来相同呢?毕竟,这就是我们从日常生活中习惯的方式(在那里大小写 可能 彻底改变含义...你喜欢阅读吗?还是你喜欢所在地?) - Dirk Vollmar
1
@JeremyP:如果我们习惯于不使用缩进,也许我们就不需要它了。我认为即使我们有大小写不敏感的情况下,人们也会开始制定约定,出于与缩进约定相同的原因。 - luiscubal
显示剩余3条评论

9

我喜欢大小写敏感以区分类和实例。

Form form = new Form();

如果你不能这样做,你最终会得到名为myFormform1f的变量,它们不如简单的form清晰和描述性。

大小写敏感也意味着您不会有对formFORMForm的引用,它们都表示相同的含义。我发现阅读这样的代码很困难。所有对同一变量的引用看起来完全相同的代码更容易扫描。


1
在使用大小写不敏感的编程语言很长时间后,我发现为类和对象想出不同的名称是一项很好的技能。 - T.E.D.
1
这个问题在例如Visual Basic中并不会出现,因为类型标识符和对象标识符在那里明确分开了(例如Dim form As Form,只有类型可以出现在As之后)。再次强调的是C语法存在缺陷,而不是这个概念本身。 - Philipp
3
取决于情况。有时候最明显、最有用的名字也是最好的选择,但有时并非如此。至少拥有这个选项是好的。 - Jon Skeet
1
“至少有这个选项是很好的”实际上可以很好地概括整个C设计哲学。问题出现在您试图维护别人的代码时。那时,您会发现如果他们没有这个选项,事情通常会更好。 - T.E.D.

4
我一直想知道的是,为什么编程语言要设计成区分大小写的呢?
归根结底,这是因为实现大小写敏感比较更容易正确;你只需比较字节/字符而不进行任何转换。你还可以很容易地执行其他操作,如哈希。
为什么会成为问题呢?好吧,除非你处于支持的字符域的微小领域(特别是US-ASCII),否则添加大小写不敏感性相当困难。不同的语言环境具有不同的大小写转换规则(土耳其规则与世界其他地方的规则不同),并且不能保证翻转单个位将做正确的事情,或者它总是相同的位和在相同的前提下。 (如果我没记错,在某些语言中,将元音字母转换为大写字母时,有一些复杂的规则用于放弃变音符号,并在转换为小写字母时重新引入它们。我忘记了确切的细节。)
如果您是大小写敏感的,则只需忽略所有这些;这就是简单的原因。(请注意,您仍然应该注意UNICODE规范化形式,但那是另一个故事,无论使用哪种大小写规则都适用。)

1
还要庆幸的是,没有人为计算机语言自动进行标题大小写(我实际上也不确定那该怎么做);的规则要复杂得多! - Donal Fellows

3

想象你有一个叫做dog的对象,这个对象有一个叫做Bark()的方法。同时你定义了一个叫做Dog的类,这个类中有一个静态方法Bark()。你写下了dog.Bark()。那么它会调用对象的方法还是类中的静态方法呢?(在一个没有::的语言中)


3
为了避免以后混淆,为什么不给它们取不同的名称呢?比如把一个类叫做“狗”,把一个对象叫做“小狗”,这样会更加清晰明了。如果一个类和一个对象都叫做“狗”,就很容易混淆了。这是我不理解的地方。 - Tom Gullen
2
狗太泛泛了... 从狗中选择像拉布拉多这样的对象会更有意义。 - anon235370
3
现在编译器知道要调用哪个方法,但读者仍会感到困惑。我认为你应该使用比一个字母的大小写区分更好的方法来区分这两种情况。 - Miel
4
我有几个命名规则。私有类成员和局部变量都用小写字符命名。全局的东西,比如类名、公共成员等则用首字母大写的方式命名。这种命名规则让我自然而然地理解我所编写的代码。一旦掌握了这种方式,就非常容易了。 - Alex
3
@Tom: 我更喜欢区分大小写,因为如果与良好的命名规范一起使用,您可以保持代码清晰且标识符名称的选择不会受到不同字符串比较“相等”的限制。如果我有一个名为Dog的类,为什么我必须要把我的实例命名为dogVardog_甚至是(发抖)m_dog?@m00st: 如果Dog是继承体系的根,并且您需要命名指向任何Dog子类实例的指针,您该怎么办? :) - anton.burger
1
亚历山大,这可能是大小写敏感性的最佳/唯一好用途。当然,因语言而异,但这些约定非常不错。 - Wayne Werner

2
我相信最初这是出于性能考虑。将字符串转换为大写或小写以进行无大小写比较并不是一个特别耗费资源的操作,但也不是免费的。在旧系统上可能增加了复杂性,而当时的系统还没有准备好应对。
现在,当然,各种编程语言都希望彼此兼容(例如VB无法区分只有大小写不同的C#类或函数),人们习惯于使用相同的文本命名不同的大小写形式(见Jon Skeet的答案 - 我经常这样做),而且无大小写语言的价值并不足以抵消这两个因素。

2
我同样确信,最初忽略大小写与编程语言的性能无关。相反,这是由于许多1950年代电传打字机使用的5位编码方案根本没有大写和小写字母。在电报中不需要大写或标点符号。STOP - High Performance Mark
1
我认为这与性能理论相悖,因为大小写不敏感的语言如Fortran和Basic是最古老的语言之一。 - Philipp
1
呵,菲利普赢了。我甚至没有想到这一点。 - Sean Edwards
+1 这可能是一些语言存在大小写敏感性的真正原因。20世纪70年代编写C编译器的人不想在编译期间烧掉CPU时间将每个ASCII大写字符转换为小写字符。于是,C就有了大小写敏感性。C催生了C ++。C ++催生了Java。Java催生了C#。今天我们就有了这个问题,没有人愿意重新审视这个问题。 - Ian Boyd

2
你不能理解为什么大小写敏感是个好主意的原因,是因为它并不是。这只是C语言的一种奇怪习惯(就像0-based数组一样),现在看起来很“正常”,因为很多语言都复制了C的做法。
C在标识符中使用大小写敏感,但从语言设计的角度来看,这是一个奇怪的选择。大多数从零开始设计的语言(没有考虑以任何方式“像C”)都是大小写不敏感的。这包括Fortran、Cobol、Lisp和几乎整个Algol语言系列(Pascal、Modula-2、Oberon、Ada等)。
脚本语言则各有千秋。许多脚本语言之所以大小写敏感,是因为Unix文件系统是大小写敏感的,它们必须与其进行合理的交互。C在Unix环境中有机地发展起来,可能从那里吸收了大小写敏感的哲学。

计算机在20世纪70年代比今天要弱很多;但我想知道40年前是否存在过过早优化的情况。 - Ian Boyd
整个C语言可以这样看待。例如,前缀和后缀的增量和减量被奉为运算符,因为C语言最初的(CISC)CPU对于大多数操作都有操作码变体来执行这些操作。 - T.E.D.

1

从一个忽略规范等价性的天真角度来看,大小写敏感的比较是微不足道的(只需比较代码点),但大小写不敏感的比较在所有情况下都没有明确定义,且规则难以记忆。虽然可以实现它,但会意外地导致意想不到和令人惊讶的行为。顺便说一下,一些语言如Fortran和Basic一直是不区分大小写的。


1
我认为大小写敏感的比较更加琐碎。如何“比较代码点”以表示“a”~“A”?在一个字符编码中,可以通过进行简单的二进制比较来进行大小写敏感的比较... - maxwellb
1
我混淆了大小写敏感和大小写不敏感。 - Philipp
我使用过的每个搜索器都可以进行不区分大小写的搜索。许多(例如:Emacs)默认情况下就是这样做的。当你处理非英语语言时,事情会变得有些混乱,但只要编译器和搜索器的规则相同,那么实际上就没有什么问题了。 - T.E.D.
你犯了一个错误,认为所有的代码文件都是用Unicode编写的。几乎每个源代码文件,即使是在微软内部,都是(无意中)使用本地代码页编写的,几乎肯定是“Windows-1252”。 - Ian Boyd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接