为什么在某些编程语言中仍然区分大小写?


44

除了混淆代码之外,我看不出在编程语言中区分大小写有什么用。

为什么要用编程语言来实现呢?

更新:

看来您认识的人对此发表了声明


28
为什么在某些编程语言中仍然不区分大小写?
Thomas Eding

1
一般而言,英语也区分大小写。常见的例子是波兰语和波兰语,这是两个不同的术语,其书面形式仅因大小写而不同,并且具有不同的发音和含义。IMO最好使编程语言在这方面不要太聪明,并让程序员自己提出适当的书面约定。例如,用Person person = new Person()OO语言编写类似的东西很普遍,其中符号“ person”是一个临时对象,“ Person”是一个类类型。
布兰丁

Answers:


113

尽管英语中的大小写折叠相当琐碎,但在其他一些语言中却要少得多。如果德国程序员使用ß变量名,那么您将如何考虑大写字母呢?仅供参考,“ß” 用于小写字母。OTOH,“ ss” 等效的-您是否认为编译器必须匹配它们?进入Unicode时,您会遇到更多有趣的问题,例如带有预组合变音符号的字符与单独组合变音符号的字符。然后,您将学习一些阿拉伯文字,用三种不同的形式包含许多字母,而不仅仅是两个。

在黑暗时代,大多数编程语言几乎都是出于区分大小写的。例如,Pascal开始于Control Data大型机,每个主机仅使用6位(总共64个代码)。大多数此类计算机使用“ CDC Scientific”字符集,其中仅包含大写字符。您可以切换到其他字符集,但是大多数字符集都使用大写或小写字母,但不能同时使用两种字符集,但是两者都使用相同的代码。古代的Baudot代码和在COBOL,FORTRAN,BASIC等初期都被认为是标准的情况也是如此。当功能更强大的硬件广泛可用时,它们对大小写不敏感的根深蒂固,以至于无法更改。

随着时间的流逝,不区分大小写的实际困难变得越来越明显,语言设计人员通常已决定(“实现”可能是一个更准确的术语),当/如果人们真的想要不区分大小写,则最好使用辅助工具来解决。比语言本身。

至少IMO,编译器应完全按照输入的方式进行输入,而不要确定“您编写了此内容,但我将假设您确实具有其他含义”。如果您希望进行翻译,则最好使用内置的工具将它们分开处理。


26
+1会说类似的话,以我的经验,大多数对此抱怨的人都是不考虑其他语言/字符集的人。
Jeremiah Nunn

5
我的大问题也是,如果编译器要开始注意不同的拼写,是否应该允许您随意在其下划线或其他“单词分隔符”?拼写错误的标识符时,它可能会尝试“做什么”吗?它会走多远?(顺便说一句,Ada为了清楚起见,Ada允许在数字内任意下划线。)
dash-tom-bang 2010年

3
@Barry:两者几乎相同-地球上几乎所有其他语言都要求使用ASCII无法提供的字符。就这一点而言,即使我们勉强接受,但即使是英语,它也确实受到限制-例如,它迫使您将“合作”写为“合作”。幸运的是,打字机早在计算机问世之前就已经使人们习惯了这种限制,以至于几乎没有人考虑过使用曾经认为必要的所有字符的可能性。
杰里·科芬

2
@ dash-tom-bang:已经编写了尝试执行类似操作的编译器(正确的拼写和“不”提示)。经验表明,通常最好使编译器更快地运行并产生更好的错误消息。
杰里·科芬

2
@phresnel或“ SZ”。两者都有很好的论据。
Vatine 2012年

114

为什么有人要区分大小写?在什么情况下,能够VARIABLE在一个位置,Variable另一个位置和variable第三个位置引用单个变量很有用?不区分大小写令人不快。我宁愿得到一个编译错误,当我不小心输入VAriable代替Variable,而不是让情况下,错别字一样,滑进我的代码。

总之,许多编程语言都具有区分大小写的功能,不仅出于历史/惯性原因,而且因为区分大小写是一个坏主意。


