82

これについては、多くの矛盾する情報があります。C# はコンパイルされていると言う人もいますが (IL にコンパイルされ、実行時にネイティブ コードにコンパイルされるため)、.NET が必要なため解釈されると言う人もいます。ENウィキは次のように述べています。

多くのインタープリター型言語は、最初に何らかの形式の仮想マシン コードにコンパイルされ、実行時にネイティブ コードに解釈またはコンパイルされます。

だから私はかなり混乱しています。誰かがこれを明確に説明できますか?

4

13 に答える 13

81

C# は、c# コンパイラによって IL にコンパイルされます。

この IL は、必要に応じて、ホスト マシンのネイティブ アセンブリ言語にジャスト イン タイム (JIT) でコンパイルされます。ただし、代わりに IL を解釈する .NET ランタイムを作成することは可能です。これが行われたとしても、c# はコンパイル済み言語であると主張します。

于 2012-01-12T15:13:53.937 に答える
47

純粋にコンパイルされた言語には、いくつかの利点があります。原則として、速度、および多くの場合、作業セットのサイズ。純粋に解釈された言語にはいくつかの利点があります。その場で編集できるようにする明示的なコンパイル段階を必要としないという柔軟性と、多くの場合、移植性が容易になります。

この場合、ジット言語は中間に位置します。

これこそが、私たちが獲得したいと考えている測定基準のどの位置に応じて、またどちらかに対する偏見に応じて、jitted 言語をコンパイルされたものまたは解釈されたものと考える理由です。

C# は、ASP.NET の場合と同様に、最初の実行時にコンパイルすることもできます。これにより、その場合はインタープリターに近くなります (ただし、この場合はまだ IL にコンパイルされてから jit されます)。確かに、この場合は (従来の ASP で使用される VBScript や JScript と比較して) 解釈された場合のほとんどすべての利点と、コンパイルされた場合の多くの利点があります。

厳密には、どの言語も、言語としてジット、解釈、またはコンパイルされていません。C# をネイティブ コードに NGen できます (ただし、アセンブリを動的にロードするようなことを行う場合は、引き続き IL と jitting を使用します)。C または C++ のインタプリタを作成できます (何人かがそうしています)。ただし、最も一般的な使用例では、C# は IL にコンパイルされてからジットされます。これは、インタープリターまたはコンパイルの古典的な定義ではありません。

于 2012-01-12T15:42:47.983 に答える
20

意見に基づくセマンティクスとステートメントが多すぎます。

まず、C# はインタープリター言語ではありません。CLR と JVM は「ランタイム」または「ミドルウェア」と見なされますが、同じ名前が Perl などに適用されます。これは、名前に関心のある人々の間で多くの混乱を引き起こします。

ランタイムを参照する「インタープリター」という用語は、通常、既存のコードが非ネイティブ コードを解釈することを意味します。2 つの大きなパラダイムがあります。解析では生のソース コードを読み取り、論理的なアクションを実行します。バイトコードの実行では、最初にコードを非ネイティブのバイナリ表現にコンパイルします。これにより、解釈に必要な CPU サイクルがはるかに少なくなります。

Java はもともとバイトコードにコンパイルされ、次にインタープリターを通過しました。現在、JVM はバイトコードを読み取り、それをジャストインタイムでネイティブ コードにコンパイルします。CIL も同じことを行います。CLR は、ネイティブ コードに対してジャストインタイム コンパイルを使用します。

ソース コードの実行、バイトコードの実行、ネイティブへのコンパイル、ジャスト イン タイム コンパイル、コンパイラを介したソース コードのジャスト イン タイム ネイティブへの実行などのすべての組み合わせを検討してください。言語がコンパイルされているか解釈されているかのセマンティクスは無意味になります。

例として: 多くのインタープリター言語は、ジャストインタイムのバイトコード コンパイルを使用します。C# は CIL にコンパイルされ、JIT はネイティブにコンパイルされます。対照的に、Perl はすぐにスクリプトをバイトコードにコンパイルし、インタプリタを介してこのバイトコードを実行します。C# アセンブリは CIL バイトコード形式でのみ実行できます。生のソース コード形式の Perl スクリプトのみを実行できます。

