7

新規の質問:

Microsoft .NET フレームワークで作成されたプログラムは、ネイティブ コードをコンパイル/実行しますか?

マシンに .net フレームワークをインストールする必要がない方法があるかどうかという意味ではありません。簡単に言えば、.net アプリケーションは Java のような別のレイヤー (つまりバイトコード) で実行されますか。

4

8 に答える 8

26

.NETアプリケーションは、共通言語ランタイム(CLR)上で実行する必要があります。

CLRは、MicrosoftによるCLI標準の実装です。(そして、Microsoft .NET FrameworkのほかにCLRの他の実装があります。つまり、 MonoPortable.NETです)。

CLRは、共通中間言語( CIL )と呼ばれるタイプのバイトコードを実行します。

CIL

于 2009-01-17T04:25:09.060 に答える
7

ある種。.NETコンパイラは、ソースコードをIL(中間言語)にコンパイルし、展開するアセンブリ(通常は1つの.DLLまたは.EXEファイル)にパッケージ化します。実行時には、コードの実行、セキュリティルールの適用などを担当するCLR(共通言語ランタイム)によってホストされます。Windows用のメインデスクトップCLR(MonoやSilverlightなどがあります)はILを解釈しませんが、メソッド(関数)を実行する前にILコードをネイティブコードに「JIT」(インタイムコンパイル)します。

実際には、インタイムコンパイルだけでパフォーマンス上の利点がいくつかあることに注意してください。たとえば、CLRは、CPUのタイプ、CPUキャッシュサイズ、CPU数、RAMサイズなど、実行しているマシンのパフォーマンス特性に基づいて、生成するネイティブコードを最適化できます。従来のコンパイラは、これを実行できません。それらが生成するコードが最終的に実行されるマシンがわからない。

また、 ngenと呼ばれるツールを使用して、アセンブリを「事前にJITする」ことができます。このプロセスでは、アセンブリが実行されてディスクにキャッシュされる前に、ネイティブコードがILからコンパイルされます。これにより、実行時にJITのオーバーヘッドが発生しなくなります。

于 2009-01-17T04:54:33.043 に答える
1

短い答え(2番目の質問に対する):はい。これは、共通言語ランタイム(CLR)と呼ばれます。

フレームワークの簡単な概要は、ウィキペディアで入手できます:http: //en.wikipedia.org/wiki/.NET_Framework#Architecture

于 2009-01-17T04:22:53.043 に答える
1

.NETプログラムをコンパイルすると、IL(中間言語)にコンパイルされます。ILはアセンブリ言語と非常によく似ています。次に、そのILは、実行時にJIT(Just In Time)コンパイラーを介してネイティブコードに変換されます。

だから、あなたの質問に答えるために、はい、いいえ。コンパイラーはネイティブコードを発行しませんが、アプリケーションの実行時にネイティブコードに変換されるILを発行します。

于 2009-01-17T04:24:42.010 に答える
0

まあ、少なくともモノラルでは、マネージアセンブリの代わりにネイティブコードを生成できることを私は知っています。これを実行できるWindows用のOpenSourceツールもあると思います。

于 2009-01-17T04:32:59.823 に答える
0

それが「コンパイルされた」かどうかを尋ねるのに注意する必要があると思います。これは、出力される結果が「ネイティブコード」でなければならないことを意味すると想定します。これは「コンパイル済み」の意味ではありません。

「一般的に、最初の翻訳者が単純な場合、言語は「解釈される」と言います。翻訳者が複雑な場合、言語は「コンパイルされた」と言います。「単純」と「複雑」は主観的な用語であるため、区別が混乱する可能性があります。 、そしてコンパイラが複雑な仮想マシン(インタプリタ)によって実行されるコードを生成する可能性があるため...これらの2つの特性(徹底的な分析と重要な変換)は、コンパイルの特徴です。」

MichaelL.Scottによる「ProgrammingLanguagePragmatics」から。奇妙なことに、これはプログラミング言語理論の教科書で、今日の午後、その引用を開いたページでたまたま読んでいました。

つまり、はい、C#およびその他の.NET言語はCLR実行され、コンパイルされます。

于 2009-01-17T04:34:15.407 に答える
0

C ++は、ILにコンパイルする必要のない1つの.Net言語ですが、このオプションを選択した場合、.Netからの.NET参照またはコードを使用することはできません。

他に調べるべきことは、c dragonが指摘したことです-ngen.exeは、多くの.Netウィンドウ/コンソールベースのアプリケーションに対していくつかの注目すべき改善をもたらす可能性があります。

于 2009-01-17T05:10:03.290 に答える
0

実行時に、コンパイラは中間言語コードであるILコードを生成し、JITコンパイラによってネイティブコードに変換されます

于 2009-04-16T09:47:48.997 に答える