ほとんどのプログラミング言語は文脈自由文法 (CFG) として解析できると読みました。計算能力に関しては、プッシュダウン型の非決定性オートマトンに匹敵します。私は正しいですか?
技術的にはい。いいえ。
これらの質問について考えるには、少なくとも 2 つの有用な方法があります。
- 文字列のセットを考えている場合は、言語があります。
- 文字列が言語に含まれているかどうかを判断するアルゴリズムについて考えている場合、決定の問題があります。
問題は、ほとんどのプログラミング言語が文脈自由文法 (Tcl は興味深い例外です) によって簡単に記述できる基本構造を持っている一方で、文脈自由文法 によって記述される多くの文は実際には「言語内」にないことです。ここで、「その言語で」とは、「問題の言語で有効なプログラム」を意味します。これらの余分な文は、通常、何らかの形式の静的セマンティクスによって除外されます。たとえば、次の発話は C プログラムの文脈自由文法の文ですが、それ自体は有効な C プログラムのセットには含まれていません。
int f(void) { return n + 1; }
ここでの問題は、それn
が範囲外であることです。C では「使用前の宣言」が必要であり、そのプロパティは文脈自由文法を使用して表現することはできません。
実際のプログラミング言語の典型的な決定手順は、コンパイラまたはインタープリターのフロント エンドの一部であり、少なくとも2 つの部分があります。しかし、2 つ目は、多くの発話を無効として除外する追加のチェックを行います。これらのチェックが何らかの種類の使用前定義プロパティを必要とする場合、プッシュダウン オートマトンまたは文脈自由文法では実行できません。
それが本当なら、チューリングが完了している無制限文法 (UG) を CFG がどのように保持できるのでしょうか?
CFG は何も「保持」しません。単に言語を記述します。
...プログラミング言語がCFGによって記述されていても、実際にはチューリングマシンを記述するために使用されているため、UGを介して.
ここでは、いくつかの重要なレベルの間接化をスキップしています。
それは、少なくとも 2 つの異なるレベルのコンピューティングによるものだと思います。1 つ目は CFG の解析であり、言語の構造 (表現?) に関連する構文に焦点を当て、もう 1 つはセマンティック (意味、解釈) に焦点を当てています。チューリングが完了しているプログラミング言語の機能に関連しています。繰り返しますが、これらの仮定は正しいですか?
彼らは私には少し混乱しているように見えますが、あなたは正しい道を進んでいます. 重要な質問は、「言語とプログラミング言語の違いは何ですか?」です。その答えは、プログラミング言語には計算解釈があるということです。計算による解釈にはさまざまな種類がありますが、そのすべてがチューリング完全であるとは限りません。しかし、魔法は構文ではなく解釈にあるため、ここではチョムスキー階層はあまり関係ありません。
私の主張を証明するために、極端な例を挙げましょう。正規言語[1-9][0-9]*
は、次の解釈の下でチューリング完全です。
- SK コンビネーター言語はチューリング完全です。
- 数え切れないほど多くのSKプログラムしかありません。
- それらは一意かつ決定論的に簡単に列挙できます。
- したがって、各正の整数を SK プログラムに関連付けることができます。
- 標準的な方法で数字のシーケンスを正の整数として解釈すると、同じ数字のシーケンスを SK プログラムと同等に解釈できます。さらに、任意のSK プログラムは、有限の数字のシーケンスを使用して表現できます。
したがって、整数リテラルの言語はチューリング完全です。
今頭が痛くないなら、そうすべきです。