キーワードを追加するだけでなく、短いキーワードを再利用する(およびコンテキスト依存の意味を追加する)ことを支持する主な議論は何ですか?
提案された新しいキーワードを既に使用している可能性がある既存のコードを壊さないようにしたいだけですか、それともより深い理由がありますか?
C++ 11の新しい「enumクラス」はこれについて考えさせられましたが、これは一般的な言語設計の質問です。
一部の古い言語には、キーワードがまったくありませんでした。特に、 PL/1 ここで
IF IF=THEN THEN BEGIN;
/* some more code */
END;
は正当なコードでしたが、完全に判読できませんでした。 (write-mostlyプログラミング言語の例として [〜#〜] apl [〜#〜] も調べてください。コードの元の作者でさえ、数か月後に読むのは完全に不可解です)。
CおよびC++言語ファミリには、言語仕様で定義された一連のキーワードがあります。しかし、非常に広く使用されている言語には、数十億のレガシーソースコード行があります。あなた(または彼らの標準化委員会)が新しいキーワードを追加すると、既存のプログラムと衝突する可能性があります。したがって、インスタンスに標準が追加された場合はenum_class
新しいキーワードとして、誰かが既にそれを識別子として使用している可能性があり、そのエンティティは不幸でしょう(新しいC++標準を採用するときにコードを変更する必要があります)。
また、C++はゆっくりと解析されることが広く知られています(特に、<vector>
は数十万行のソースコードを引き出しています。これは、モジュールがまだC++に含まれておらず、構文が非常に曖昧であるため)、パーサーを複雑にして新しい構文を処理することは大したことではありません(C++の解析は常に恐ろしいことですとにかく)。たとえば、GCCコミュニティは、C++ 03からC++ 11へのジャンプであっても、新しいC++機能よりも新しい最適化の方がはるかに懸命に働いています(明らかに、C++標準ライブラリの最近の機能は、新しい構文の解析よりも多くの作業を必要とします)大きなジャンプであり、C++フロントエンドで多くの作業が必要でした。これは、C++ 11からC++ 14へのジャンプにはあまり当てはまりません。
他の言語(たとえば、 Common LISP や Scheme などのLISPの方言、let
またはif
マクロを再定義できる場所、および マクロ in homoiconic これらのような言語はveryで動作します [〜#〜] ast [〜#〜] s、未加工のテキスト置換 メカニズム CまたはC++で...)既存のキーワードの再定義を許可します。 衛生マクロ についてもお読みください。しかし、これによりソースコードが数か月後に理解しにくくなる可能性があります。
提案された新しいキーワードを既に使用している可能性がある既存のコードを壊さないようにしたいだけですか、それともより深い理由がありますか?
定義上、キーワードは他のどこでも使用できない特別なトークンです。その結果、キーワードを導入すると、特定のスペルで識別子を使用するコードが中断されます。
一部の言語では、contextual keywordという用語を使用して、特定のコンテキストでキーワードとしてのみ解釈されるスペルを指します。このコンテキストで以前に「ワイルド」識別子を使用できなかった場合、コンテキストキーワードの導入が既存のコードを壊さないことが保証されます。たとえば、関数シグネチャの右括弧の直後に識別子は表示されないため、これはいわゆるコンテキストキーワード(override
やfinal
など)を導入できる場所です。
一方、以前に識別子が許可されていた場所では、キーワードを追加するとリスクが生じます。例えば:
struct H { my_type f; enum { g }; };
_:新しいキーワードではなく_enum class
_を使用する理由は、このコンテキストで新しいWordがデータメンバー宣言の開始として誤って取得される可能性があるためです。 (LL(1)で)キーワードのみが明確であり、新しいキーワードを導入するとコードが破損する可能性があります。void h() { my_type f; auto x = g(); }
:新しいキーワードではなくauto
を使用するのは、新しいWordが既存のタイプと衝突する可能性があるためです。この位置ですでに使用可能なキーワードであったため、まだ驚くべき選択ですCで(デフォルトはint
タイプ)が、その意味は変更されました(正当化は、使用法)。一部の人が言ったように、言語は完全にキーワードなしで設計することができます(Haskellはかなり近くなります)、またはキーワードをシームレスに導入できる方法で作成できます(たとえば、すべての宣言がすでにキーワードで始まる場合、新しいキーワードを導入することは衝突できません) )。これは、CおよびC++が作成されていない場合に起こります。実際、多くのCライクな言語です。
あなたが提案するように、主にキーワードを追加すると、他のコンテキストでこのキーワードを使用する既存のコードが破損するためだと思います。