12
您正在从内而外看它。是的,用多个拼写形式指代同一个变量可能很烦人,但这远不及在同一个作用域中使用两个不同的标识符来指代两个不同的事物,只是在大小写上有所不同。不区分大小写是一件好事,因为它可以防止这种情况。(此外,它避免了简单的错字,也不会成为语法错误;请参阅问题中指向Jeff关于该主题的文章的链接。)
Mason Wheeler,2010年

88
但是我希望简单的拼写错误成为语法错误!我不想在代码中输入简单的错字,而希望编译器帮助我找到它们。不区分大小写使查找它们变得更加困难。不区分大小写似乎是草率编码的借口。
2010年

4
@nohat:我同意,当你比你打算键入的内容类型之外的任何语法错误是一个很好的事情。
Tim Goodman 2010年

13
@Mason惠勒,我已经读了文章,我根本就不一一列举了。我已经使用了许多不区分大小写的语言,并且经常会因拼写错误而感到恼火。
2010年

11
完全同意nohat-不区分大小写是一个荒谬的想法-通常,支持者来自仍然渴望VB / Basic美好时光的人们。
蒂姆(Tim)2010年

27

在Java情况下,不使用敏感度在代码中提供更多选项,而是使用非常清晰和一致的语义。类看起来像这样。objectsLookLikeThis。MethodsLookLikeThis()。STATIC_VARIABLES_LOOK_LIKE_THIS。Classes.WithInnerClassesLookThis。它不能提供更大的自由度:它允许您将一些信息简洁地打包成一种原本过于冗长的语言。

我认为在具有很多编译器和IDE支持的显式静态类型的语言中,区分大小写是一种很好的信息交流方式(例如Java)。对于像Ruby这样的语言,不区分大小写可能甚至会导致更多意外结果,尽管我愿意尝试不区分大小写的Ruby。

我认为严格的系统区分大小写不会混淆代码,但实际上会使代码更清晰。考虑可能的Java代码:

      joe blah = new hUf();

这很清楚,但是关于:

      hUf.WTF();

在Java中,您会自动知道这是什么。在不区分大小写的Java中,它是模棱两可的,因此您需要诉诸其他机制来区分类与实例,方法与包。这种机制可能会让您呕吐:)


2
不!没有更多的了解!!int package_class_method_var_name?!!
Michael K

2
@Michael,奇怪的是似乎没人注意到下划线是一个麻烦的输入方式。
丹·罗森斯塔克2011年

2
这取决于您的键盘。对我来说(使用法语键盘),_易于键入,{}则难得多(使用AltGr可以到达它们)。
PhiLho 2011年

6
嗯,所以区分大小写是新的匈牙利符号。
David Thornley

1
如果编译器强制执行,则只有“ 非常清晰且一致的语义 ”。现在,要求类名以大写字母开头且方法名以小写字母开头的编译器实际上可能是区分大小写的有趣原因。
Ross Patterson

24

我不认为它是“实现”的,而是“允许的”。区分大小写是字符串比较的默认状态。由于您需要添加额外的代码来执行不区分大小写的比较,并保留原始标记名称以进行正确的错误和警告报告,因此使编译器工程师使语言不区分大小写需要花费额外的精力。

这几乎肯定是为什么它以C结尾的原因。他们想制作一种简单的语言,以实现易用性为代价,但要牺牲可用性。至于为什么要用现代语言呢?因为它当然是用C语言编写的,所以它一定是正确的方法!</ sarcasm模式>


3
另外,我认为在60年代和70年代发明编程语言时,空间和速度非常重要。对于大小写不敏感的比较,我们无法提供这些额外的说明和空间。在现代语言中,这更多的是一个“总是做到这一点的方式”问题。没有理由让新语言(例如C#)执行此操作。
杰伊,2010年

1
@Jay:然而,由于任何原因,Pascal早于C并影响了其设计,但不区分大小写,并且编译速度仍然更快。;)
Mason Wheeler 2010年

@梅森:我不认为帕斯卡影响了C ...我必须查一下。基本上,它们全部来自Algol / Fortran!people.mandriva.com/~prigaux/language-study/diagram.png
杰伊

