Programming languages 为什么变量名中不允许使用特殊字符?

Programming languages 为什么变量名中不允许使用特殊字符?,programming-languages,Programming Languages,为什么在编程语言的变量名中不允许使用特殊字符(下划线除外)? 是否有任何原因与计算机体系结构或组织有关。大多数语言都有悠久的历史,使用ASCII字符集。这些语言倾向于具有简单的标识符描述(例如,以A-Z开头,后跟A-Z,0-9,可能是下划线;COBOL允许将“-”作为名称的一部分)。当你只有一个029键盘穿孔器或电传打字机时,你没有很多其他字符,而且大多数字符被用作操作符语法或标点符号 在较旧的机器上,这确实有一个优势,即您可以将标识符编码为基数37(a-Z,0-9,null)[6个字符,32位

为什么在编程语言的变量名中不允许使用特殊字符(下划线除外)?
是否有任何原因与计算机体系结构或组织有关。

大多数语言都有悠久的历史,使用ASCII字符集。这些语言倾向于具有简单的标识符描述(例如,以A-Z开头,后跟A-Z,0-9,可能是下划线;COBOL允许将“-”作为名称的一部分)。当你只有一个029键盘穿孔器或电传打字机时,你没有很多其他字符,而且大多数字符被用作操作符语法或标点符号

在较旧的机器上,这确实有一个优势,即您可以将标识符编码为基数37(a-Z,0-9,null)[6个字符,32位]或基数64(a-Z,a-Z,0-9,下划线和null)数字[36位6个字符,这是早期机器中常见的字长)用于小符号表。结果是:许多较旧的语言在标识符大小上有6个字符的限制(例如FORTRAN)

LISP语言一直以来都比较宽松;名称可以是除对LISP有特殊意义的字符以外的任何字符,例如()[]``#,通常有一些方法可以使用某种转义约定将这些字符插入名称中。我们的PARLANSE语言类似于LISP;它使用“~”作为转义,因此您可以编写~(begin+~)end作为单个标识符,其实际拼写为“(begin+end)”

更现代的语言(Java、C#、Scala等等,呃,甚至PARLANSE)是在Unicode时代发展起来的,并且倾向于在标识符中使用大多数Unicode(实际上,他们倾向于将命名的Unicode子集作为标识符的一部分)。在这类语言中,由汉字构成的标识符是完全合法的


在西半球,这是一种品味问题:大多数标识符名称仍然倾向于使用字母和数字(有时是西欧字母)。我不知道日本人和中国人在使用Unicode字符集时,真正使用的标识符名称是什么;我所看到的一点亚洲代码倾向于遵循西方的标识符惯例,但注释倾向于使用更多的Unicode字符集。

基本上,这是因为它们主要用作运算符或separator,所以它会引入歧义

是否有任何原因与计算机架构或组织有关


不可以。计算机看不到变量名。只有编译器可以。但它必须能够区分一个变量名和两个由运算符分隔的变量名,而且大多数语言设计师都采用了这样的原则,即计算机程序的含义不应受空格的影响。

这与计算机历史有关。Namely,如果您创建的变量名称中带有
@
,则没有
@
键的人无法编辑您的代码。另请参见:这随语言而异。如上所述,这随语言而异(例如,Swift允许unicode标识符),但另一个原因(当然是历史原因)可能是在只允许普通ASCII的情况下缩短符号表(并且简化操作)。我喜欢snowman运算符!(我希望更多的语言将空格视为更相关的分隔符:-/)@user2864740比什么更相关?它已经相关了。“更多”是什么意思?雪人运算符是什么?user2864740是Unicode字符。@user2864740是什么语言的运算符?这是一个例子。Haskell允许用这样的名称定义运算符,作为这样的运算符可以有效使用的语言的一个例子:Limiting到ASCII的某个子集只是一种语言设计选择/限制。