Comments 16
АСД
Антисептик-стимулятор Дорогова? Пожалуйста, никогда, не называйте так AST.
AST (Association of Surgical Technologists — первое что выдал google.com)?
Но если вы считаете что термин на русском мало употребляемый, согласен на вариант АСД (AST).
А вообще при написании статьи меня сильно мучил вопрос — «Какие термины стоит переводить, а какие нет?». Голосовалку бы устроить…
Но если вы считаете что термин на русском мало употребляемый, согласен на вариант АСД (AST).
А вообще при написании статьи меня сильно мучил вопрос — «Какие термины стоит переводить, а какие нет?». Голосовалку бы устроить…
Как же Roslyn? Почему про него даже во введении нет?
Еще не рассмотрены, помимо Roslyn (хотя он пока не зарелизился), как минимум:
Common Compiler Infrastructure (http://ccimetadata.codeplex.com/)
Mono.Cecil (http://www.mono-project.com/Cecil)
Common Compiler Infrastructure (http://ccimetadata.codeplex.com/)
Mono.Cecil (http://www.mono-project.com/Cecil)
Да, упомянуть про них стоило. Но я писал только про то, с чем работал.
Roslyn мне всегда казался более инструментом для анализа кода, чем для его генерации. Хотя генерировать он может. Но опыта работы с ним у меня нет, поэтому сказать насколько он удобен и производителен я не могу. И он CTP.
Common Compiler Infrastructure действительно предлагает удобные вещи, но я про него не знал. Опять же нет опыта использования, следовательно я только могу пересказать документацию (а я не очень люблю статьи типа «Я пересказал страничку overview своими словами»).
Mono.Cecil тоже не знал и тоже нет опыта.
Roslyn мне всегда казался более инструментом для анализа кода, чем для его генерации. Хотя генерировать он может. Но опыта работы с ним у меня нет, поэтому сказать насколько он удобен и производителен я не могу. И он CTP.
Common Compiler Infrastructure действительно предлагает удобные вещи, но я про него не знал. Опять же нет опыта использования, следовательно я только могу пересказать документацию (а я не очень люблю статьи типа «Я пересказал страничку overview своими словами»).
Mono.Cecil тоже не знал и тоже нет опыта.
Для чего всё это нужно и где это может пригодиться?
Самый распространенный вариант — динамический вызов конструкторов и установка значений при написании ORM или InversionOfControl фреймворков.
Генерация proxy-классов (для любых целей), автоматическая реализация интерфейсов для дополнительных оберток с некоторой AOP-логикой, генерация всяческого шаблонного кода (для всяческих фреймворков), duck-typing. Почти все это можно сделать и используя компиляцию (CodeDom), но Reflection.Emit молниеносно быстр, что зачастую вполне его оправдывает.
Я использовал этот подход для генерации сериализаторов игровых классов для передачи по сети.
У игровых классов атрибутами помечены те поля, которые сериализуются и отмечено как они сериализуются — само значение или его дельта, double передается как fixed-int или fixed short и т.п.
При старте игры генерились сериализаторы индивидуальные, а потом уже в программе вызывались.
У игровых классов атрибутами помечены те поля, которые сериализуются и отмечено как они сериализуются — само значение или его дельта, double передается как fixed-int или fixed short и т.п.
При старте игры генерились сериализаторы индивидуальные, а потом уже в программе вызывались.
Еще как вариант при написании слабых событий очень полезно, что бы не использовать тормозную рефлексию при каждом вызове.
Еще добавлю, что использование Reflector'а (или dotPeek'а) совершенно неоценимо. Пишем обычный код, компилируем его, смотрим, что получается в итоге, и делаем похожим образом, не выдумывая свою последовательность CIL-инструкций.
Sign up to leave a comment.
Генерируем на .Net