【问题标题】:What is the purpose of case sensitivity in languages? [duplicate]语言中区分大小写的目的是什么? [复制]
【发布时间】:2011-03-10 15:02:21
【问题描述】:

可能的重复:
Is there any advantage of being a case-sensitive programming language?
Why are many languages case sensitive?

我一直想知道,为什么语言设计为区分大小写?

我的豌豆大脑无法理解它有用的任何可能原因。

但我敢肯定那里有一个。在任何人说之前,有一个名为 dogDog 的变量区分大小写是非常糟糕的做法,对吧?

感谢任何 cmets,也许还有关于此事的任何历史!我一般对区分大小写不敏感,但对区分大小写的敏感性很敏感,所以让我们保持所有答案和 cmets 文明!

【问题讨论】:

  • 区分大小写让一切更容易阅读……虽然与大小写无关,但看缩进;像 Python 这样的语言之所以成功,是因为“缩进”在某种程度上可以区分大小写。
  • 我认为它的任何微观好处都远远超过了误用、调试等带来的负面影响。
  • @Tom:假设你有一个名为 PIT 的类,并且你有一个名为 TAX 的常量......或者如果你有一个名为 hEllO 的常规变量。
  • @m00st:让程序更容易阅读的原因在于您是否输入了多格。这与语言是否区分大小写无关。
  • @Tom:我同意你的看法。 (无论如何,在英语中)大小写不能确定含义(除非在非常非常有限的情况下),我认为它在编程中是不自然的。那些使用首字母大写和小写版本来表达不同项目之间关系的约定只是在寻找错误。在我看来。

标签: programming-languages language-features language-design case-sensitive case-insensitive


【解决方案1】:

假设您有一个名为dog 的对象,它有一个名为Bark() 的方法。您还定义了一个名为 Dog 的类,它有一个名为 Bark() 的静态方法。你写dog.Bark()。那么它要做什么呢?调用对象的方法还是类中的静态方法? (使用不存在:: 的语言)

【讨论】:

  • 为什么不叫它们不同的东西,这样你就不会在后面搞混了?拥有一个名为 Dog 的类和一个名为 dog 的对象会让人感到困惑。这是我不明白的。
  • Dog 太笼统了......像拉布拉多这样的 Dog 对象会更有意义。
  • 所以现在编译器知道调用什么方法了,但是读者还是会一头雾水。我认为您应该使用比 1 个字母大写更好的方法来区分两者。
  • 我有一些命名约定。私有类成员和局部变量总是以小写字符命名。类名、公共成员等全局内容是大写的首字母。这种命名约定让我自然而然地理解我在写什么。一旦掌握了窍门,就很容易了。
  • @Tom:我更喜欢区分大小写,因为加上一套好的命名约定,您可以保持直截了当并且您对标识符名称的选择不会受到不同的人为限制比较“相等”的字符串。如果我有一个名为Dog 的类,为什么我必须诉诸于调用我的实例,例如dogVardog_ 甚至(颤抖)m_dog? @m00st:如果Dog 是继承层次结构的根,您需要命名一个可能指向任何狗子类的实例的Dog 指针怎么办? :)
【解决方案2】:

在支持它的语言中拥有两个仅按大小写区分的成员不一定是坏习惯。例如,这里有一段相当常见的 C#:

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

我个人对区分大小写感到非常满意 - 特别是因为它允许像上面这样的代码,其中成员变量和属性无论如何都遵循约定,避免混淆。

请注意,区分大小写也有文化方面的问题...并非所有文化都认为相同的字符是等价的...

【讨论】:

  • 最常见的例子是“I”的土耳其变体。英文不区分大小写对此不敏感,因为在这种情况下为“i”=/="I"。
  • +1 Jon,因为我也用小写的同名来支持我的属性。我个人不喜欢在私有字段中使用“_”前缀。
  • 另请注意,在这种情况下,虽然不同的成员只是按大小写来区分,但这段代码会让读者感到困惑。
  • @Miel:哪个代码会让读者感到困惑?任何称职的 C# 开发人员都应该了解他们正在阅读的代码的约定——在这种情况下,变量(总是私有的)是骆驼大小写的,而属性是帕斯卡大小写的。
  • @Miel,怎么弄的?如果您将私有字段声明放在 1000 行之外,可能会很难阅读,但在这里您已经将所有内容放在一起,没有办法错过它。
