1. ホーム
  2. .net

[解決済み] Microsoft RoslynとCodeDomの比較

2022-05-15 17:54:39

質問

からの プレスリリース は、昨日 InfoWorld で発表された新しい マイクロソフト Roslyn :

<ブロッククオート

この種の "deconstructed"コンパイラの最も明白な利点は この種のコンパイラの最も明白な利点は、コンパイルと実行の全プロセスを から呼び出せることです。Hejlsberg 氏は、以下のような C# プログラムを実演しました。 Hejlsbergは、C#コンパイラにいくつかのコードスニペットを文字列として渡すと、コンパイラがその結果のILアセンブリコードとして コンパイラは結果のILアセンブリコードをオブジェクトとして返し、それを その結果、コンパイラはILアセンブリコードをオブジェクトとして返し、それをCLR(Common Language Runtime)に渡して実行させる。ほらね で Roslynにより、C#は動的言語として実行時にコードを生成して呼び出すことができるようになりました。 コードを実行時に生成して呼び出すという動的言語の機能を C# は獲得しました。

.NET 4 のリリース以来、このようなことができるようになったのは CSharpCodeProvider.CompileAssemblyFromSource このプロジェクトでは、ユーザーがテキスト ボックスにコードを入力し、参照するアセンブリ/名前空間を選択し、そのコードからの出力をオンザフライで実行して表示し、Windows Azure でのライブ環境のコード テストに使用することができます。

CodeDom はRoslynの一部/前身ですか? Roslynの特別な利点は何ですか? CodeDom ?

どのように解決するのですか?

免責事項 : 私はMicrosoftのRoslynチームで働いています。

CodeDomはRoslynの前身ですが、わずかな関連性しかありません。本質的に、CodeDom はシンプルで言語に依存しないコード生成方法であり、デザイナーをサポートするために .NET 1.0 で追加されました (WinForms のようなものです)。CodeDomは、C#、VB、その他の言語でコードを生成できる統一されたモデルを提供する試みであったため、サポートするどの言語に対しても高い忠実度を欠いています(CodeDomでswitch文が作成できないのはそのためです)。CSharpCodeProvider.CompileAssemblyFromSourceは、単にcsc.exeを実行するためのラッパーに過ぎません。

Roslynは完全に別物です。C# は C# で、VB は VB で、C# と VB コンパイラーをマネージド コードで一から書き直しました (現在出荷されているバージョンの csc.exe と vbc.exe はネイティブ コードで記述されています)。マネージド コードで構築する利点は、ユーザーが .NET アプリケーションからライブラリとして実際のコンパイラを参照できることです (ラッパは必要ありません)。

コンパイラー パイプラインの各コンポーネントを構築しながら、その上に公開 API を公開しました。

  • パーサ -> シンタックスツリーAPI
  • シンボルテーブル/メタデータインポート -> Symbol API
  • バインダー -> バインダーとフロー解析のAPI
  • エミッタ -> エミッタAPI

Roslynは洗練されたC#およびVBソースコードジェネレーターとして使用できますが、CodeDomとの類似性はそこで終わっています。Roslyn コンパイラー API は、コードの解析、意味解析、コードの動的なコンパイルと評価などに使用することができます。

コンパイラーに加えて、Roslyn チームは Visual Studio C# および VB IDE 機能の再構築も行っています。 上に を再構築しています。つまり、コンパイラー API は IntelliSense や Extract Method リファクタリングのような Visual Studio デザインタイムツールを構築するのに十分なリッチさを持っています。また、コンパイラの上のレイヤーでは、Roslynはより高度な解析やデータ変換のためのサービスを提供しています。たとえば、C#とVBのフォーマット規則を使用してコードをフォーマットするサービスや、ソリューション内の特定のシンボルへのすべての参照を検索するサービスがあります。

本当に、単に 1 つ Roslyn が CodeDom を超える特別な利点はありません。CodeDom が非常に特殊なコード生成のニーズを満たしたのに対し、Roslyn は思いつく限りのあらゆる種類の C# または VB 言語ツールを構築できるフレームワークを提供することにより、言語ツール空間全体を対象としています。