予約語
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2023/04/06 15:47 UTC 版)
典型的な予約語・キーワード
- フロー制御を表す単語(
if
、while
など) - プログラムの構成要素を表す単語(
function
、class
など) - プログラムの構成要素を修飾する単語(
static
、const
など) - 組み込み関数(
open
、read
など) - 組み込みの型(
int
、string
など) - 他の言語などと混同して、誤用される可能性のある語(Javaの
goto
、const
など) - 将来キーワードとして利用するかも知れない語(JavaScriptの
let
、super
[19]) - 過去にキーワードだったため意味が無くなった後も(将来的な再利用のために)残してあるもの(C++11の
export
[20]、C++17のregister
[21])
なお、C系の言語では、BASIC系の言語におけるELSEIF
に直接相当するキーワードおよび構文は存在しない。C系言語のelse if
は複合キーワードや専用構文などではなく、else
節に続く別のネストされたif
文とみなされる[22][23]。処理系によっては、あらかじめ定められたネスト数の上限に達するとコンパイルエラーとなる[24]。
キーワード指向の言語と記号指向の言語
抽象構文的には全く違いは無いにもかかわらず、具象構文・字句構文(lexical syntax)的な違いは見た目の違いとしてわかりやすいこともあり、しばしばプログラマの好みの問題になりやすい。代表的にはブロックが { ... }
か begin ... end
か、などといった点であるが、そういった要素に記号を多用しがちな言語と、キーワードを多用しがちな言語がある。記号を使うのは簡潔だが、やりすぎると一見では暗号のようになりかねない(PerlやAPLなど)。キーワードを使う言語は冗長だが明示的という点は利点だが、識別子に使える名前が制限され、フォントを変えるなどシンタックスハイライトの支援がないと見た目にも区別しづらい。キーワードは全て大文字とし、識別子には必ず大文字アルファベット以外の文字が含まれるようにする、といった解決法もある。近年[いつ?]はISO 646の国際版に、世界的に7ビットの文字コードは定着したが、以前は、あるいは今もEBCDICは絶滅していないので記号は自由に使えない場合もあった。
コンテキストキーワード
コンテキストキーワード (contextual keywords) はC#やC++などの言語で採用されている特殊なキーワードで、文脈キーワード、文脈依存キーワード (context-sensitive keywords) とも言われる。
言語を後から拡張する場合、新しい構文やキーワードあるいは予約語を追加すると既存のコードとの互換性が壊れてしまう場合がある。例えば、既存の変数やメソッドの名前が新しいキーワードあるいは予約語と同じだった場合、新しい言語仕様では構文エラーとなる。しかし、完全に将来の拡張を予期してあらゆるキーワードを予約しておくことは困難であり、予約語が拡張の障害になりうる。
そこで、新しく拡張された構文の中でのみキーワードとして動作するのがコンテキストキーワードである。コンテキストキーワードは特定の構文以外では変数などの名前として使用できるため、既存のコードを破壊することがない。
例えば、C#のプロパティ構文では、C# 1.0の登場当初からget
、set
、value
という多くの名前に使われているであろう語をコンテキストキーワードとして定義している[25]。これは例えばC/C++やJavaのコードをC#に移植する際に、名前の衝突を避けるのに役立つ。C# 5.0で追加されたasync/await構文でも、コンテキストキーワードを利用して言語仕様が拡張されている。
Cでは、例えばinclude
やelif
などはプリプロセッサディレクティブの文脈では命令のひとつとして認識されるが、それ以外では通常のユーザー定義識別子として使用することもできる[26]。
C++では、例えばC++11で追加されたoverride
やfinal
は単独ではキーワードではなく、通常は変数名や関数名などの識別子として使用することもできるが、文脈によっては特殊な意味を持つようになる[27][28]。
マイクロソフトによる独自の言語拡張であるC++/CLIおよびC++/CXでは、プロパティやデリゲートなど、標準C++からの拡張機能に関連するキーワードはすべてコンテキストキーワードとして規定されている[29]。
コンテキストキーワードの問題点
- 文脈によってキーワードか否かが決まるので正規表現などでは判断しがたいこともあり、テキストエディタのシンタックスハイライトを正確に行うのが困難なこともある。しかし、パーサの設計次第ではあるが統合開発環境などでは言語処理系自体のパーサを利用するなどして構文解析を行って実現する、という手もある。
- パーサ(構文規則)が複雑になる場合もある。
- 他のスコープの変数やクラスメンバなどを使用する際に、新しい構文の中でも識別子として利用しないといけない場合があり、コンテキストキーワードだけでは回避できない(以下のC#によるコード例を参照)。
public class MyClass {
private string value; // value は setter でのみ使われるコンテキストキーワードなので、ここでは衝突しない。
public string Value {
get { return value; } // value は setter でのみ使われるコンテキストキーワードなので、ここでは衝突しない。
set { value = value; } // フィールド MyClass.value への代入ではなく、パラメータ value への自己代入となる。
//set { this.value = value; } // フィールドへの代入とするには、this による修飾が必要。
}
}
var obj = new MyClass();
obj.Value = "hoge";
System.Console.WriteLine("Value = \"{0}\"", obj.Value);
コンテキストキーワードの利点
- 前述の「問題点」は全て、レキシカルアナライザは厳密な正規表現(正規言語に限られた範囲の表現)によって先頭のトークンを切り出すことしかできず、パーサは厳密にLL(1)かLALR(1)の構文規則のみに従ってパースすることしかできない、という、聊か非現実的な前提の下では正しい。しかし実際の言語の処理系の実装では、レキシカルアナライザもパーザもアドホックに拡張されているのが普通である。コンテキストキーワードのようなものは一般に、何らかの指定されたキーワードの直後であるとか、記号の特殊な組み合わせといったような、アドホックな拡張によって容易に扱えるように設計されるのが通例であり、以上の問題点による実際の問題は小さい。
- 共通言語基盤 (CLI) のように、他の言語と共通のバックエンドやライブラリを使うためには、予約されている綴りを識別子として使うためのエスケープとともに、重要で必須な対応とも言える。
- ^ a b 予約語(reserved word)とは - IT用語辞典 e-Words
- ^ Collins, reserved words
- ^ Reserved word Definition & Meaning | Dictionary.com Dictionary.com, “a word in a programming language or computer system that has a fixed meaning and therefore cannot be redefined by a programmer”
- ^ Java Language Keywords (The Java™ Tutorials > Learning the Java Language > Language Basics)
- ^ Keywords - Visual Basic | Microsoft Docs
- ^ キーワード - Visual Basic | Microsoft Docs
- ^ @ - C# リファレンス | Microsoft Docs
- ^ 宣言された要素の名前 - Visual Basic | Microsoft Docs
- ^ シンボルと演算子のリファレンス - F# | Microsoft Docs
- ^ C のキーワード - cppreference.com
- ^ 識別子 - cppreference.com (C)
- ^ C reserved keywords - IBM Documentation
- ^ C++ のキーワード - cppreference.com
- ^ 識別子 - cppreference.com (C++)
- ^ [1]
- ^ Fortran 90, ISO/IEC 1539:1991 - §2.5.2 Keyword
- ^ キーワード | Compaq Visual Fortran | XLsoft
- ^ 自由形式 | Compaq Visual Fortran | XLsoft
- ^ これらはES5時点では予約語だったが、ES6で追加された新機能に使われることになり、キーワードに昇格した。
- ^ C++03ではテンプレートのエクスポート機能のために使われていたが、C++11ではその機能が廃止された。のちにC++20ではモジュール機能のために再利用されることになった。
- ^ 非推奨だったregisterキーワードを削除 - cpprefjp C++日本語リファレンス
- ^ if 文 - cppreference.com
- ^ Statements - C# language specification | Microsoft Learn
- ^ Fatal Error C1061 | Microsoft Learn
- ^ C# Keywords | Microsoft Docs
- ^ C keywords - cppreference.com
- ^ C++ keywords - cppreference.com
- ^ overrideとfinal - cpprefjp C++日本語リファレンス
- ^ Context-Sensitive Keywords (C++/CLI and C++/CX) | Microsoft Learn
- 1 予約語とは
- 2 予約語の概要
- 3 概要
- 4 主な言語の予約語やキーワード
- 5 典型的な予約語・キーワード
- 6 関連項目
固有名詞の分類
- 予約語のページへのリンク