2011-10-21 10 views
94

対新しいMicrosoft RoslynについてのInfoWorldのpress release昨日から:マイクロソフトロスリンのCodeDOM

「解体」のこの種の最も明白な利点コンパイラは、それが全体のコンパイル、実行プロセスがあることを可能にするということである .Netアプリケーション内で から呼び出されます。 Hejlsbergは、 がC#コンパイラにいくつかのコードスニペットを文字列として渡したC#プログラムを示しました。コンパイラ は結果として生成されたILアセンブリコードをオブジェクトとして返し、実行のために共通言語ランタイム(CLR)に渡された でした。 Voilà! Roslynを使用すると、実行時に コードを生成して呼び出す動的言語の能力がC#で得られます。ユーザーがにコードを入力することができます - 私はまさにそのしばらく前に書かれたASP.Netプロジェクトにおける実際の使用でCSharpCodeProvider.CompileAssemblyFromSourceと.NET 4のリリース以降、これを行うことができました

テキストボックスを開き、参照するアセンブリ/名前空間を選択し、Windows Azure上のライブ環境コードテストのためにオンザフライでそのコードの出力を実行して表示します。

CodeDomローズリンの前処理者の一部ですか? Roslynの特別なメリットはCodeDom以上ですか?

答えて

215

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

CodeDomはRoslynの先駆けですが、わずかに関連しています。本質的に、CodeDomは、.NET 1.0で追加されたコードを生成するためのシンプルで(幾分)挑戦的な方法であり、設計者(WinForms)をサポートします。 CodeDomは、C#、VB、およびその他の言語でコードを生成できる統一モデルを提供しようとしていたため、サポートしている言語のいずれにも忠実ではありません(CodeDomでswitch文を作成できません)。 CSharpCodeProvider.CompileAssemblyFromSourceは、単にcsc.exeを実行するラッパーです。

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

コンパイラパイプラインの各コンポーネントを構築する際には、我々は上に公開APIを公開しました:

  • パーサ - >構文木API
  • シンボルテーブル/メタデータのインポート - >シンボルのAPI
  • バインダー - >
  • ILエミッタ結合すると、フロー分析のAPI - >エミットAPI

ロスリンは、洗練されたC#のAとして使用することができますVBソースコードジェネレータがありますが、これがCodeDomとの類似点です。 Roslyn Compiler APIは、コードの解析、意味解析の実行、コードの動的コンパイルと評価などに使用できます。

Roslynチームは、パブリックコンパイラAPIの先頭にあるのVisual Studio C#とVB IDEの機能も再コンパイルしています。したがって、コンパイラAPIは、IntelliSenseやExtract MethodリファクタリングなどのVisual Studioのデザイン時ツールを構築するのに十分な豊富さを備えています。また、コンパイラの上層にあるRoslynは、より高度な分析やデータ変換のためのサービスを提供しています。たとえば、C#およびVBの書式設定規則を使用してコードを書式設定するサービスや、ソリューション内の特定のシンボルへの参照をすべて検索するサービスがあります。

実際には、の1つだけではありません。CodeDomよりRoslynの特別な利点があります。 CodeDomが非常に特定のコード生成の必要性を満たす場合、Roslynは考えることのできるC#またはVB言語ツールを構築するためのフレームワークを提供することで、言語ツール空間全体に取り組んでいます。

+2

@Dustin:Roslynは他の言語をサポートしますか?例えばJavaScript(.NET)? – dbarros

+0

@Dustin:これは、私の組織でコード品質を強化する完全なIDEエクスペリエンスを構築するのに最適ですが、手動コードレビューの完全な置き換えは見当たりませんが、かなりの品質向上が見られます。すぐに! –

+0

誰かがRoslynベースのツールを作成してCodeDomを使用するコードをRoslynのSyntaxFactoryを使用するコードに変換していれば素晴らしいと思います(一部は.Net CoreがRoslynを持っていますがCodeDomはなく、 CodeDom) – Emyr

40

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

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

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

6

ロスリンは、全体のプロセスのはるかに細かく制御できます - あなたは、文字列を解析し、(分析に基づいて、コンパイルプロセス内でオンザフライ)にも追加のコードを生成することができ、たとえば、などを

のCodeDOM Roslynは "(サブ)パーツへの完全なアクセスを持つサービスとしてのコンパイラ" ... Roslynとはあなたが "コンパイラの内部"にあり、コンパイラの観点から見たコードを見ることができます現在不可能な方法で物事を変えてください。

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

現在ロザリンの状態の概要とアクセスのさまざまなレベルについては、それが提供するコントロール、MicrosoftはちょうどAPIの追加機能とたくさんの新しいCTPを利用可能にhttp://msdn.microsoft.com/en-us/hh500769

UPDATE

を見ます変更/追加。詳細はhereを参照してください。

+1

実際には、Roslynを使用してC#を追加のキーワードで拡張することはできません。 –

+0

ありがとう...修正されました...最初のリリースではありませんが、これは可能になると思います... – Yahia

+2

@DustinCampbell、疑似キーワードがコードを生成することによって発生したコンパイルエラーを処理した場合はどうなりますか? –

9

大きな相違点:CodeDomでは、C#またはVB.NETをコンパイルするたびに処理が途切れることがあります。 CSC.exeまたはVBC.exeは現場の真の労働者です。

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

Roslynでは処理中です。

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

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

PS:CSC.exeとVBC.exeとの大きな違いは次のとおりです。Roslynは純粋な.NETのようです(CCIを使用しています)。

関連する問題