it-swarm.cn

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

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

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

更新:

看起来像 您认识的人对此发表过声明

44
DavRob60

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

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

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

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

114
Jerry Coffin

为什么有人要区分大小写?在哪种情况下,能够在一个位置中将单个变量称为VARIABLE,在另一个位置将Variable引用,将variable引用为第三变量有用吗?不区分大小写的情况令人恼火。当我不小心键入VAriable而不是Variable而不是让类似的case-typos进入我的代码时,我宁愿遇到编译器错误。

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

116
nohat

在Java)中,不使用区分大小写来提供代码中的更多选项,而是提供非常清晰和一致的语义。无法提供更大的自由度:它使您可以将一些信息简洁地打包成一种本来过于冗长的语言。

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

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

      joe blah = new hUf();

这很清楚,但是关于:

      hUf.WTF();

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

27
Dan Rosenstark

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

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

24
Mason Wheeler

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

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

考虑这样的情况:

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

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

23
Adam Lear

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

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(区分大小写)查找对类的引用与对变量的使用非常方便。对于不区分大小写的语言,这将不太容易。搜索和替换相同。

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

13
Hollister

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

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

10
Tjaart

我认为对于C#和Java之类的静态类型的语言,它实际上并没有增加任何价值。因为在大多数情况下,您都会有一个IDE),它将为您自动更正大小写不匹配的情况,因此,归根结底,如果我无意中输入了“ VAriable”,我的IDE会自动将其更正为“ Variable”。此外,MyClass myClass;样式约定,您可以看到区分大小写不一定是一件坏事。

对于动态类型的语言,可能会有更多的参数,因为IDE)很难猜测自动更正,但是对于动态类型的语言,您已经知道了(在拼写方面)更多的担心是使用一致的大小写约定不会增加更多的负担。

所以是的,虽然没有任何理由使语言not不区分大小写,但也没有任何真正的理由使它们should都是。

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

9
Dean Harding

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

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

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

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

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

3
Peter Turner

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

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

2
linquize

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

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

2
moritz

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

1
Scott Whitlock

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

因此,当可以包含任意数量的字符时,他们会感到非常高兴。以及区分大小写的原因-因为他们也不想关心SomeName偶然地等于SOMENAME并由于诸如此类的原因而导致错误。

0
Michael W