跳至內容

保留字

本頁使用了標題或全文手工轉換
維基百科,自由的百科全書

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