116

新しいMicrosoft Roslynに関する InfoWorld の昨日のプレス リリースから:

この種の「分解された」コンパイラの最も明らかな利点は、コンパイルと実行のプロセス全体を .Net アプリケーション内から呼び出すことができることです。Hejlsberg は、いくつかのコード スニペットを文字列として C# コンパイラに渡す C# プログラムのデモを行いました。コンパイラは、結果の IL アセンブリ コードをオブジェクトとして返し、それが実行のために共通言語ランタイム (CLR) に渡されました。ほら!Roslyn を使用すると、C# は実行時にコードを生成して呼び出す動的言語の機能を獲得します。

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

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

4

5 に答える 5

251

免責事項:私はマイクロソフトのRoslynチームで働いています。

CodeDomはRoslynの前身ですが、関連性はごくわずかです。基本的に、CodeDomは、デザイナー(WinForms)をサポートするために.NET 1.0で追加されたコードを生成するための、単純で(ある程度)言語にとらわれない方法です。CodeDomは、C#、VB、およびその他の言語でコードを生成できる統合モデルを提供する試みであったため、サポートするどの言語とも高い忠実度を欠いています(そのため、CodeDomでswitchステートメントを作成することはできません)。CSharpCodeProvider.CompileAssemblyFromSourceは、csc.exeを実行するための単なるラッパーです。

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

コンパイラパイプラインの各コンポーネントを構築する際に、パブリックAPIを公開しました。

  • パーサー->構文ツリーAPI
  • シンボルテーブル/メタデータのインポート->シンボルAPI
  • バインダー->バインディングおよびフロー分析API
  • ILエミッター->EmitAPI

Roslynは、洗練されたC#およびVBソースコードジェネレーターとして使用できますが、CodeDomとの類似点はここで終わります。RoslynコンパイラAPIを使用して、コードの解析、セマンティック分析の実行、コードの動的なコンパイルと評価などを行うことができます。

Roslynチームは、コンパイラーに加えて、パブリックコンパイラーAPIのにVisual Studio C#およびVBIDE機能を再構築しています。そのため、コンパイラAPIは、IntelliSenseやExtractMethodリファクタリングなどのVisualStudioデザインタイムツールを構築するのに十分な機能を備えています。また、コンパイラの上のレイヤーで、Roslynはより高いレベルの分析またはデータ変換のためのサービスを提供します。たとえば、C#およびVBの書式設定ルールを使用してコードを書式設定したり、ソリューション内の特定のシンボルへのすべての参照を検索したりするためのサービスがあります。

実際、CodeDomに対するRoslynの特別なメリットは1つだけではありません。CodeDomが非常に具体的なコード生成のニーズを満たした場合、Roslynは、考えられるほぼすべての種類のC#またはVB言語ツールを構築できるフレームワークを提供することにより、言語ツールの分野全体に取り組んでいます。

于 2011-10-21T20:06:08.270 に答える
44

CodeDom を使用するとコンパイルできますが、コード自体に関する情報を実際に取得することはできません (コンパイラ エラー以外)。基本的に、これは「これをコンパイルしてください」と言うと、「成功しました」または「失敗しました。ここにいくつかのエラーがあります」と表示されるブラックボックスです。

Roslyn を使用すると、その場でコードを完全に検査してビルドすることができます。これには、ソース コードの一部内のコメントを表示/検査できること、完全な構造に関する詳細情報などが含まれます。Roslyn に渡すソースの構文ツリー全体を調べて取得し、詳細な分析を行うことができます。またはその上の変換。

完全で豊富な構文情報があれば、非常に多くの制御と柔軟性が得られます。これは、たとえば、C# コードのブロックをコピーして VB.NET コードとして貼り付けるサンプルのしくみです。Roslyn を使用すると、コンパイルするだけでなく、コード自体をきれいに操作することもできます。これにより、ツールがメタ情報 (コメントなど) を含む完全な構文を理解し、それを直接操作できるため、リファクタリングなどを非常に簡単に行うことができるため、多くのツールの生成がはるかに簡単になります。

于 2011-10-21T17:21:51.743 に答える
12

大きな違いの 1 つは、CodeDom を使用すると、C# または VB.NET をコンパイルするたびにアウト プロセスで実行されることです。CSC.exe または VBC.exe は、舞台裏の実際のワーカーです。

アーキテクチャ、スケーラビリティ、分離などの観点からサービスを構築したい場合 (Azure に言及しています)、これはあまり良くありません。

Roslyn では進行中です。

これが「サービスとしてのコンパイラ」と呼ばれる理由の 1 つだと思います。

また、CodeDom は比較的貧弱な API であり、多くの機能が欠落しており、最新のものではありません。主に Visual Studio UI デザイナーの自動コード生成をサポートするように設計されているためです。Roslyn は、コンパイラを書いている人たちによって書かれているので、はるかにうまくいくと思います。それが違いを生むことを願っています。

PS: CSC.exe および VBC.exe との顕著な違いの 1 つ: Roslyn は純粋な .NET のようです (そしてCCIを使用しています)。

于 2011-10-21T17:44:11.383 に答える
8

Roslyn を使用すると、プロセス全体をより細かく制御できます。たとえば、文字列を分析し、追加のコードを生成することもできます (分析に基づいてコンパイル プロセス内でオンザフライで)。

CodeDom は「コンパイラを使用するだけ」ですが、Roslyn は「(サブ) パーツに完全にアクセスできるサービスとしてのコンパイラ」です。現在不可能な方法で物事を変えることができます。

たとえば、Roslyn を使用して C# を拡張できます。これは非常に便利で、AOP 実装の現在の状態よりもはるかに優れています。

Roslyn の現在の状態と、Roslyn が提供するさまざまなレベルのアクセスと制御の概要については、http://msdn.microsoft.com/en-us/hh500769を参照してください。

アップデート

Microsoft は、追加機能と多くの API の変更/追加を備えた新しい CTP を利用できるようにしました。詳しくはこちらをご覧ください

于 2011-10-21T17:23:35.377 に答える