为什么编程语言不允许标识符中的空格?

时间:2009-11-26 18:11:25

标签: language-agnostic language-design

这似乎是一个愚蠢的问题,但我仍然不知道答案。

为什么编程语言不允许名称中的空格(例如方法名称)?

我理解它是为了促进(允许)解析,并且在某些时候,如果允许空格则不可能解析任何东西。

现在我们非常习惯于规范不会看到空格。

例如:

 object.saveData( data );
 object.save_data( data )
 object.SaveData( data );
 [object saveData:data];

等。

可以写成:

 object.save data( data )  // looks ugly, but that's the "nature" way.

如果仅用于解析,我猜标识符可能在.(之间,当然,程序语言无法使用它,因为没有'。'但OO呢..

我想知道解析是否只是 的原因,如果它是,它有多重要(我认为它会是,否则将无法做到,除非所有的编程语言设计师只是......忘了选项)

修改

我对标识符一般都很好(因为fortran示例)是个坏主意。缩小到OO语言,特别是方法,我没有看到(我不是说没有)这是为什么它应该是这样的原因。毕竟可以使用.和第一个(

忘记saveData方法,考虑一下这个方法:

key.ToString().StartsWith("TextBox")

为:

key.to string().starts with("textbox");

10 个答案:

答案 0 :(得分:52)

因为我真的难以接受成功的事情。

答案 1 :(得分:14)

我使用了ALGOL(c.1978)的实现,这非常烦人地要求引用现在称为保留字的内容,并允许在标识符中使用空格:

  "proc" filter = ("proc" ("int") "bool" p, "list" l) "list":
     "if" l "is" "nil" "then" "nil"
     "elif" p(hd(l)) "then" cons(hd(l), filter(p,tl(l)))
     "else" filter(p, tl(l))
     "fi";

此外,FORTRAN(大写形式表示F77或更早版本)对空格或多或少不敏感。所以这可以写成:

  799 S = FLO AT F (I A+I B+I C) / 2 . 0
      A  R E  A = SQ R T ( S *(S - F L O ATF(IA)) * (S - FLOATF(IB)) *
     +     (S - F LOA TF (I C)))

在语法上与

相同
  799 S = FLOATF (IA + IB + IC) / 2.0
      AREA = SQRT( S * (S - FLOATF(IA)) * (S - FLOATF(IB)) *
     +     (S - FLOATF(IC)))

有了这种滥用的历史,为什么要为人类解析困难?更不用说复杂的计算机解析了。

答案 2 :(得分:8)

是的,这是解析 - 人类和计算机。如果您可以安全地假设空白无关紧要,则更容易阅读并且更容易解析。否则,你可能会有一些含糊不清的陈述,不清楚事情是如何结合在一起的陈述,难以阅读的陈述等等。

答案 3 :(得分:5)

在解释器或编译器构建解析树之前,它必须执行词法分析,将字符流转换为令牌流。考虑如何解析以下内容:

a = 1.2423 /(4343.23 * 2332.2);

以上的规则如何对其起作用。很难知道如何在不理解令牌含义的情况下对它进行词法化。构建一个同时执行lexification的解析器真的很难。

答案 4 :(得分:5)

在最好的情况下,这种改变会使语言含糊不清。例如,使用类似C99的语言:

if not foo(int x) {
    ...
}

相当于:

  1. foo的函数定义,返回类型为ifnot的值:

    ifnot foo(int x) {
        ...
    }
    
  2. 使用名为notfoo的变量调用名为intx的函数:

    if notfoo(intx) {
        ...
    }
    
  3. 对名为foo的函数的否定调用(使用C99的not表示!):

    if not foo(intx) {
        ...
    }
    
  4. 这只是您可能遇到的含糊不清的一小部分。

    更新:我刚才注意到,很明显,在类似C99的语言中,if语句的条件将括在括号中。如果你选择忽略空格,额外的标点符号可以帮助解决歧义,但是无论你通常使用空格,你的语言都会有很多额外的标点符号。

答案 5 :(得分:4)

查看Stroustrup的经典Generalizing Overloading for C++2000

答案 6 :(得分:4)

我们被允许在20世纪60年代在文件名中放置空格,而计算机仍然不能很好地处理它们(一切都用来打破,然后大多数事情,现在它只是一些事情 - 但他们仍然破裂。)

在我们的代码再次运作之前,我们不能再等待50年。 : - )

(当然,其他人都说过。在英语中,我们使用空格和标点来分隔单词。对于计算机语言也是如此,除了计算机解析器以稍微不同的意义定义“单词”)

答案 7 :(得分:1)

使用空格作为标识符的一部分会使解析非常模糊(是语法空间还是标识符?),但使用关键字参数可以实现相同的“自然读取”行为。 object.save(data: something, atomically: true)

答案 8 :(得分:1)

有一些语言允许标识符中的空格。事实上,几乎所有语言都限制了标识符中的字符集,这是因为解析更容易,大多数程序员习惯于紧凑的无空白风格。

我认为没有真正的理由。

答案 9 :(得分:0)

TikZ中创建图形的LaTeX语言允许在参数名称中使用空格(也称为“键”)。例如,你会看到像

这样的东西
\shade[
  top color=yellow!70,
  bottom color=red!70,
  shading angle={45},
]

在这个以逗号分隔的键值对列表的限制设置中,没有解析难度。事实上,我认为阅读比topColortop_colortopcolor等替代方案更容易阅读。