たとえば、GlowCodeプロファイラーのWebサイトを見ると、次のように表示されます。
「GlowCode6.2およびx64プロファイルのネイティブ、管理、および混合C ++、C#、.NETコード」
それらはどういう意味ですか?
ネイティブコードは、メモリが「管理」されていないコードです。たとえば、メモリは解放されません(たとえば、C ++の削除やCの解放)、参照カウント、ガベージコレクションはありません。マネージコードとは、ご想像のとおり、メモリが空いていて、ガベージコレクションやその他の機能に割り当てられているコードです。
混合コードとは、アンマネージレイヤーを呼び出すマネージコードがある場合です。通常、純粋なアンマネージC ++ DLLがあり、P/invokeを使用して.NETから呼び出す場合。
ネイティブコードは、OSと直接連携するようにコンパイルされています。ただし、マネージコードはプリコンパイルされています(Javaの場合はバイトコード)が、実行時にJustInTimeコンパイラによってネイティブコードに処理されます。マネージコードには、VMが実際に使用するまでマシンコードが作成されないため、さまざまなオペレーティングシステムで実行される可能性があるという興味深い副作用があります。このようにして、Windowsで.NETアプリを実行したり、MonoランタイムがインストールされているLinuxまたはMacでアプリを実行したりすることができます。移植性は現在Javaほどクリーンではありませんが(Microsoftの自然に閉じたアーキテクチャのため)、概念は残っています。
管理されていないアプリを実行している場合、コードは指定されたOS/ハードウェアで実行されるようにコンパイルされています。別のOS/命令セットへの移植性は失われるため、実行するには再コンパイルする必要があります。
ネイティブコードは、それが実行されているコンピューターの「ネイティブ」機械語で記述され、プロセッサーによって直接実行されます。
マネージコードは、それを実行(つまり管理)するために別のプログラムを必要とする特別な言語で書かれています。この他のプログラムは、特別な言語を解釈するため、通訳と呼ばれることがよくあります。
CおよびC++プログラムはネイティブです。
JavaとC#(およびそれに関するすべての.NET言語)が管理されます。
マネージC++は、.NETインタープリターで実行されるC++の特殊な形式です。
混合プログラムは、ネイティブと管理の両方のコードを使用するプログラムです。
共通言語ランタイム(CLR)の制御下で実行されるコードは、マネージコードと呼ばれます。CLRで実行されないコードは、ネイティブコードと呼ばれます。