マネージコードとアンマネージコードの違い



Difference Between Managed Code



マネージコードとは何ですか?

マネージコードはマイクロソフトの中間言語であり、彼の主な役割は.NET FRAMEWORK CLRコード実行でソースコードをコンパイルすることです。つまり、マネージコードは翻訳の役割として機能し、ソースコードは実行時に2つのフェーズに分割されます。 :
1.マネージコードのソースコードをコンパイルします(ソースがVB、C#、J#などのさまざまなものを持つことができるように)
2.プラットフォーム固有の言語であるマイクロソフトにコンパイルされたマネージコード。



コンピューター上で直接実行できるマシンコードではなく、コードを中間言語(IL)にコンパイルするコンパイラー。中間言語は、アセンブリ(Assembly)と呼ばれるファイルにカプセル化されます。アセンブリは、すべてのメタデータを作成する記述されたクラス、メソッド、およびプロパティ(セキュリティ要件など)で構成されます。このアセンブリをコピーして、別のサーバーに展開できます。

マネージコードは、の共通言語ランタイム(CLR)で実行されます。コードを実行するこのランタイムは、さまざまなサービスを提供します。一般的に、中間言語の正確さを保証するために、アセンブリをロードして検証します。あるメソッドが呼び出されると、ローカルコンピューターに適したマシンコードにコンパイルされた特定のメソッドのランタイムが実行され、コンパイルされたマシンコードキャッシュが次の呼び出しの準備になります。 (これは時間コンパイルです)アセンブリの実行に伴い、ランタイムは自動ガベージコレクション、ランタイムタイプチェック、セキュリティサポートなどのさまざまなサービスを提供し続けます。これらのサービスは、プラットフォームに依存しない、言語の統一されたマネージコードアプリケーションの動作を提供するのに役立ちます。



Visual Basic .NETおよびC#は、マネージコードのみを生成できます。この種の言語を使用してプログラムを作成する場合、コードはそのように生成されたマネージコードです。必要に応じて、Visual C ++。NETマネージコードを生成できます。プロジェクトを作成するときに、名前を選択します。プロジェクトタイプの先頭を管理します。たとえば、.Managed C ++アプリケーション。

どのような非マネージコードですか?

コードは、作成されたものを発行する前のVisual Studio .NET2002のアンマネージコードです。 Visual Basic 6、Visual C ++ 6など、最悪の場合、生成された古いCコンパイラの15年以上の歴史を持つハードドライブのコードに残っているものでさえ、アンマネージコードです。マネージコードは、ターゲットコンピューターのマシンコードに直接コンパイルされます。コードは、コンピューター、または他のコンピュータープロセッサ、同じまたはほぼ同じプロセッサでの実行時にのみコンパイルできます。管理されていないコードは、セキュリティやメモリ管理など、ランタイムによって提供される一部のサービスを利用できません。管理されていないコードでメモリ管理やその他のサービスが必要な場合は、オペレーティングシステムのインターフェイスを明示的に呼び出す必要があります。一般的に言えば、提供されているAPI WindowsSDKを呼び出して実現します。最近の状況、COMインターフェイスを介してオペレーティングシステムサービスを取得するための管理されていないプログラム。



他のプログラミング言語では、Visual Studioは同じプラットフォームではないため、Visual C ++はアンマネージドを作成できます。プロジェクトを作成し、M FC、ATL、またはWin32タイプのプロジェクトの先頭の名前を選択すると、プロジェクトは管理されていない状態で生成されます。

違い:

  1. マネージコードは、CLRで実行するための中間言語です
    アンマネージコードは、マシン上で実行するためにマシンコードにコンパイルされます。
  2. マネージコードはプラットフォームに依存せず、言語が異なるため、異なる言語プラットフォーム間の互換性が向上します。
    アンマネージドコードの言語とプラットフォームに依存します。
  3. CLRマネージコードは、提供されるサービス(安全性テスト、ガベージコレクションなど)を利用できます。これらの操作を完了する必要はありません。
    アンマネージコードは、独自の安全性テスト、ガベージコレクション操作を提供する必要があります。

マネージコードとは、マネージデータを意味しますか?答えは否定的です。
Visual BasicとC#の場合、他に選択肢がないため、生活は簡単です。これらの言語でクラスを宣言すると、このクラスのインスタンスがマネージヒープに作成され、ガベージコレクター(GC)がこれらのオブジェクトの回復を管理するのに役立ちます。ただし、Visual C ++には、別のオプションがあります。マネージプログラムを作成している場合でも、どのタイプのクラスがマネージドであるか、アンマネージドであるかを決定できます。

これは管理されていないタイプです。

class Foo { private: int x public: Foo(): x(0){} Foo(int xx): x(xx) {} }

これはホスティングのタイプです

__gc class Bar { private: int x public: Bar(): x(0){} Bar(int xx): x(xx) {} }

それらの唯一の違いは、クラスBarの定義に__gcキーワードがあることです。このキーワードは、コードに大きな違いをもたらします。

管理対象タイプは、ガベージコレクターによって回復できます。新しいキーワードを使用して作成する必要があり、スタックに表示されることはありません。したがって、このコード行は有効です。

フー・ファイターズ

しかし、このコード行は違法です。

バーb

ヒープ内にFooオブジェクトを作成する場合は、オブジェクトのクリーンアップを担当する必要があります。

Foo* pf = new Foo(2) // . . . delete pf

C ++コンパイラは、実際にはマネージヒープと非マネージヒープの2つのスタックであり、新しい演算子をオーバーライドして異なるタイプのクラスを作成するための実装例には、異なるメモリが割り当てられます。 Barインスタンス内にヒープを作成する場合、それは無視できます。使用時に他のコードがない場合、ガベージコレクターはクラスを自動的にクリーンアップし、そのリリースリソースが占有されます。マネージドの場合、いくつかのタイプの制約があります。多重継承を実現できない、またはアンマネージドタイプへの継承で、friendキーワードを使用してプライベートアクセスを実現できない、コピーコンストラクターを実現できないなどです。したがって、マネージ型のクラス宣言を配置したくない場合があります。しかし、それはあなたがあなたのコードをマネージコードにしたくないという意味ではありません。 Visual C ++では、を選択できます。

パフォーマンス比較マネージコードとアンマネージコード
実質的に誰もが、すべての.Net言語がILと呼ばれるコンパイルされた中間言語にコンパイルされることを知っています。しかし、コンピュータがこの中間コードをどのように実行するか、しかしそれは多くの人々が知らない、間違った方法でさえあります。
JIT .NETは、実行中の重要なメンバーであり、タイムコンパイラーです。多くの人(間違いなく少数派ではない、多くのc ++プログラマーに尋ねた、10 9このアイデア)は、JITは実際にはJava VMとほぼ同じであると考え、インタープリター、ILは実行時にアセンブリコードを読み取り、x86にシミュレートしますコード(仮想マシンとも呼ばれます)。しかし実際には、.NETはより高度なテクノロジーを使用しています。プログラムがメモリ.Net、ILにロードされた後、特定のコードが最初に実行されると、JITコンパイラはこのILコードを実行し、すべてネイティブコードにコンパイルしてから、実行します。これが、最初に実行された.NETプログラムが理由の開始が非常に遅い理由です! Microsoftには、.NETライブラリとともに、すべての.NET ILコードをネイティブコードにコンパイルしてバッファに格納できるツールも付属しているため、このプログラムはc ++コンパイラとまったく同じであり、違いはありません。また、JITから実行することもできます(ここで混乱しないでください。ここから、.NETライブラリとは言えませんが、このプロセス中にコンパイルする時間はありませんでしたa)。したがって、.NETとJavaを混同しないでください。2つの運用効率はグレードではありません。

JIT最適化とは、ローカルCPUのコンパイル時に最適化できることを意味します。コンパイル時の従来のプログラム。互換性を確保するために、コンパイルに最も一般的に使用される汎用命令セット(古代の386などの命令セット)。 JITは特定のタイプのCPUを認識しており、コンパイルのためにこれらの追加の命令セットを利用できます。このようなパフォーマンスはかなりのものです。

【転送元: suhuaiqiang_janlay