8

C++ テンプレートは turing-completeであり、CSS は turing-complete (!) であり、C# のオーバーロードの解決は(ジェネリックがなくても) NP 困難であるというよく知られた事実があります。

しかし、C# 4.0 (co/contravariance、generics など)のコンパイル時のチューリングは完了していますか?

4

1 に答える 1

2

C++ のテンプレートとは異なり、C# (およびその他の .net 言語) のジェネリックは、実行時に生成される機能です。コンパイラは型の使用を検証するためにいくつかのチェックを行いますが、実際の置換は実行時に行われます。私が間違っていなければ、プリプロセッサディレクティブと同様に、Coと反変性についても同じことが言えます。CLR マジックがたくさん。

(実装レベルでの主な違いは、C# ジェネリック型の置換が実行時に実行され、それによってインスタンス化されたオブジェクトのジェネリック型情報が保持されることです)

MSDN を参照

http://msdn.microsoft.com/en-us/library/c6cyy67b(v=vs.110).aspx

更新: CLR は、コンパイルされたアセンブリに関連付けられたメタデータに格納されている情報を介して型チェックを実行します ( Jit Compliation に対して)。これは、多くのサービスの 1 つとして実行されます (この質問に対する ShuggyCoUk の回答が詳細に説明しています) 。 (その他には、メモリ管理と例外処理が含まれます)。したがって、コンパイラーは状態を進行として、状態をマシンの内部状態として理解していると推測します ( TCは、部分的には、以前のデータ (シンボル) を参照して条件付きでデータ (シンボル) を確認できることを意味します評価する)( TCの正確な定義を述べるのをためらった私自身、それを完全に把握しているかどうか確信が持てないので、空欄を自由に埋めて、該当する場合は修正してください。

于 2012-09-20T21:38:13.580 に答える