マネージ/バイトコードとアンマネージ/ネイティブコードの違いは何ですか?

StackOverflow https://stackoverflow.com/questions/252014

  •  05-07-2019
  •  | 
  •  

質問

「私たちプログラマー」が語ったことのいくつかを説明するのが難しい場合があります。プログラマーでも管理者でもない人には簡単だと思うかもしれません。

そう...

マネージコード(またはJavaバイトコード)とアンマネージコード/ネイティブコードの違いをプログラマ以外にどのように説明しますか?

役に立ちましたか?

解決

マネージドコード=="スタッフ全体または執事、メイド、料理人、&場所をきれいに保つ庭師"

アンマネージコード=="大学に住んでいた場所"

他のヒント

机のことを考えてください。定期的に掃除をすれば、実際に作業しているものを目の前に置くスペースができます。クリーンアップしないと、スペースが不足します。

そのスペースは、RAM、ハードディスクなどのコンピューターリソースに相当します。

マネージコードにより、システムはいつ、何をクリーンアップするかを自動的に選択できます。アンマネージコードは、プロセスを「手動」にします。 -プログラマは、いつ、何をクリーンアップするかをシステムに伝える必要があるため。

この議論から生まれたものに驚かされます(まあ、実際にはではなく、修辞的に)。遅れたとしても、何か追加してみましょう。

