どのような理論上のオブジェクトがC ++の概念に対応していますか?


8

理論的なコンピューターサイエンスのバックグラウンドはありませんが、C ++の概念がどのような理論的なオブジェクトに対応するのかを理解したいと思います。基本的に、C ++の概念では、制約のリストを満たす型のセットを定義できます。それで、理論的な観点から、どのC ++の概念が対応する、またはおおまかに対応する(そしてその場合、違いは何である)のでしょうか。


1
C ++プログラムは、チューリングマシンに似ています。関数はオラクルのようなもので、時間がかかるだけです。C ++は、多くのプログラミング言語と同様に、ラムダ計算のようなものです。関数のランタイム作成は、C ++ 11の時点で明らかに新しいものです。
フィリップホワイト

6
@PhilipWhite質問のポイントを逃したと思います。OPは、C ++のさまざまな概念の理論的な説明を求めているのではなく、概念と呼ばれるC ++の構造の理論的な説明を求めています。私はPLについて十分な知識がなく、質問に答えることはできませんが、私が理解していることから、概念は多態性を制限するための何らかのメカニズムです。そのようなメカニズムがすでに正式に研究されているかどうかはわかりませんが、型システムに追加するのは妥当なメカニズムのように見えます。
2017

私の間違い...私はリンクをたどりましたが、それをあまりよく読みませんでした。(私は自分自身でC ++の概念を学習/使用する必要性を発見したことがありませんでした。)
フィリップホワイト

回答:


11

プログラミング言語理論の観点から、他の回答やコメントが提供した計算可能性の観点とは対照的に、C ++テンプレートは、概念と組み合わせて、制限付きの多態性または制約付きの総称に対応します。概念自体は、型に設定された制約または境界に対応します。

テンプレートはタイプレベルの関数であり、タイプによってパラメーター化され、特定のインターフェースを実装するための概念によって制約されます。テンプレートがその概念を満たす型に適用されると、新しい型になります。

テンプレートとコンセプトは、Java、Scala、またはEiffelのジェネリックに類似しています。これらは、型パラメーターの制約を指定およびチェックできるため、以前のC ++のテンプレートとは異なりますが、C ++テンプレートではそれができませんでした。利点は、テンプレートを適用した後のプログラムが適切に入力されるという静的チェックの改善です。

適切な参照は、Pierce、Benjamin C.(2002)です。型とプログラミング言語。MIT Press、Chapter 26:Bounded quantification。


3
C ++テンプレートには型制限が組み込まれており、構造型の形式を作成します。これは、型チェッカーを満たすために、型が定義された操作のセット(テンプレート定義に暗黙的に含まれる)のみを持つ必要があるためです。概念はほとんど同じことをしているように見えますが、名前をそれらの一連の動作(名義型の形式)に関連付けることができるため、より早く、より良いエラーメッセージを生成する方法を提供します。また、概念は型から型への関数だとは思いません。リンクされた説明は、型述語として、またはブール関数への型としてそれらを記述します。
oconnor0 2017

@ oconnor0:その通りです。コンセプト+テンプレートは、制限付きのポリモーフィズムを提供します。回答を更新します。
Dave Clarke

これに同意するかどうかはわかりません。概念、C ++テンプレート、およびパラメトリック多態性以外でも、私とは漠然と関連しているようです。ポリタイプ化された用語は型チェックされ、可能なすべてのインスタンスで機能することが保証されます。Javaジェネリックにはそれがあります(Javaはパラメトリック性を壊しますが)。C ++テンプレートは代わりに「SFINAE」を使用します。この場合、型はインスタンス化時までチェックされないため、汎用型からは遠く離れています。
2017

-3

C ++の概念は、再帰的に列挙可能な言語にマッピングされます。C ++型システムはチューリング完全であるため、テンプレートのインスタンス化中に問い合わせ可能な型のプロパティ(サイズ、パラメーターなど)は、型システムでシミュレートされた任意のプログラムを介して実行できます。


1
概念についてもう少し読んだ。(どうやら概念はC ++で新しくなっています。)もちろん、どのC ++関数も再帰的に列挙可能な言語を受け入れます。それは取るに足らないことです。概念からre言語へのマッピングは全単射であると主張していますか?これは明らかに誤りのようです。概念のセクションを見ると、関数の概念は「returnステートメントのみで構成されている必要があり、その引数は制約式でなければなりません」、変数の概念については「初期化子は制約式でなければならない」と書かれています。したがって、これらの概念はチューリング完全に聞こえません。
フィリップホワイト

1
定数式はチューリング完全であるため、そうです。それは全単射です。型のエンコーディングについて明示する必要がある形式化。ないステートメントは、単項で整数を表すvoid、C <void>、C <C <void >>、...型のサブセットを表す一連の概念はRE言語であるということです。
ジェフリーアービング

1
もちろん、実際のコンパイラには定数式を評価するときに計算の制限がありますが、それらの考慮事項を考慮に入れると、答えは有限の概念のセットがあるということです。おそらくそれは要求された答えではありません。
ジェフリーアーヴィング

1
制約式を意味します。リソースによれば、9種類の制約式があり、それぞれの概念で使用できる制約式は1つだけです。また、整数を単項で表すことは、re言語とC ++の概念の間の意味のある全単射ではありません。特に、意味の等価性は保持されません。
フィリップホワイト

1
いいえ、私は定数式を意味しました。質問のリンクによると、これは9種類の制約のリストのエントリ4です。ただし、他の9つのほとんどもチューリング完全です。たとえば、C ++で型を別の型に変換できるかどうかを判断するのはチューリング完了です。
ジェフリーアービング
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.