1 定義

予約語とは、プログラミング言語や記述体系において、構文上の役割があらかじめ定められ、利用者が自由に識別子として再利用できない語句を指す。典型的には、変数名、関数名、型名などに選べないため、文法を安定して解釈するための基盤となる。言語ごとに対象語は異なり、同じ単語でも別の体系では一般名詞として扱えることがある。

1.1 予約語の基本概念

予約語は、あらかじめ意味が固定されているため、入力された文字列のうち特定の語を特別扱いする仕組みである。多くの言語では、条件分岐や繰り返し、宣言などの構文を表す語がこれに当たる。利用者が任意の名前として使えないことで、文の解釈がぶれにくくなる。

1.2 識別子との違い

識別子は、変数や関数などを識別するためにユーザーが付ける名前である。一方、予約語は言語側が用途を決めているため、同列には扱えない。たとえば、通常の識別子は再命名が可能だが、予約語はその言語の規則に従ってしか使えない。

1.3 文法上の役割

予約語は、構文の骨格を示す目印として機能する。解析器はこれを手がかりに、文の開始や分岐、繰り返しの範囲を判断できる。結果として、ソースコードの意味が明確になり、誤読曖昧さを減らせる。

2 種類

予約語には、すべての文脈で使用が禁じられるものから、特定の場所でのみ制限されるものまで複数の型がある。分類は言語設計の方針に左右され、互換性拡張性の確保にも関係する。

2.1 完全予約語

完全予約語は、どの文脈でも識別子として使えない語である。多くの主要構文を担うため、もっとも厳格に保護される。利用者は名前の候補から外しておく必要がある。

2.2 文脈予約語

文脈予約語は、特定の構文位置に現れたときだけ特別な意味を持つ語である。別の場面では通常の名前として扱えることがある。言語の柔軟性を高める一方、文法の理解には周囲の記号や配置を読む必要がある。

2.3 保護語

保護語は、現行仕様では識別子として使える場合があるが、将来の拡張で予約語になる可能性を見込んで確保される語である。実務では、後の変更で衝突しないよう、あらかじめ避けられることが多い。仕様書では、今後のための留保語として扱われる。

2.4 将来予約語

将来予約語は、現時点では正式に予約されていなくても、次期版で予約語化される予定の語を指す。言語の進化に合わせて導入されるため、古いコードとの兼ね合いが問題になりやすい。移行時には、先取りして使わない運用が推奨される。

3 言語仕様における扱い

予約語の扱いは、言語仕様のどの段階で語を認識するかによって決まる。字句、構文、エラー処理の各段階で役割が異なり、実装者はそれらを整合させる必要がある。

3.1 字句解析での判定

字句解析では、文字列を単語単位分割し、候補が予約語か識別子かを見分ける。ここでの判定が正確でないと、後続の処理全体に影響が及ぶ。多くの処理系は、語彙表を参照して予約語を即座に分類する。

3.2 構文解析での利用

構文解析では、予約語が文の構造を決める手掛かりになる。たとえば、条件節やループの開始・終了を判断する際に重要である。予約語があることで、解析器は曖昧な入力をより安定して処理できる。

3.3 エラー処理と制約

予約語を識別子として使おうとすると、通常は構文エラーや警告が返される。これは、誤用を早期に見つけるための制約である。実装によっては、詳細なメッセージを出し、どの語が問題かを明示する。

4 関連概念

予約語は単独で理解するより、周辺概念と合わせて見ると整理しやすい。とくに識別子、キーワード、演算子、制御構文との関係は密接である。

4.1 識別子

識別子は、対象を指し示すための名前であり、利用者が自由に設計する。予約語と混同すると、命名の自由度が狭まり、構文上の衝突が起きる。両者の区別は、言語の基本にあたる。

4.2 キーワード

キーワードは、予約語とほぼ同義に使われることがあるが、文献や言語仕様によって範囲が異なる。広義には、文法上重要な語全般を指すこともある。したがって、文脈に応じた読み分けが必要である。

4.3 演算子

演算子は、加算や比較などの働きを示す記号や語である。予約語とは形式が異なることが多いが、いずれも文の意味を決める点で共通する。言語によっては、単語型の演算子が予約語的に扱われる場合もある。

4.4 制御構文

制御構文は、条件分岐や反復例外処理などの流れを制御する構文である。これらは予約語によって始まりや区切りが表現されることが多い。語の固定化により、処理の流れが読み取りやすくなる。

5 実装上の考慮事項

予約語の設計は、言語の使いやすさだけでなく、処理系の実装方針にも影響する。将来的な変更や補助ツールとの連携を見据えて決めることが重要である。

5.1 文法設計との関係

文法を設計する際、予約語の数が多すぎると命名の自由度が下がる。逆に少なすぎると、構文の見通しが悪くなる。設計者は、可読性と拡張性の均衡を取る必要がある。

5.2 後方互換性への配慮

新しい版で語が予約されると、既存コードと衝突するおそれがある。そのため、言語仕様では段階的な移行や警告の導入が行われることがある。互換性を守る工夫は、利用者の負担を軽減する。

5.3 ツールやエディタでの支援

エディタや統合開発環境は、予約語を色分けしたり、入力時に補完候補として示したりする。これにより、誤入力の発見が容易になる。静的解析ツールでも、予約語の誤用を検出する機能が一般的である。

6 各言語での例

予約語の内容や扱いは、言語の系統によってかなり違う。以下では代表的な傾向を示す。

6.1 手続き型言語での例

手続き型言語では、分岐や反復、入出力に関する語が予約されることが多い。古典的な言語では、構文が比較的厳密で、予約語の役割もはっきりしている。簡潔な文法を支える要素として位置づけられる。

6.2 オブジェクト指向言語での例

オブジェクト指向言語では、クラス定義、継承、アクセス制御などに関する語が目立つ。実体の生成やメソッド呼び出しに関係する語彙も、予約語として固定されやすい。体系全体の設計思想が表れやすい分野である。

6.3 スクリプト言語での例

スクリプト言語では、柔軟な書き方を重視するため、予約語の扱いがやや緩やかなことがある。文脈によって意味が変わる語や、将来の拡張を見込んだ留保語が採用される場合もある。簡便さと互換性の両立が課題になる。

7 利用上の注意

予約語は、単に「使えない語」と覚えるだけでは不十分である。命名、移植、将来の更新まで含めて考えると、実務上の注意点が見えてくる。

7.1 命名規則との関係

変数名や関数名を決める際は、予約語を避けるだけでなく、紛らわしい表現も減らすとよい。命名規則を整えることで、読み手が意味を取り違えにくくなる。規約に従った一貫性も保ちやすい。

7.2 予約語の衝突回避

外部ライブラリや他言語からコードを移植する際、予約語の衝突が生じることがある。その場合は、接頭辞を付ける、別名を導入するなどの対応が取られる。機械的な変換だけでは足りないこともある。

7.3 移植性への影響

ある言語で許される名前が、別の言語では予約語になることがある。そのため、複数環境で再利用するコードでは、汎用的な命名が望ましい。移植性を意識すると、保守や再実装が容易になる。