仮想マシン(VM)とガベージコレクション(GC)は、数十年前のものであり、 2つの別個の概念です。ガベージコレクションされたネイティブコードのコンパイル言語は、数十年前から存在します(標準的な例: ANSI Common Lisp ;まあ、少なくとも < strong>コンパイル時ガベージコレクション宣言型言語、Mercury-しかし、明らかにPrologのような言語では大衆が叫びます。

突然のGCedバイトコードベースのVMは、すべてのIT疾患の万能薬です。 既存のバイナリのサンドボックス化(他の例こちらここここ)? 最小権限の原則(POLA) / 機能ベースのセキュリティスリムバイナリ(またはその最新の亜種 SafeTSA )? 地域の推論?いいえ、マイクロソフト:&amp; Sunは、そのような倒錯についてのみ考えることさえ許可していません。いいえ、この素晴らしい(???)new(???)言語&#167; / APIに合わせてソフトウェアスタック全体を書き直してください。ホストの1人が言っているように、 Fire and Motion もう一度。

&#167;愚かなことはしないでください。C#だけが.Net / Monoを対象とする言語ではなく、であることを知っています。双曲線

編集: この回答へのコメントは、私が指摘したメモリ管理/安全性/コードモビリティの代替技術を考慮して、S.Lottによってコメントされています。 p>

私のポイントは、非技術者はこのレベルの詳細で技術に悩む必要がないということです。

反対に、Microsoft / Sunマーケティングに感銘を受けた場合、彼らがだまされていることを説明する必要があります-GCedバイトコードベースのVMは、彼らが主張するようにこの目新しいものではなく、魔法のようにすべてを解決するわけではありませんITの問題とこれらの実装手法の代替策が存在します(一部はより優れています)。

編集2:ガベージコレクションはメモリ管理手法であり、すべての実装手法として、正しく使用するために理解する必要があります。 ITA Softwareで GCをバイパスして良好なパフォーマンスを得る方法

  

4-約2ギガの静的データがあるため、迅速にアクセスする必要があるため、   C ++コードを使用して巨大なメモリマップを作成します   ポインターレス C構造体を含むファイル   (フライト、運賃などの)、そして   を使用してCommon Lispからこれらにアクセスします   外部データアクセス。構造体フィールド   コンパイルを2つまたは3つにコンパイルします   指示なので、実際にはありません   どんなパフォーマンスでも。 accのペナルティ

基本的な解釈は次のとおりです:

  • 管理 =ランタイムによって管理されるリソースクリーンアップ(ガベージコレクション)
  • アンマネージド =自分の後片付け(つまり、 malloc &amp; free

おそらく株式市場への投資と比較してください。

あなたは自分で株式を売買し、最高のリスク/報酬を与えるものの専門家になろうとすることができます-または、「専門家」が管理するファンドに投資することができます。誰があなたのためにそれをするのか-あなたはいくらかのコントロール、そしておそらくいくらかのコミッションを失うという犠牲を払って。 (確かに私はトラッカーファンドのファンであり、株式市場の「専門家」は正確に最近うまくいきませんでしたが...)

ここに私の答えがあります:

マネージド(.NET)またはバイトコード(Java)は時間とお金を節約します。

今、2つを比較しましょう:

アンマネージコードまたはネイティブコード

独自のリソース(RAM /メモリ)の割り当てとクリーンアップを行う必要があります。何かを忘れると、「メモリリーク」と呼ばれるものになります。コンピューターがクラッシュする可能性があります。メモリリークとは、アプリケーションがRam / Memoryを使い果たした(使い果たした)が、他のアプリケーションの場合にコンピュータが使用できるように解放しないことを意味します。最終的にこれはコンピューターをクラッシュさせます。

異なるオペレーティングシステム(Mac OSX、Windowsなど)でアプリケーションを実行するには、オペレーティングシステムごとにコードをコンパイルし、オペレーティングシステム固有のコードの多くを変更して、それぞれで動作するようにする必要がありますオペレーティングシステム。

.NETマネージコードまたはJavaバイトコード

すべてのリソース(RAM /メモリ)の割り当てとクリーンアップが行われ、「メモリリーク」を作成するリスクがあります。最小に削減されます。これにより、リソース管理に費やすのではなく、機能をコーディングする時間が増えます。

異なるオペレーティングシステム(Mac OSX、Windowsなど)でアプリケーションを実行するには、一度コンパイルするだけで、指定されたフレームワークをサポートしている限り、それぞれで実行されます。 .NET Framework / Mono またはJava)。

簡単に

.NET Framework(マネージコード)またはJava(バイトコード)を使用して開発すると、複数のオペレーティングシステムを簡単にターゲットにできるアプリケーションの構築が全体的に安価になり、ありふれた機能ではなく豊富な機能の構築により多くの時間を費やすことができますメモリ/リソース管理のタスク。

また、.NET Frameworkは複数のオペレーティングシステムをサポートしていないと誰かが指摘する前に、技術的にはWindows 98、WinXP 32ビット、WinXP 64ビット、WinVista 32ビット、WinVista 64を指摘する必要があります。ビットとWindows Serverはすべて異なるオペレーティングシステムですが、それぞれで同じ.NETアプリが実行されます。また、.NETをLinuxおよびMac OSXに導入する Monoプロジェクトもあります。

アンマネージコードは、コンピューターが従うべき指示のリストです。 マネージコードは、コンピューターのタスクのリストであり、コンピューターはそれを達成する方法を自由に解釈できます。

大きな違いはメモリ管理です。ネイティブコードでは、メモリを自分で管理する必要があります。これは困難な場合があり、多くのバグの原因であり、それらのバグの追跡に多くの開発時間を費やしています。マネージコードを使用すると、まだ問題はありますが、問題ははるかに少なくなり、追跡しやすくなります。これは通常、バグの少ないソフトウェアと開発時間の短縮を意味します。

他にも違いはありますが、おそらくメモリ管理が最大です。

彼らがまだ興味を持っているのであれば、バッファオーバーランによる多くのエクスプロイトがあり、マネージコードではそれが得られない、コードの再利用が簡単になった、またはCOMに対処する必要がなくなった(とにかく幸運なら)。私はおそらくCOMから離れたままになります。

これは、エッジに沿ってバンパーがある場合とない場合のプールのプレイの違いのようなものです。あなたと他のすべてのプレーヤーが常に完璧なショットを作らない限り、ボールをテーブルに置いておくために何かが必要です。 (意図的な跳弾を無視...)

または、サイドラインとエンドラインの代わりに壁のあるサッカー、バックストップのない野球、ゴールの後ろにネットのないホッケー、バリアのないNASCAR、またはヘルメットのないフットボール...)

&quot;特定のマネージコードという用語は、Microsoftの世界で特に広まっています。

私はMacOSとLinuxの世界で働いているので、私が使用したり遭遇したりする用語ではありません。

ブラッドエイブラムス&quot; マネージコードとは&quot;ブログ投稿には、「。NET Framework Common Language Runtime」などのことを言う定義があります。

私のポイントはこれです。用語をまったく説明するのは適切ではないかもしれません。バグ、ハッキング、または回避策である場合、それはあまり重要ではありません。確かに洗練された素人の説明を仕上げるほど重要ではありません。 MS製品のいくつかのバッチの次のリリースで消滅する可能性があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top