【问题标题】:Does case sensitivity have anything to do with strongly typed languages (or loosely typed languages)?区分大小写是否与强类型语言(或松散类型语言)有关?
【发布时间】:2010-12-15 01:24:53
【问题描述】:

(我承认这可能是一个 n00b 问题 - 我对 CS 理论知之甚少,主要是动手/爱好。)

我在谷歌上搜索官方定义的强类型语言,我发现的最重要的链接之一来自Yahoo Answers,这表明区分大小写是语言是否松散/强类型的一部分。

我一直认为强类型/弱类型语言之间区别的简单答案是,前者需要显式类型声明,而后者更开放,甚至是“动态”。

到目前为止,我发现的两个 S/O 线程(herehere)似乎暗示了这一点(或多或少),但它们没有提及区分大小写的任何内容。区分大小写和强/弱之间是否存在关系?

【问题讨论】:

  • 您的来源是个糟糕的笑话,就像: 问:您知道为什么有些计算机科学家在键入程序时会如此用力地敲击键盘吗? A. 他们更喜欢强类型语言!
  • 哇,这是 7 年前我主要是 php/javascript 人的一个非常老的问题

标签: programming-languages theory case-sensitive strong-typing


【解决方案1】:

一些澄清:

  1. 区分大小写与强类型与弱类型、静态与动态类型或类型系统的任何其他属性无关。我不知道为什么 yahoo answers 上的答案得到了它的一票,但这是完全错误的。忽略它。

  2. 强类型不是一个定义明确的术语,但它通常用于指代几乎没有隐式类型转换的语言,即对不支持该操作的类型执行操作是错误的语言。

    例如,将字符串 "foo""bar" 相乘在 perl 中会得到 0,而在 ruby​​、python、java、haskell、ml 和许多其他语言中会导致类型错误。因此,这些语言的类型比 perl 更强。

    强类型有时也用作静态类型的同义词。

  3. 静态类型语言是一种在编译时(或无论如何在运行之前)就知道变量、函数和表达式类型的语言 - 静态类型语言本身不需要编译,尽管在实践中通常是)。这意味着如果静态类型的程序包含类型错误,它将不会运行。如果动态类型的程序包含类型错误,它将运行到错误发生的位置,然后崩溃。

一种语言是否需要类型注释(在某种程度上)独立于它的类型系统是强还是弱、静态还是动态。从理论上讲,动态类型语言可能需要(或至少允许)类型注释,然后在这些注释被破坏时抛出运行时错误(尽管我不知道任何动态类型实际上会这样做)。

更重要的是,有许多静态和强类型语言(例如 Haskell、ML)不需要类型注释,而是使用类型推断算法来推断类型。

【讨论】:

    【解决方案2】:

    理论上,区分大小写与类型严格性完全无关。区分大小写是关于 标识符 fooFOOfOo 是否指代相同的变量、函数或你拥有的东西。类型严格性是关于 变量 是否有类型或只有 有,类型之间转换的难易程度等等。

    实际上,区分大小写和类型严格性之间可能存在相关性,但我现在想不出足够多的不区分大小写的语言来进行评估。我的印象是,今天常用的大多数语言都是区分大小写的——可能是因为 C 是区分大小写且非常有影响力的,可能是因为它是迫使人们在使用 FORTRAN、COBOL 和 BASIC 几十年后停止全大写编程的唯一方法.

    【讨论】:

    • 如果有关联,那就是不完美的。例如,Pascal 的类型比 C 更强(隐式转换更少,没有无类型指针),但它不区分大小写,而 C 区分大小写。
    【解决方案3】:

    不 - 它们没有连接。强类型语言强制您指定变量可能包含的数据类型——例如实数、整数、文本字符串或某些程序员定义的对象。他们不能意外地将另一种类型的数据分配给该变量,除非它是隐式可转换的:例如,您通常可以将整数放入实数(即double x = 3.14; x = 3; 可以,但int x = 3; x = 3.14; 可能不行,取决于语言的输入强度)。弱类型语言只存储他们被要求的任何内容,而不进行这些健全性检查。在像 C++ 这样的强类型语言中,您仍然可以创建可以存储可以是任何特定类型集的数据的类型(例如 C++ 的boost::variant),但有时它们在您可以做的事情和使用起来有多方便。

    区分大小写意味着同一个字母的大写和小写版本在某些情况下被认为是等效的……通常在字符串比较或正则表达式匹配中。现代计算机语言忽略变量名(标识符)中字母的大小写是不寻常的,但并非闻所未闻。

    【讨论】:

      猜你喜欢
      • 2023-03-11
      • 2011-02-11
      • 2013-02-03
      • 1970-01-01
      • 2015-09-22
      • 1970-01-01
      • 2018-06-10
      • 2016-09-26
      相关资源
      最近更新 更多