保留字(英语:Reserved word),有时也叫关键字keyword[1][2],是编程语言中的一类语法结构。在特定的编程语言里,这些保留字具有较为特殊的意义,并且在语言的格式说明里被预先定义。通常,保留字包括用来支持类型系统的原始数据类型的标记,并可以用来识别诸如循环结构、语句块、条件、分支等程序结构。

保留字在编程语言设计之时就被定义。有时,语言说明具有一定的灵活性,软件商可能会在其生产的编译器中添加非标准的语言特性。同样,当发展得更加成熟时,编程语言的保留字标准可能会扩展一些额外的特性,例如,在传统的编程语言中增加面向对象程序设计的特性。有时,编程语言说明会包含一些将来版本可能需要用到的保留字。在Java中,constgoto就是两个保留字——它们在Java中目前没有被使用,因此不具有意义,但是不能够被用作标识符。[3]通过“保留”这个术语,它们可以在Java的未来版本中补充,而不需要“破坏”旧的Java源代码。不像预定义函数、方法和子程序,保留字不能被程序员定义,而前面那些的名称通常被归类于标识符,而不是保留字。

语言间的比较

不是所有的编程语言都有相同数量的保留字。例如,Java(以及其他C语言[4]派生的语言),具有相对较少的保留字,大约有50个。而COBOL则具有大约400个保留字。相反的极端则是Prolog,没有保留字。

一个语言具有的保留字数量与其功能“强大”程度没有必然联系。COBOL在20世纪50年代被设计成一种商业语言,它是一种自存档(self-documenting)、使用类似英语结构的元素(例如动词、子句、语句等)。而相反地,C语言被设计成一种在句法上较为简练的编程语言。例如,比较下列来自C语言和COBOL的两段计算单周收入的等价语句块:

// 使用C语言计算:

if (salaried)
        amount = 40 * payrate;
else
        amount = hours * payrate;
* 使用COBOL计算

IF Salaried THEN
        MULTIPLY Payrate BY 40 GIVING Amount
ELSE
        MULTIPLY Payrate BY Hours GIVING Amount
END-IF.
* 另一个使用COBOL计算的例子

IF Salaried 
        COMPUTE Amount = Payrate * 40
ELSE
        COMPUTE Amount = hours * payrate
END-IF.

上述例子中彩色的部分即是它们各自的保留字。

纯的Prolog语言使用关系式来表达,并通过询问这些关系触发处理方法。诸如循环的结构通过使用循环、递归的关系来实现。

虽然以上三个例子具有不同的保留字,但是它们都能胜任解决上述问题。程序的功能取决于它们对一系列图灵语言的归属。

一些跨语言的保留字

微软.NET框架下的通用语言架构允许程序源代码以超过40种不同的编程语言混合编译,并生成一个解决方案。鉴于此,标识符、保留字的冲突可能会在一种语言写成的源代码试图处理另一种语言的源代码的过程中发生。例如,一个Visual Basic .NET库可能会包含这样一个类:

' Class Definition of This in Visual Basic.NET:

Public Class this
        ' This class does something...
End Class

假设这一段源代码被编译,并被作为一个工具箱的一部分,那么一个C#[5]程序员在同一程序中定义this类的变量就会遇到问题,因为this是C#中的一个保留字,因此,下列的源代码将不能成功编译:

// Using This Class in C#:

this x = new this();  // Won't compile!

类似的问题在访问成员、覆盖虚方法以及识别命名空间的情况中出现。

为了解决这个问题,语言说明允许C#程序员在保留字前面加上符号“@”,从而强制编译器将后面的保留字看成一般的标识符,而非保留字。[6]例如:

// Using This Class in C#:

@this x = new @this();  // Will compile!

相反地,也可在 VB 中使用 [] 括起来以达到相似的目的:

//C#:
public class Me{
...
}
//VB:
Dim myMe As New [Me]()

为了保持连贯性,这样的用法也可以在非公有情况下使用,例如声明局部变量、参数名称以及私有成员。

另一例子是 SQL 中也可用 [] 括起数据库对象名(表、列等),而被括的不仅限于 SQL 保留字 / 关键字:

select [1st col] from [select]

这将选出名为“select”表中“1st col”列的数据。

参考文献

  1. ^ The Java Language Specification, 3rd Edition, Section 3.9: Keywords. Sun Microsystems. 2000 [2009-06-17]. (原始内容存档于2012-02-13). The following character sequences, formed from ASCII letters, are reserved for use as keywords and cannot be used as identifiers[...] 
  2. ^ ISO/IEC 9899:TC3, Section 6.4.1: Keywords (PDF). International Organization for Standardization JTC1/SC22/WG14. 2007-09-07 [2011-09-28]. (原始内容存档 (PDF)于2018-01-11). The above tokens (case sensitive) are reserved (in translation phases 7 and 8) for use as keywords, and shall not be used otherwise. 
  3. ^ Java Language Keywords. Oracle. [2011-09-28]. (原始内容存档于2011-11-20). 
  4. ^ C++ Reference Material Keywords. Saint Mary's University. [2011-09-28]. (原始内容存档于2020-02-15). 
  5. ^ C# Keywords. MSDN. [2011-09-28]. (原始内容存档于2017-01-28). 
  6. ^ C# FAQ: What does at sign identifier mean. C# Online.NET. [2011-09-28]. (原始内容存档于2020-07-02).