保留字(英語: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).