13

私が主にc++を実行したとき、アセンブリを知ることが重要であり、何が起こっているのかを本当に理解できるように、トライアルではないasmコードを記述しました。私は現在ほとんど.netを行っており、ILについてある程度理解していますが、決して熟練していません。

ILは、ILの知識が必要なスキルですか、それともILをさらに完全に学習して、.netコードの使用方法と記述方法を通知するスキルですか?

4

7 に答える 7

21

ILを完全に学ぶことは、多くの点でアセンブリを学ぶことに似ています。

ILを理解しておくと、実際に.NETコードをコンパイルしているときに何が起こるかを理解するのに役立ちます。これは、特にパフォーマンスが重要なプロファイリング状況(実際の問​​題を見つけて最適化する必要がある場合)に遭遇した場合に非常に役立ちます。

ただし、ほとんどの「日常の」プログラミングタスクでは、ほとんどのC ++プログラマーがアセンブリの記述方法を実際に知る必要がないように、ILを理解する必要はないと思います。

そうは言っても、C ++のバックグラウンドを持つアセンブリコードを理解していれば、ILの一般的な考え方を理解するのは非常に簡単です...

于 2010-02-08T18:10:15.070 に答える
8

.NETアプリを作成しようとしているだけの場合は、ILコードの実用的な知識は必要ありません。ほとんどの.NET開発者は、ILコードの記述方法を知りません。

あなたが本当に何が起こっているのかを理解しようとしているなら、ILはあなたを助けます。これを使用して、マシン上でより効率的なコードを作成できます。これは、作成している.NET言語では明らかではない場合があります。

于 2010-02-08T18:10:29.690 に答える
5

明らかな(仮想マシンの実装)以外に、特定のタイプのタスクでは、ILをかなり完全に理解する必要がありました。

  • 動的コードの記述。これは、特に.NET 4での機能を考えると、System.Linq.ExpressionsAPIにかなりよく置き換えられています。
  • CLIを対象とする新しい言語用のコンパイラーを作成します。Common Processor Infrastructureのようなプロジェクトは、コンパイラーの作成者が実際に作成しなければならないCILコードの量を減らすことを目的としています。

個人的に最も興味深い側面の1つは、IL言語がジャストインタイムコンパイラに与える影響を調べることです。JVMとCLIを対比する1つの注目すべき例は、CLIに非仮想メソッドと直接ディスパッチの概念があることです。これにより、非最適化(ベースライン)コンパイラーによって特に効率的な呼び出しを発行できます。この分析はJVMでよりコストがかかるため、ベースラインコンパイラは多くの場合を最適化できません。

元の質問への回答:

一般に、.NET開発者はCILの学習について心配する必要はありません。作業にランタイム/動的に生成されたメソッドが含まれる場合は、Expressions APIが非常に使いやすく/保守しやすいため、ニーズを満たす能力を評価する必要があります。私はILGeneratorでCILを放出するのに数週間を費やしました。Expressionsに変換し、数百行以上のコードを節約し、理解できなかった古いバグを修正するのに1人の時間がかかりました。

CILの詳細な知識は、CLI仮想マシンを実装したりコンパイラー(AOTまたはJIT)を作成したりする人にとって非常に重要です。面白くて便利だと思いますが、「生産的な開発者になるために知っておくべき重要なこと」の範囲では、それほど高くはありません。

于 2010-02-08T18:17:32.233 に答える
3

.NET Frameworkで、 ILを知っている必要があるのは、System.Reflection.Emit名前空間のクラスだけです。それはあなたがその場でコードを生成することを可能にし、それは選択された場合に役立つことができます。

ILにさらされる最善の方法は、Ildasm.exeツールを使用することです。Reflectorも機能します。それを実行するための非常に便利な方法は、ツールメニューに追加することです。ツール+外部ツール、追加。

  • タイトル=Ildasm
  • コマンド=c:\ Program Files \ Microsoft SDKs \ Windows \ v6.0A \ Bin \ ildasm.exe
  • 引数=$(TargetPath)
  • 初期ディレクトリ=$(TargetDir)

これで、マネージコードを記述し、コンパイルして、生成されたILをすばやく確認できます。以前にマシンコードに触れたことがある場合は、非常に簡単に実行できます。ILは型指定されておらず、すべての値型に同じオペコードが使用されていることに注意してください。

次のステップは、ILがどのようにマシンコードに変換されるかを確認することです。デバッグを開始し、コードを右クリックして、[逆アセンブリに移動]を選択します。リリースビルドを実行してJIT最適化を有効にしない限り、実際のマシンコードを見ないことに注意してください。ツール+オプション、デバッグ、「モジュールロード時のJIT最適化の抑制」のチェックを外します。

于 2010-02-08T18:26:50.257 に答える
1

依存します。ILを知っていると、コードが何に変わるかを理解するのに役立つでしょう。ILについて十分な知識がある場合は、実行時に新しいコンポーネントを作成することもできます(必要な場合)。それは不可欠ですか?おそらくそうではありません。

于 2010-02-08T18:10:57.113 に答える
1

アセンブリを知ることは、VisualStudioのC/C++にとって非常に優れていました。あなたはいつでも分解に行って何が起こっているのかを見ることができます。

C#で同じことを試した場合、つまり「逆アセンブルに移動」した場合でも、ILではなくネイティブコードに移動します。その意味で、ILは実際のアセンブリほど有用ではありません。

ただし、ILは、ソースコードがないアセンブリの内部を調べるのに適しています。(ただし、そのためにリフレクターを使用することもできます)

于 2010-02-08T18:16:41.017 に答える
0

いいえ、ほとんどの人が言っているように。さらに、コメントに追加するには、C / C ++を使用する理由と、.NETとその言語(C#のように)を使用する理由を確認してください。

C / C ++は、抽象化された方法でコンピューターを強化するために作成されました。これは、ALMOSTを直接アセンブリ言語に変換し、善(および悪)に大きな力を与えます。ポインターなどが推奨され、ガベージコレクションはありません。したがって、何ができるのかという理由で、アセンブリ言語コードが何をしているのかを知る必要があります。


.NET言語は、優れたアプリをすばやく作成し、これらのアプリに与える可能性のあるダメージを制限するために作成されました。これにより、CPUを介して実際の電力を使用することを思いとどまらせます(ポインターは推奨されておらず、ほとんどの場合、ガベージコレクションについて心配する必要はありません)。基本的に、実行できるダメージはアプリに限定されます。CPUとはほとんど関係ありません([私の経験では]まれなケースでのみ使用される安全でないコードに手を出さない限り)。さらに、.NETコードはILに変換され、次にILはアセンブリに変換されます。など...とにかくアセンブリ言語を直接扱っているわけではありません。


これらは、頭の知識のためにILを知ることは良いことであり、あなたを少し助けることができます。しかし、それを知っていても、優れたアプリを作成するのに大いに役立つことはありません。これは、Microsoftで機能していないほとんどの開発者にとっての.NET言語のポイントです。

于 2010-02-08T18:33:05.050 に答える