私は、ソースコードを見てhttp://referencesource.microsoft.com/、すべてのソースコードは、C#である表示されます。
新しいC#コンパイラプラットフォーム(Roslyn)のソースコードも確認しましたが、これもC#に含まれています。そんなことがあるものか?C#言語コンパイラはC#で記述されていますか?それとも私は明白な何かを見逃していますか?C#コンパイラがC#で記述されている場合、どのように機能しますか?
私は、ソースコードを見てhttp://referencesource.microsoft.com/、すべてのソースコードは、C#である表示されます。
新しいC#コンパイラプラットフォーム(Roslyn)のソースコードも確認しましたが、これもC#に含まれています。そんなことがあるものか?C#言語コンパイラはC#で記述されていますか?それとも私は明白な何かを見逃していますか?C#コンパイラがC#で記述されている場合、どのように機能しますか?
回答:
オリジナルのC#コンパイラはC#で作成されたのではなく、CおよびC ++で作成されました。新しいRoslynコンパイラはC#で作成されましたが、最初は古いコンパイラでコンパイルされていました。新しいコンパイラが完了すると、独自のソースコードをコンパイルすることができました。これは、ブートストラップと呼ばれます。
コンパイラはユーティリティプログラムです。プログラミング言語のテキストをマシンコードに変換します。プログラミング言語がたまたまコンパイラーであるソフトウェアを記述している場合...
コンパイラーは、他のアーキテクチャー用のマシンコードを生成することもできます。たとえば、AppleはIntelベースのサーバーのラックを使用してiOSをコンパイルします。コンパイラは、生成するARMコードを実行する必要はなく、ディスクに書き込むだけです。
コンパイラ2.0は、コンパイラ1.0が処理できる言語で作成する必要がありますが、最適化などの新しい機能を備えたコンパイラ2.0を確実に作成できます。その後、コンパイラ2.0を使用してソースコードを再コンパイルし、それ自体のより良いバージョンを作成できます。繰り返しになりますが、コンパイラは自分自身の別のバージョンを作成していることを知りません。
時の流れに十分に戻ると、コンパイラーがない状態、つまり高水準言語の最初の反復に到達します。次に、鉛筆とオペコードの本を取り出して、最初の本を組み立てる必要があります。最初のアセンブラをどのように作成しましたか?機械コードを直接入力します。おそらくパンチされた紙テープ、またはフロントパネルのスイッチを切り替えます。
コンパイラは、他のプログラムと同じように、単なるプログラムです。魔法や特別なことは何もありません。それはいくつかの入力を取り、いくつかの出力を生成します。この特定のケースでは、入力はたまたまC#であり、出力はたまたまCILですが、それは一連の納税申告である入力とレポートである出力との違いはありません。