C#コンパイラはどの言語で書かれていますか?


148

私は、ソースコードを見てhttp://referencesource.microsoft.com/、すべてのソースコードは、C#である表示されます。

新しいC#コンパイラプラットフォーム(Roslyn)のソースコードも確認しましたが、これもC#に含まれています。そんなことがあるものか?C#言語コンパイラはC#で記述されていますか?それとも私は明白な何かを見逃していますか?C#コンパイラがC#で記述されている場合、どのように機能しますか?


12
多くのコンパイラは、コンパイルする言語で記述されています-詳細については、Google ブートストラップをご覧ください。
Paul Roub、2014

19
オリジナルのコンパイラはC ++で書かれたと思います。
PoweredByOrange 2014

44
さて、ハンマーは別のハンマーを使用して偽造することができます。以前のバージョン...
Eugene Sh。

10
投稿したリンクは、コンパイラーではなく、フレームワークライブラリのソースコードへのリンクです。
Steve

回答:


229

オリジナルのC#コンパイラはC#で作成されたのではなく、CおよびC ++で作成されました。新しいRoslynコンパイラはC#で作成されましたが、最初は古いコンパイラでコンパイルされていました。新しいコンパイラが完了すると、独自のソースコードをコンパイルすることができました。これは、ブートストラップと呼ばれます。


2
したがって、「元のコンパイラ」に変更を加える必要がある場合、それを古いコンパイラ(C、C ++で作成)でコンパイルする必要がありますか?
CriketerOnSO

10
「元のコンパイラ」を変更する必要はありません。新しいバージョンは変更されます
偽名

1
@CriketerOnSO、新しいコンパイラが古いコンパイラを置き換えるため、古いコンパイラを変更する必要はありません。しかし、MSがそれを実行したい場合、以前と同様に、古いコンパイラをC ++コンパイラで再コンパイルします。
トーマス・レベスク2014

3
@ThomasLevesqueセルフホスティングは、ブートストラップの最終結果です。
arx 2014

2
@SriramSakthivel、コンパイラのコードは新しいキーワードを使用できません。少なくとも、それらを理解するコンパイラがあるまでは。新しいバージョンを作成するには、常に古いバージョンのコンパイラを使用します。
トーマスレベスク2015

32

コンパイラはユーティリティプログラムです。プログラミング言語のテキストをマシンコードに変換します。プログラミング言語がたまたまコンパイラーであるソフトウェアを記述している場合...

コンパイラーは、他のアーキテクチャー用のマシンコードを生成することもできます。たとえば、AppleはIntelベースのサーバーのラックを使用してiOSをコンパイルします。コンパイラは、生成するARMコードを実行する必要はなく、ディスクに書き込むだけです。

コンパイラ2.0は、コンパイラ1.0が処理できる言語で作成する必要がありますが、最適化などの新しい機能を備えたコンパイラ2.0を確実に作成できます。その後、コンパイラ2.0を使用してソースコードを再コンパイルし、それ自体のより良いバージョンを作成できます。繰り返しになりますが、コンパイラは自分自身の別のバージョンを作成していることを知りません。

時の流れに十分に戻ると、コンパイラーがない状態、つまり高水準言語の最初の反復に到達します。次に、鉛筆とオペコードの本を取り出して、最初の本を組み立てる必要があります。最初のアセンブラをどのように作成しましたか?機械コードを直接入力します。おそらくパンチされた紙テープ、またはフロントパネルのスイッチを切り替えます。


9
そして、紙テープは紙の穴を介してスイッチを弾くだけです。:-)
Zan Lynx 2014

2
ストレージ技術としての紙テープは決して離陸しません。これは複雑すぎてエラーが発生しやすく、さらに、リーダーに短絡があると簡単に燃え、プログラムが完全に破壊されます。
CVn 2014

16

コンパイラは、他のプログラムと同じように、単なるプログラムです。魔法や特別なことは何もありません。それはいくつかの入力を取り、いくつかの出力を生成します。この特定のケースでは、入力はたまたまC#であり、出力はたまたまCILですが、それは一連の納税申告である入力とレポートである出力との違いはありません。


10
それは異なります-それははるかに簡単です、-)。
ピーター-モニカの復活14

3
@PeterSchneider:コンパイラーを神秘的な魔法の生き物としてキャストするのが好きですが、結局のところ、これらは入力を出力に変換するプログラムにすぎません。地球上のほとんどすべてのプログラムは、いくつかの入力を解析し、それを理解しようとし、それをいくつかの出力に変換します。ある意味で、すべての入力はある言語で書かれたプログラムであり、すべてのプログラムはコンパイラーです。
イェルクWミッターク

3
私はこれ以上同意できませんでした。私が言いたかったのは、税法はひどい混乱であるということです。対照的に、形式言語は通常、自動化に適した方法で適切に定義されています。これにより、単純なコンパイラーは、税金を扱うプログラムよりも間違いなく簡単に記述できます。Eric LippertはCRTコンパイラについては意見を異にするかもしれませんが、cf。blogs.msdn.com/b/ericlippert/archive/2010/02/04/…。ワンパスCコンパイラから長い道のりを歩んできました。
ピーター-モニカの復活14

1
@PeterSchneider:ああ、申し訳ありませんが、私は180で、あなたのコメントを誤解°:-Dを
イェルクWミッターク

この回答はOPの考えに最も直接対応しているので、この回答が一番好きです。「強力な」コンパイラを取り巻く霧を取り除きます。
Assaf Levy 2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.