ジャストインタイム コンパイラは、多くの外部および内部インストルメンテーションも実行します。ランタイムは、さまざまな関数の実行を追跡し、コード レイアウトを調整して、特定の実行フローに合わせて分岐とコード編成を最適化します。つまり、JIT コードはネイティブ コンパイル コード (通常は C++ のように、または IL2CPP を介して実行される C# のように) よりも高速に実行できます。これは、JIT が最適化戦略を実行時にコードの実際の実行ケースに合わせて調整するためです。

コンピュータープログラミングの世界へようこそ。非常に複雑にして、すべてにわかりやすい名前を付けることにしました。目的は、実用的な意味を持たない単語の定義をめぐる炎上戦争を作成することです。

于 2016-01-17T03:05:30.227 に答える
15

If you feel, learned, or are old school, that a compiled EXE is going from source to machine code then C# is interpreted. If you think compiled means converting source code into other code such as byte code, then yes its converted. For me, anything that takes run-time processing to work in the OS it was built for is interpreted.

于 2014-06-27T21:06:01.650 に答える
12

ここを見てください:http://msdn.microsoft.com/library/z1zx9t92

C# で記述されたソース コードは、CLI 仕様に準拠する中間言語 (IL) にコンパイルされます。

(...)

C# プログラムが実行されると、アセンブリが CLR に読み込まれ、マニフェストの情報に基づいてさまざまなアクションが実行される場合があります。次に、セキュリティ要件が満たされている場合、CLR はジャスト イン タイム (JIT) コンパイルを実行して、IL コードをネイティブ マシン命令に変換します。

于 2012-01-12T15:18:09.187 に答える
7

まず、解釈済みとコンパイル済みの定義を理解しましょう。

「コンパイル」(コードを参照する場合)は、コードをある言語から別の言語に翻訳することを意味します。通常、人間が読めるソース コードから、ターゲット プロセッサが処理できるマシン コードに変換します。

「解釈」(コードを参照する場合)は、コードをある言語から別の言語に翻訳することも意味します。しかし、今回は通常、人間が読めるソース コードから中間コードに移行するために使用されます。中間コードは、それをマシン コードに解釈する仮想マシンによって取り込まれます。

明確にするために
ソースコード -> コンパイラ -> マシンコード
ソースコード -> コンパイラ -> バイトコード -> インタプリタ -> マシンコード

理論的には、どの言語も解釈またはコンパイルできます。通常、Java はバイトコードにコンパイルされ、Java 仮想マシンによってマシン コードに解釈されます。C# は通常、別の仮想マシンである共通言語ランタイムである CLR によってコンパイルされるバイトコードに解釈されます。

断然、すべてがマーケティングの仕掛けです。「解釈された」という用語が追加されました (または、少なくとも使用が増えました)。しかし、彼らは単に「コンパイル済み」を使用した可能性があります。違いは、技術的な性質のものではなく、英語とビジネスの傾向の研究です.

于 2012-11-20T20:21:39.890 に答える
4

C#は、その存続期間中に解釈とコンパイルの両方が行われます。C#は、VMによって解釈される仮想言語にコンパイルされます。

混乱は、「コンパイル型言語」のあいまいな概念に起因します。

「コンパイルされた言語」は、ある意味で誤った名称です。コンパイルまたは解釈されたものは、言語のプロパティではなく、ランタイムのプロパティであるためです。

たとえば、Cインタプリタを作成することもできますが、C実装はマシンコードにコンパイルされ、言語はコンパイルを念頭に置いて設計されているため、通常は「コンパイル言語」と呼ばれます。

于 2013-01-20T03:41:57.493 に答える
1

これはかなり古いトピックだと思います。

私の見解では、解釈されたコードはインタープリターを通過し、1 行ずつ変換され、同時に実行されます。javascript の例のように、これは解釈されたコードです。javascript の行でエラーが発生すると、スクリプトは壊れます。

コードをコンパイルしている間、コンパイラを通過し、最初に実行することなく、すべてのコードを一度に別の形式のコードに変換します。実行は別のコンテキストにあります。

于 2017-10-13T03:42:46.003 に答える
0

C# はコンパイル可能な言語です。

たぶん、私もそういう意見に出会ったので、C#言語用のInterpreterがあると思っている人がいるのは、

C# インタープリター コンソール

または、たとえば、有名な

リンクパッド

コードの行だけを記述して実行することができます。これは、 Pythonのような言語であると考えさせられますが、これは真実ではありません。通常のコンパイル可能なプログラミング言語のように (ワークフローの観点から)、これらの行をコンパイルして実行します。

于 2012-01-12T15:25:00.470 に答える
0

C# は、Java と同様に、ハイブリッド言語プロセッサを備えています。ハイブリッド プロセッサは、解釈とコンパイルの両方のジョブを実行します。

于 2015-03-14T18:18:49.070 に答える
0

インタープリターの定義に同意する場合 «コンピューター サイエンスでは、インタープリターとは、プログラミング言語またはスクリプト言語で記述された命令を事前に機械語プログラムにコンパイルする必要なく、直接実行、つまり実行するコンピューター プログラムです。» 疑いの余地はありません。C# はインタープリター言語ではありません。

ウィキペディアの通訳者

于 2017-11-07T08:59:48.067 に答える