1
@Matt:嗯...你从哪里得到的?我所见过的所有资源都可以将Pascal记为1970年,将C记为1972
。– Mason Wheeler,2010年

16
这些天孩子们。早在我的时代,我们没有小写字母,我们喜欢它。6位就足够了。当然,现在我们都对喊叫充耳不闻。
KeithB

23

如果没有其他问题,它将简化解析过程,并允许您为变量/类名提供更多组合。

使用不区分大小写的解析,您将不得不使用唯一的标识符,因为“ myClass”和“ MyClass”将是同一件事。另外,您必须向解析器添加复杂性,以确保您可以根据上下文确定使用哪个标识符。

考虑这样的情况:

XmlWriter xmlWriter = new XmlWriter();
xmlWriter.Write("blah");

假设XmlWriter类还具有一个称为“ Write”的静态方法。如果没有在这里区分大小写,您是在实例还是在类上调用它?


14
虽然那是不好的命名约定。如果writeWrite是两种完全不同的方法,我会勒死某人。
TheLQ

5
对此,TheLQ表示同意。当我在某些C库中工作时,它使我发疯,并且看到诸如“ HWND hwnd;”之类的声明。任何滥用这种区分大小写的人都应该被带走并开枪。
梅森惠勒2010年

4
@TheLQ方法具有相同的情况。我在类/变量名称中使用了不同的情况作为示例。
亚当李尔

6
@Anne Lear,我认为这是一个不好的例子。使用不区分大小写的语言,您不必担心要调用哪种方法,因为在使用类名作为变量名时已经遇到语法错误。
Matt Olenik

5
@Matt您应该在没有语法高亮显示的情况下进行编码。我没有IDE就可以理解,但是在没有语法高亮显示的情况下在编辑器中编码...为什么有人会自己做呢?
戴维

13

我喜欢区分大小写,如果仅出于其他原因,它会使代码更具自说明性:

this is a CONSTANT
this is a ClassName
this is a methodName
this is a local variablename

我通常使用Python进行编程,但是回到我的C#时代,我发现将类实例的名称与该类的名称相同非常方便,但是使用小写(或驼色)的情况(正如其他人所说的那样):

Thing thing = new Thing();

使用不区分大小写的语言为此需要一些其他约定,即某种类似的符号:

Thing oThing = new Thing()
Thing instanceOfThing = new Thing()

这是一件“坏事”。

我还发现grep(区分大小写)查找对类的引用与对变量的使用非常方便。使用不区分大小写的语言,这将变得不那么容易。搜索和替换相同。

最后,作为一名程序员,当我看到带有不同大小写的单词时,我突然想到它们是不同的东西……我很少遇到变量大小写错误的错误,即使是在动态的脚本语言中,编译器也会提供帮助。


10

人们在实际阅读单词之前先注意它们的形状。区分大小写使符号的形状在整个代码中保持一致。我也同意上述观点,即不同的约定表示不同类型的符号。区分大小写和不区分大小写均可被滥用。错误的程序员总是会生成错误的代码……他们会找到方法。

以语言为例。为什么我们用大写字母开头句子并命名事物呢?也是因为Unix吗?


@JUST评论仅用于寻求澄清,而不用于扩展讨论。如果您有解决方案,请留下答案。如果您的解决方案已经发布,请对其进行投票。如果您想与他人讨论此答案,请使用chat。有关更多信息,请参见FAQ
亚当李尔

9

我认为对于像C#和Java这样的静态类型的语言,它实际上并没有增加任何价值。因为在大多数情况下,您都有一个IDE可以自动为您更正大小写不匹配的IDE,所以最终,如果我偶然输入“ VAriable”,我的IDE会将其自动更正为“对我来说可变”。再加上MyClass myClass;样式约定,您可以看到区分大小写不一定是一件坏事。

对于动态类型的语言,可能会有更多的论点,因为IDE很难猜测自动更正,但是对于动态类型的语言,您已经有太多的担忧了(就错字),使用一致的大小写约定不会增加更多的负担。

