Windows 8では、.NETに似ているが管理されていないWinRTが導入されています。なぜ管理されないのですか?パフォーマンスの問題ですか?ガベージコレクションは低レベルのAPIには適さないという意味ですか?
Windows 8では、.NETに似ているが管理されていないWinRTが導入されています。なぜ管理されないのですか?パフォーマンスの問題ですか?ガベージコレクションは低レベルのAPIには適さないという意味ですか?
回答:
WinRTのは、交換古来のCベースのWINAPIため。これは、多くのランタイム環境で使用可能でなければならないAPIです。20年前、C apiは比較的簡単に相互運用できました。それはその後も続いており、COMは1990年代後半にユニバーサルグルーになりました。Windowsで一般的に使用されているほとんどの言語ランタイムは、COMをサポートしています。
ガベージコレクターは、言語ランタイム実装の詳細です。.NETのコレクターは、たとえばJavaScriptのコレクターとは大きく異なります。どちらかで作成されたネイティブオブジェクトは、コレクターの非常に厳密な規則を遵守する必要があります。つまり、各言語ランタイムに固有のWinRTバージョンを作成する必要があったことになります。マイクロソフトほどの規模の企業であっても、すべての言語バインディングに対して特定のWinRTバージョンを作成してサポートする余裕はありません。これらの言語がすでにCOMをサポートしていることを考えると、必要もありません。
現在、WinRTの最適なバインディングはC ++です。これは、COMが明示的なメモリ管理でより効率的に機能するためです。自動化する新しいC ++コンパイラー拡張機能による十分な支援により、C ++ / CLIのような構文を使用する古い_com_ptr_tと非常によく似ています。CLRは既に優れたCOM相互運用機能をサポートしているため、マネージ言語へのバインドは比較的簡単です。WinRTは.NETのメタデータ形式も採用しました。Afaik、今日のところ、マネージドコンパイラーに関する作業はまったく行われていません。
編集:有名なマイクロソフトのプログラマーでありブロガーであるラリー・オスターマンは、削除された回答にかなり良いコメントを残しました。保存するためにここで引用します。
OSが管理されていないため、WinRTは管理されていません。そして、WinRTを設計された方法で設計することにより、C ++、C#、JSだけでなく、さまざまな言語で表現できるようになります。たとえば、デスクトップで動作するWinRT APIを実装するPerlモジュールのセットを簡単に見ることができます。.Netで実装した場合、それは非常に困難でした。
IInspectable
ます(たとえば、オブジェクトに実際のクラスタイプまたはサポートされているすべてのインターフェイスのリストをクエリするなどの操作を実行できます。また、winmdファイルを使用すると、そのすべてのWinRTメタデータをReflectionに投影できます。 )。また、winmdファイルは相互運用機能アセンブリとしてすぐには使用できません。CLRはそれらを特別に処理する必要があります。
WinRTは、Win32(Windows用の最低レベルの開発者がアクセスできるAPI)の代替となることを目的としているため、管理されていません。アンマネージAPIは、開発者に公開できる最も潜在的なパフォーマンスの高いAPIであり、マネージAPIを常にその上にラップすることが常に可能であると推論しています。これは、まさに「プロジェクション」が行うことです。
また、C ++開発者は、C ++ / CLIが導入するフープを飛び越えずにWinRTを使用できることも意味します(http://www2.research.att.com/~bs/bs_faq.html#CppCLIを参照)。 WinRTを使用する場合は、COMを学習する必要があります。
本当の質問は、「なぜCOMが必要なのか?なぜマイクロソフトはそれを発明しなければならなかったのですか?」COMのすべての追加機能を備えていないプレーンなC ++は実際のOOP作業には不十分であり、「移植性」を提供するC ++のStroustrupの主張は、実際の動作に照らして非常に不誠実です。http://webmechs.com/webpress/2011/11/c-versus-objective-c-as-api-substrate/を参照してください