Почему внедрение кода после компиляции лучше, чем внедрение кода перед компиляцией? - PullRequest
5 голосов
/ 06 февраля 2010

Итак, мы все знаем, что в C # нет C-подобного препроцессора макросов (и есть хорошая мысль о том, почему здесь ). Но теперь, когда AOP набирает обороты, кажется, что мы начинаем делать вещи с постпроцессорами, которые мы привыкли делать с препроцессорами (имейте в виду, что я только промокаю ногами от PostSharp так что я, возможно, не в базе).

Я большой поклонник атрибутов в C #, но если препроцессор был исключен по уважительным причинам (что, как бывший пользователь MFC, я все еще сомневаюсь, но тем не менее принимаю), почему внедрение кода после компиляции является лучшей идеей чем внедрение кода перед компиляцией?

Ответы [ 4 ]

6 голосов
/ 13 февраля 2010

Причины, по которым я выбрал посткомпиляцию при разработке PostSharp 5 лет назад:

  1. Языковой агностицизм.
  2. MSIL имеет более стабильные спецификации по сравнению с языками высокого уровня (которые обновляются каждые два года).
  3. В большинстве случаев MSIL - это уровень абстракции, который вам нужен при работе с аспектами. Вам не нужно знать все эквивалентные конструкции (подумайте f 'using' и 'try-finally').
  4. До 2008 года никому не удавалось создать достойный компилятор C #. Трудности, с которыми столкнулся Моно, были достаточно внушительными, даже если они уже наверстали упущенное.
  5. Работа с двоичным файлом казалась намного быстрее, чем работа с исходным кодом.
  6. Работа с бинарной сборкой позволяет выполнить ее - обрабатываемая сборка может трансформироваться сама. Это было неслыханно до того, как был выпущен PostSharp Laos.

Тем не менее, реализации AOP для C / C ++ действительно являются прекомпилятором (WeaveC), а реализации в Java являются расширением компилятора (по уважительной причине, что существует множество реализаций OSS компилятора Java).

-gael

4 голосов
/ 06 февраля 2010

Технически, в C # встроена опция предварительной компиляции для Visual Studio: Инструментарий преобразования текстовых шаблонов (T4) . Это позволяет вам делать довольно удивительные вещи на этапе предварительной компиляции и является основой для многих продуктов, таких как некоторые ORM и т. Д.

2 голосов
/ 06 февраля 2010

Это просто проще. IL это чертовски легко разбирать, чем исходный код C #. И это не зависит от языка.

2 голосов
/ 06 февраля 2010

Если бы вы делали предварительную компиляцию, вам пришлось бы интерпретировать исходные файлы со всех поддерживаемых вами языков, а затем сгенерировать код на этом языке, прежде чем он будет передан компилятору. С помощью постобработки вы можете просто использовать отражение, чтобы проверить сборки, независимо от того, был ли исходный язык C #, Visual Basic или любой другой.

...