编程语言标识符一般的原则都差不多,一般都是字母、数字和下划线的组合,具体为:
- 定义标准的标识符按字母、下划线开头,后面跟字母、数字和下划线
- C/ObjC/C++/C#/Java/Go/Rust/Swift/Python/仓颉/Shell/Pascal/PHP/VB.NET 等都遵循。
- VB 只能以字母或汉字开头,不能以数字和下划线开头
- 不能以数字开头
- 和整数和浮点数字面量冲突
- 不能含有其他字符
- 其他特殊字符,比如+-*/会和运算符冲突
- 下划线开头(包括双下划线)可能是语言保留字,谨慎使用
MSVC有明确提到这种标识符为C++保留,不要去用。 - XML 标记语言规则较为特殊,标签只能以"_"或英文/中文开头,名称中可以包含"_"、"-"、"."、":"等字符。
标识符长度
- 最大长度各有不同
- 早期编程语言会有限定有效标识符的限制,例如Pascal曾经限制标识符长度是64. 随着计算机内存空间飞速发展,此限制也逐渐放宽,新编程语言似乎对此无感,但事实上,内部依然有最大支持的长度以避免编译行为异常。
- 过长的标识符长度给编译速度造成压力
- MSVC 17(VS2022默认)标识符长度不能超过2048字符。标识符 (C++)
大小写敏感
- 大部分编程语言大小写敏感
- C/ObjC/C++/C#/Java/Go/Rust/Swift/Python/仓颉/JS/Shell(不包括Windows批处理)
- 下面是不区分大小写的语言。例如:FORTRAN早期版本、Ada、Pascal、(Visual) Basic、SQL和批处理脚本(与DOS/Windows文件路径不区分有关)。
一些特殊的标识符
- C# 允许在关键字前面加上@符号,即可作为标识符使用。
例如:@return 可以作为一个标识符。 - Go 语言下划线"_"是空白标识符,可以表示不使用但存在的变量。
- 仓颉 同样提供 "_" 表示通配符指代不具体指代的变量,可用于不关心或使用此变量的场景。
预定义标识符
一些编程语言除了提供用户自定义的标识符用于变量、函数名之外,还提供预定义标识符。这些标识符可以看成“弱化的关键字”,它们可以被重定义为变量名,当然它也失去之前预定义的功能。
- ObjC id就是预定义标识符,可以被重定义为变量名:int id = 10
但是,YES, nil因为是宏定义,就不能当变量名。 - Go 语言有预定义标识符,比如int,int32等,它们不是关键字,要格外注意。
中文或Unicode标识符
随着编程语言国际化发展,很多主流编程语言都从早期只支持ASCII码变量名到支持用Unicode字符串命名变量名。这很好理解,对于编译器或者解释器,只需要将标识符的判定逻辑从只有ASCII码到支持其他编码格式。例如,Swift支持标识符中使用中文或者一部分Emoji图形。
TOKEN
标识符只是TOKEN的一种,TOKEN是编译器词法分析中最小单位。包括关键字、运算符、结束符、注释符等都是TOKEN的一种,词法分析分割出TOKEN最终送给语法分析处理。
BNF范式
ALGOL60首创提出BNF范式,上下文无关、支持递归的语法规则表达,极佳地支持编程语言完整性。