[解決済み] Microsoft RoslynとCodeDomの比較
質問
からの プレスリリース は、昨日 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 言語ツールを構築できるフレームワークを提供することにより、言語ツール空間全体を対象としています。
関連
-
[解決済み] Could not find a part of the path ... binroslyncsc.exe
-
[解決済み] app.configのマッピングがないアセンブリのapp.configの再マッピングを考慮する。
-
[解決済み] データテーブルの並べ替え
-
[解決済み] ネットワークの位置からアセンブリをロードすることはできません
-
[解決済み] ファイルまたはアセンブリをロードできませんでした 操作がサポートされていません。(HRESULT: 0x80131515 からの例外)
-
[解決済み] LINQ: フィルタリング基準で SingleOrDefault と FirstOrDefault() を使用する場合
-
[解決済み] Powershell v3 Invoke-WebRequest HTTPSエラー
-
[解決済み] WCFのデバッグ時にサーバーに自動的に踏み込むことができない
-
[解決済み] Microsoft Officeをインストールせずに、C#でExcel(.XLSおよび.XLSX)ファイルを作成するにはどうすればよいですか?
-
[解決済み] .Any() vs .Count() > 0のどちらのメソッドがより良いパフォーマンスを発揮しますか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】WCFとは何か、何ができるのか?
-
[解決済み] NetFx45WebLinkとNetFx45RedistLinkの違いは何ですか?
-
[解決済み] 24:00:00 を超える値を持つ .Net Timespan を格納するための正しい SQL タイプは何ですか?
-
[解決済み] CryptographicException「キーセットが存在しない」、ただしWCF経由に限る
-
[解決済み] 実際のサービスはデータを返すのに、なぜWebServiceはnullを返すのですか?
-
[解決済み] app.configが作成されるタイミングとapp.exe.configが作成されるタイミング、その違いとは?
-
[解決済み] .NETにおけるstructとclassの違いは何ですか?
-
[解決済み] RelativeSourceでWPFバインディングを使用するにはどうしたらいいですか?
-
[解決済み] MemoryStreamから文字列を取得する方法は?
-
[解決済み] Visual Studioの「Any CPU」ターゲットはどういう意味ですか?