5

したがって、C#にはCのようなマクロプリプロセッサがないことは誰もが知っています(そして、その理由については良いスレッドがあります)。しかし、AOPが勢いを増している今、私たちはプリプロセッサで行っていたポストプロセッサで何かを始めているようです(私はPostSharpで足を濡らしているだけなので、おそらくベースから外れていることに注意してください)。

私はC#の属性の大ファンですが、正当な理由でプリプロセッサが除外された場合(以前のMFCユーザーとしてはまだ疑問がありますが、それでも受け入れます)、コンパイル後のコードインジェクションがプリプロセッサよりも優れている理由は何ですか?コンパイルコードインジェクション?

4

4 に答える 4

7

5年前にPostSharpを設計するときにポストコンパイルを選択した理由は次のとおりです。

  1. 言語不可知論。
  2. MSILは、高級言語(2年ごとに重要な更新があります)と比較して、より安定した仕様を持っています。
  3. ほとんどの場合、MSILは、アスペクトを処理するときに必要な抽象化のレベルです。同等の構成をすべて知っている必要はありません(f'を使用して'および'try-finally'を考えてください)。
  4. 2008年以前は、まともなC#コンパイラの作成に成功した人は誰もいませんでした。モノが直面した困難は、たとえ今追いついたとしても、十分に印象的でした。
  5. バイナリの処理は、ソースコードの処理よりもはるかに高速であるように見えました。
  6. バイナリアセンブリを処理すると、それを実行できます。処理中のアセンブリは、それ自体を変換できます。PostSharp Laosが最初にリリースされる前は、前代未聞でした。

とは言うものの、C / C ++用のAOPの実装は確かにプリコンパイラー(WeaveC)であり、Javaでの実装はコンパイラー拡張です(Javaコンパイラーの多くのOSS実装があるという正当な理由のため)。

-ゲール

于 2010-02-13T16:54:12.103 に答える
4

技術的には、Visual Studioに組み込まれているC#の事前コンパイルオプションであるテキストテンプレート変換ツールキット(T4)があります。これにより、コンパイル前のステップで非常に驚くべきことが可能になり、一部のORMなどのかなりの数の製品の基礎になります。

于 2010-02-05T22:32:29.470 に答える
2

事前コンパイルを行う場合は、サポートするすべての異なる言語のソースファイルを解釈し、コンパイラに渡される前にその言語でコードを生成する必要があります。後処理を使用すると、リフレクションを使用して、元の言語がC#、VisualBasicなどであるかどうかをアセンブリで調べることができます。

于 2010-02-05T22:08:35.340 に答える
2

単純です。ILは、C#ソースコードよりも解析が非常に簡単です。そして、それは言語に依存しません。

于 2010-02-05T22:22:51.160 に答える