【解决方案3】:

区分大小写的比较(从忽略规范等价的幼稚的角度来看)是微不足道的(只是比较代码点),但不区分大小写的比较在所有情况下都没有得到很好的定义并且极其复杂,而且规则不可能记住。实施它是可能的,但会无意中导致意想不到的和令人惊讶的行为。顺便说一句,Fortran 和 Basic 等某些语言一直不区分大小写。

【讨论】:

  • 我认为“区分大小写”的比较会更简单。一个“比较代码点”如何说“a”~“A”?在一种字符编码中,可以通过简单的二进制比较来区分大小写...
  • 我把区分大小写和不区分大小写混淆了。
  • 我用过的每个搜索器都可以进行不区分大小写的搜索。许多(例如:Emacs')默认情况下会这样做。是的,当您处理非英语语言时,事情会变得很混乱,但只要您的编译器和搜索器的规则相同,就没有真正的问题。
  • 您犯了一个错误,即任何代码文件都是用 Unicode 编写的。几乎每个源代码文件,甚至是 Microsoft 内部的源代码文件,都(不是有意地)写在本地代码页中,几乎可以肯定是“Windows-1252”。
【解决方案4】:

我确定最初是出于性能考虑。将字符串转换为大写或小写以进行无大小写比较并不是一项昂贵的操作,但它也不是免费的,而且在旧系统上,它可能增加了当时系统尚未准备好处理的复杂性。

现在,当然,语言喜欢相互兼容(例如,VB 无法区分仅大小写不同的 C# 类或函数),人们习惯于用相同的文本命名事物,但大小写不同(请参阅 Jon Skeet 的回答 - 我经常这样做),而无大小写语言的价值并不足以超过这两者。

【讨论】:

  • 我同样确信,最初它与性能无关,这种情况在编程语言中被忽略了。相反,它归结为(许多)1950 年代电传打印机上使用的 5 位编码方案,它们根本没有大写和小写字母。您不需要在电报中使用大写或标点符号
  • 我认为 Fortran 和 Basic 等不区分大小写的语言是所有语言中最古老的语言,这与性能理论相悖。
  • 嘿,菲利普赢了。没想到。
  • +1 这可能是某些语言存在区分大小写的真正原因。在 1970 年代编写 C 编译器的人不想在将每个 ASCII 大写字符转换为小写的编译过程中消耗 CPU 时间。 Presto,C 区分大小写。 C 产生了 C++。 C++ 诞生了 Java。 Java 诞生了 C#。今天就到这里了,没有人愿意重新讨论这个问题
【解决方案5】:

编程语言区分大小写的最大原因之一是可读性。意思相同的东西看起来也应该一样。

我在相关讨论中发现了 M. Sandin 的以下 interesting example

我曾经 相信区分大小写是 错误,直到我在案例中这样做 不敏感的语言 PL/SQL(语法 现在完全忘记了):

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

这有好几次都没有引起注意 几个月的小批量生产 系统,并没有受到任何伤害。但它 是一个讨厌的错误,从案例中冒出来 不敏感,编码约定,和 人类阅读代码的方式。课程 对我来说是这样的: 同样应该看起来一样。

你能立即看到问题吗?我不能...

【讨论】:

  • 这是不区分大小写的代码,所以PASSWORD=password 始终为真。
  • @Tom Gullen:在链接线程中解释了further down
  • 我猜? PASSWORD=password 总是计算为真?因此,任何有效的用户名都将登录......至少如果我是对的:P
  • 如果表的 PASSWORD 列中的值与传入的参数相同,则 PASSWORD=password 可能为 true。不幸的是,它们都引用参数或列。然而,这个例子是错误的。 PASSWORD=password 对我们来说只是看起来不错,因为我们已经使用区分大小写的语言进行了 20 年或更长时间的编程,并且我们习惯于相信 PASSWORD 和密码必须是两个不同的实体。
  • @JeremyP:关于我们习惯的观点很好,但话又说回来:为什么不强迫不同的事物看起来不同而相同的事物看起来一样呢?毕竟,这是我们从日常生活中习惯的(其中套管可能完全改变含义......你喜欢阅读吗?还是你喜欢阅读?)
【解决方案6】:

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

Form form = new Form();

如果你不能这样做,你最终会得到名为 myFormform1f 的变量,它们不像普通的旧 form 那样简洁和描述性强。

区分大小写也意味着您没有提及formFORMForm,它们的含义相同。我发现很难阅读这样的代码。我发现扫描对同一变量的所有引用看起来完全相同的代码要容易得多。

【讨论】:

  • 在不区分大小写的语言方面做了很多工作,我发现为类和对象想出不同的名称是一项很好的技能。
  • 这个问题不会出现在例如Visual Basic,因为类型标识符和对象标识符在那里明显分开(Dim form As Form 等,只有类型可能出现在As 之后)。同样,有缺陷的是 C 语法,而不是一般的想法。
  • @T.E.D.这取决于。有时它是最明显和最有用的名称 - 有时不是。至少有这样的选择真是太好了。
  • “至少有这个选项很好”实际上是对整个 C 设计理念的一个很好的总结。当你试图维护别人的代码时,问题就来了。然后你会发现,如果他们没有有这个选项,通常会好很多。
【解决方案7】:

您无法理解为什么区分大小写是一个好主意的原因是因为它不是。它只是现在看起来“正常”的 C 的奇怪怪癖之一(例如基于 0 的数组),因为很多语言都复制了 C 所做的事情。

C 在标识符中使用区分大小写的功能,但从语言设计的角度来看,这是一个奇怪的选择。大多数从头开始设计的语言(不考虑以任何方式“像 C”一样)不区分大小写。这包括 Fortran、Cobol、Lisp,以及几乎整个 Algol 语言家族(Pascal、Modula-2、Oberon、Ada 等)

脚本语言好坏参半。许多都是区分大小写的,因为 Unix 文件系统是区分大小写的,并且他们必须与它进行明智的交互。 C 有点像在 Unix 环境中有机地成长起来,并且可能从那里汲取了区分大小写的理念。

【讨论】:

  • i 计算机在 1970 年代的功能远不如今天。但我想知道这可能不是 40 年前过早优化的情况。
  • 可以这样看待整个 C 语言。例如,前后递增和递减被奉为运算符,因为 C 的原始 (CISC) CPU 具有用于大多数操作的操作码变体。
【解决方案8】:

我一直想知道,为什么语言设计为区分大小写?

归根结底,这是因为正确实现区分大小写的比较更容易;您只需比较字节/字符而不进行任何转换。您还可以非常轻松地执行其他操作,例如散列。

为什么这是一个问题?嗯,不区分大小写是相当困难的,除非你在一个支持字符的小域中(特别是 US-ASCII)。大小写转换规则因地区而异(土耳其语规则与世界其他地方的规则不同)并且不能保证翻转单个位会做正确的事情,或者它始终是相同的位并且在相同的情况下先决条件。 (IIRC,在某些语言中有一些非常复杂的规则,用于在将元音转换为大写时丢弃变音符号,并在转换为小写时重新引入它们。我忘记了具体是什么。)

如果您区分大小写,则忽略所有这些;它更简单。 (请注意,您仍然应该注意 UNICODE 规范化表格,但这是另一回事,它适用于您使用的任何案例规则。)

【讨论】:

  • 也很高兴没有人为计算机语言进行自动标题大小写(实际上我不确定这将如何工作); that 的规则要复杂得多!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-16
  • 2017-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多