所以,是的,尽管没有真正的原因语言可能并非是不区分大小写的,但也没有真正的理由,他们应该是要么。

Scott Hanselman的那篇关于“ SignOn”与“ Signon”的文章是关于字符串比较的,与编程语言无关。我同意用户键入的字符串应始终不区分大小写地进行比较,但是我认为这与编程语言中的标识符不同。


1
+1提及“将自动纠正大小写不匹配的IDE”
DavRob60

3
IDE是w弱的。我用铅笔和纸程序,然后扫描代码英寸
丹Rosenstark

6

当一种语言区分大小写时,我会利用它来重现数学和科学中的常规案例用法。以下是一些案例约定的列表(绝不详尽):

  • 在概率论中,小写字母f通常表示概率密度函数(pdf),而大写字母F表示相应的累积分布函数(cdf)。
  • 同样在概率论中,大写字母表示随机变量X,相应的小写字母表示它们的实现x,如$ Pr [X = x] \ leq 0.05 $。
  • 在线性代数中,大写字母通常用于表示矩阵,而小写字母通常用于表示数字,例如$ A = [a_ {ij}] $。
  • 单位符号以小写字母(例如,米为米)书写,除了升(L)以及从人名得出的那些单位(W代表瓦特,Pa代表帕斯卡,N代表牛顿,等等)。
  • 表示一百万或更多的前缀的符号大写(M表示百万(百万)),小于一百万的则小写(m代表千(千))。

3
有效点,但你违反了几乎每一个常见的编程语言的编码约定在那里,为自己的目的在使用大小写..
肯·布鲁姆

3

我只是认为这是由于Unix和C引起的-但这只是鸡和蛋的问题,只有geezer才能正确回答。

当我被问到它们是否早于鸡蛋时,我使用的理由是“复活节兔子来了”。因为诺亚方舟上有小鸡,所以小鸡排在第一位。因此,因为GCC在Unix上运行,所以Unix排在第一位,因此,因为Unix非常关心大小写,所以C及其所有变体和后代(是的,任何加花括号的东西都关心大小写)。

花括号和大小写敏感性之间也可能存在联系。


Unix比GCC早很多年,但是最初的BCPL编译器比Unix早,并且通常创建“ C语法”。
Ross Patterson

2

除了到目前为止给出的出色答案之外,我还要指出,区分大小写还为您提供了额外的“命名空间”。例如,Perl有一些特殊的块,例如BEGINEND,它们在与正常代码不同的时间运行(在编译时为BEGIN,在正常程序终止后为END),并且将它们作为全大写字母使它们脱颖而出,这意味着小写变体不是保留字。

人们甚至可以走得更远,保留所有大写字母的名称,以供该语言将来使用,并且不会对通常不会在其代码中大喊大叫的普通程序员造成任何伤害。


2

对于技术人员而言,“区分大小写”总是更好地减少歧义。以文件名为例。处理Windows文件名比Unix文件名麻烦得多,因为Windows中的文件名不区分大小写,而Unix中的文件名区分大小写。

回到编程。对于类名,方法名,变量名,大多数语言不强制执行命名样式规则。有时为了简化“反射”,我们可以简单地使用“区分大小写”名称绑定到其他数据源,而无需进行转换,或者处理相同名称但在不同情况下的问题。


废话。它似乎只是减少了歧义,因为您已经期望区分大小写的行为。
Ross Patterson

1

我为这个咆哮感到惊讶。既然没有人希望您m_在C#中使用下划线或字段名,我就一直在使用驼峰式大小写,如果字段名与公共属性名称相同,那么公共属性名称就是Pascal case我认为,支持领域是骆驼案,“就这样吧”-这就是整个编程社区似乎想要的。到目前为止,还没有引起任何问题。


0

特别是一些程序员来自BASIC的早期,变量名只能是2个字符长。

因此,当可以包含任意数量的字符时,他们会感到非常高兴。以及区分大小写的原因-因为他们也不想因为这样的事情SomeName而意外地等于SOMENAME并导致错误。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.