Подтвердить что ты не робот

Создаете ли вы свои собственные генераторы кода?

Прагматический программист выступает за использование генераторов кода. Создаете ли вы генераторы кода для своих проектов? Если да, для чего вы их используете?

4b9b3361

Ответ 1

Генераторы кода, если они широко используются без правильной аргументации, делают код менее понятным и уменьшают ремонтопригодность (так же, как и динамический SQL). Лично я использую его с некоторыми инструментами ORM, потому что их использование здесь в основном очевидное, а иногда и для таких вещей, как алгоритмы поискового анализатора и анализаторы грамматики, которые в последнее время не поддерживаются "руками". Приветствия.

Ответ 2

В "Прагматическом программисте" Хант и Томас различают генераторы пассивных и активных кодов.

Пассивные генераторы запускаются один раз, после чего вы редактируете результат.

Активные генераторы запускаются как можно чаще, и вы никогда не должны редактировать результат, потому что он будет заменен.

IMO, последние намного более ценны, потому что они приближаются к принципу DRY (Don't-repeat-yourself).

Если входная информация в вашу программу может быть разделена на две части, часть, которая редко изменяется (A) (например, метаданные или DSL), и часть, которая отличается при каждом запуске программы (B) ( живой вход), вы можете написать программу-генератор, которая принимает только входной сигнал A, и записывает специальную программу, которая принимает только вход B. (Другим именем для этого является частичная оценка.)

Программа генератора проще, потому что она должна только пробираться через вход A, а не A и B. Кроме того, он не должен быть быстрым, потому что он не запускается часто, и ему не нужно заботиться о утечке памяти.

Программа ad-hoc быстрее, потому что ей не нужно пробираться через вход, который почти всегда один и тот же (A). Это проще, потому что он должен принимать решения о вводе B, а не A и B.

Хорошая идея, чтобы созданная специальная программа была вполне читаемой, поэтому вы можете легко найти в ней какие-либо ошибки. Как только вы получите ошибки, удаленные из генератора, они исчезнут навсегда.

В одном проекте, над которым я работал, команда разработала сложное приложение базы данных с дизайном с толщиной в два дюйма и длительным графиком реализации, чреватым опасениями о производительности. Написав генератор кода, два человека выполнили эту работу через три месяца, а списки исходного кода (в C) были толщиной около полудюйма, а сгенерированный код был настолько быстрым, чтобы не быть проблемой. Специальная программа была регенерирована еженедельно с минимальными затратами.

Итак, генерация активного кода, когда вы можете его использовать, является беспроигрышной. И, я думаю, это не случайно, что это именно то, что делают компиляторы.

Ответ 3

В аппаратном дизайне это довольно распространенная практика, чтобы сделать это на нескольких уровнях "стека". Например, я написал генератор кода, чтобы испускать Verilog для различных ширин, топологий и структур DMA-движков и перекрестных переключателей, потому что конструкции, необходимые для выражения этой параметризации, еще не были созревают в потоках инструмента синтеза и моделирования.

Это также обычная процедура для испускания логических моделей вплоть до макетов данных для очень обычных вещей, которые могут быть выражены и сгенерированы алгоритмически, например SRAM, кеш файлы и структуры файлов регистров.

Я также потратил немало времени на создание, по сути, генератора кода, который бы взял XML-описание всех регистров в System-on-Chip и испустил HTML (да, да, я знаю о XSLT, я просто обнаружил, что он программно становится более эффективным с точки зрения времени), Verilog, SystemVerilog, C, Assembly и т.д. "представления" этих данных для разных команд (внешний и внутренний дизайн ASIC, прошивка, документация и т.д.) до использовать (и сохранять их согласованными в силу этой единой "кодовой базы" XML). Это считается?

Люди также любят писать генераторы кода, например. используя краткие описания очень распространенных вещей, таких как машины конечного состояния, и механически выводит более подробный императивный языковой код для их эффективного внедрения (например, таблицы перехода и код обхода).

Ответ 4

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

Инструменты, такие как Visual Studio, Codesmith имеют свои собственные шаблоны для большинства общих задач и упрощают этот процесс. Но его легко развернуть самостоятельно.

Ответ 5

Часто бывает полезно создать генератор кода, который генерирует код из спецификации - обычно тот, который имеет обычные табличные правила. Это уменьшает вероятность введения ошибки через опечатку или упущение.

Ответ 6

Да, Я разработал собственный генератор кода для протокола AAA Diameter (RFC 3588). Он может генерировать структуры и Api для чтения сообщений диаметра из файла XML, в котором описывается грамматика приложения диаметра.

Это значительно сократило время разработки интерфейса полного диаметра (например, SH/CX/RO и т.д.).

Ответ 7

по-моему, для хорошего языка программирования не нужны генераторы кода, потому что интроспекция и генерация кода времени исполнения будут частью языка, например. в метаклассах python и новом модуле и т.д.

Ответ 8

Генераторы кода

обычно генерируют более неуправляемый код при долговременном использовании.

однако, если абсолютно необходимо использовать генератор кода (eclipse VE для разработки swing - это то, что я использую время от времени), то убедитесь, что знаете, какой код генерируется. Поверьте мне, вы бы не хотели, чтобы код в вашем приложении не был знаком.

Ответ 9

там может быть много генераторов кода, однако я всегда создаю свои собственные, чтобы сделать код более понятным и соответствовать рамкам и рекомендациям, которые мы используем

Ответ 10

Мы используем генератор для всего нового кода, чтобы обеспечить соблюдение стандартов кодирования.

Недавно мы заменили наш встроенный генератор С++ CodeSmith. Нам все еще нужно создавать шаблоны для инструмента, но, похоже, идеальное решение не должно содержать инструмент самостоятельно.

Ответ 11

Моя последняя потребность в генераторе - это проект, который считывал данные с аппаратного обеспечения и в конечном итоге размещал его в пользовательском интерфейсе "приборной панели". Между ними были модели, свойства, презентаторы, события, интерфейсы, флаги и т.д. Для нескольких точек данных. Я разработал структуру для нескольких точек данных, пока не был удовлетворен тем, что я мог бы жить с дизайном. Затем, с помощью некоторых тщательно размещенных комментариев, я положил "поколение" в визуальный студийный макрос, изменил и очистил макрос, добавил данные в функцию в макросе, чтобы вызвать генерацию, - и сохранил несколько утомительных часов (дней)?) в конце.

Не стоит недооценивать силу макросов:)


Теперь я также пытаюсь настроить параметры CodeRush, чтобы помочь мне с некоторыми более локальными требованиями к генерации. Там есть мощный материал, если вам нужно принятие решений "на лету" при создании кода.

Ответ 12

У меня есть собственный генератор кода, который я запускаю против SQL-таблиц. Он генерирует процедуры SQL для доступа к данным, уровню доступа к данным и бизнес-логике. Он сделал чудеса в стандартизации моих кодов и соглашений об именах. Поскольку он ожидает определенные поля в таблицах базы данных (например, столбец идентификатора и обновленный столбец datetime), он также помог стандартизировать мой дизайн данных.

Ответ 13

Написание собственного генератора для проекта неэффективно. Вместо этого используйте генератор, такой как T4, CodeSmith и Zontroy.

T4 более сложный, и вам нужно знать язык программирования .Net. Вы должны написать свой шаблон по строкам, и вам придется выполнять реляционные операции данных самостоятельно. Вы можете использовать его в Visual Studio.

CodeSmith - это функциональный инструмент, и есть много шаблонов, готовых к использованию. Он основан на T4, и писать собственный temlate занимает слишком много времени, как и в T4. Существует пробная версия и коммерческая версия.

Zontroy - это новый инструмент с удобным пользовательским интерфейсом. У этого есть свой собственный язык шаблона, и его легко узнать. Существует онлайн-рынок шаблонов, и он развивается. Даже вы можете доставлять шаблоны и продавать их онлайн через рынок. У этого есть бесплатная и коммерческая версия. Даже бесплатной версии достаточно для завершения среднесрочного проекта.

Ответ 14

Да, мне пришлось поддерживать несколько. CORBA или какой-то другой интерфейс общения с интерфейсом - это, вероятно, общая вещь, о которой я думаю в первую очередь. У вас есть определения объектов, которые предоставляются вам интерфейсом, с которым вы собираетесь поговорить, но вам все равно придется строить эти объекты в коде. Создание и запуск генератора кода - довольно обычный способ сделать это. Это может стать довольно длинным компилятором только для поддержки некоторого унаследованного канала связи, и, поскольку существует большая тенденция помещать обертки вокруг CORBA, чтобы сделать его более простым, хорошо все становится хуже.

В общем, если у вас есть большое количество структур или просто быстро изменяющиеся структуры, которые вам нужно использовать, но вы не можете справиться с ударом по производительности объектов здания с помощью метаданных, а затем в писать генератор кода.

Ответ 15

Я не могу думать о каких-либо проектах, где нам нужно было создавать собственные генераторы кода с нуля, но есть несколько, где мы использовали существующие генераторы. (Я использовал как Antlr, так и Eclipse Modeling Framework для создания парсеров и моделей в Java для корпоративного программного обеспечения.) Красота использования генератора кода, написанная кем-то еще, заключается в том, что авторы, как правило, являются экспертами в этой области и решили проблемы что я даже не знал, что существует. Это экономит время и разочарование.

Поэтому, даже если я могу написать код, который решает проблему, я могу генерировать код намного быстрее, и есть хороший шанс, что он будет менее глючным, чем все, что я пишу.

Ответ 16

Если вы не собираетесь писать код, вам будет комфортно с кем-то другим сгенерированным кодом?

В долгосрочной перспективе дешевле и $$$ писать свой собственный код или генератор кода?

Я написал генератор кода, который будет строить 100 классов (java), которые будут выводить XML-данные из базы данных в соответствии с DTD или схемой. Генерация кода, как правило, была одноразовой, и тогда код был бы подкреплен различными бизнес-правилами и т.д. Выход был для довольно педантичного банка.

Ответ 17

Генераторы кодов работают для ограничения языка программирования. Я лично предпочитаю отражение вместо генераторов кода, но я согласен с тем, что генераторы кода более гибкие и, как следствие, код быстрее во время выполнения. Надеюсь, в будущих версиях С# будет какая-то среда DSL.

Ответ 18

Сколько вас интересует? Я создал два основных и множество второстепенных. Первый из основных позволил мне генерировать программы 1500 линейных программ (дать или принять), которые имели сильное семейное сходство, но были настроены на разные таблицы в базе данных - и сделать это быстро и надежно.

Недостатком генератора кода является то, что если в генерируемом коде есть ошибка (потому что шаблон содержит ошибку), тогда есть много исправлений.

Однако для языков или систем, где требуется много повторяющегося кодирования, хороший (достаточный) генератор кода является благом (и более благом, чем "собакой" ).

Ответ 19

Единственными генераторами кода, которые я использую, являются синтаксические анализаторы webservice. Я лично держаться подальше от генераторов кода из-за проблем обслуживания новых сотрудников или отдельной команды после раздачи.

Ответ 20

Я пишу свои собственные генераторы кода, в основном в T-SQL, которые вызывается во время процесса сборки.

На основе данных метамодели они генерируют триггеры, протоколирование, объявления С# const, инструкции INSERT/UPDATE, информацию о модели данных, чтобы проверить, работает ли приложение в ожидаемой схеме базы данных.

Мне все еще нужно написать генератор форм для повышения производительности, большего числа спецификаций и менее кодирования;)

Ответ 21

Я создал несколько генераторов кода. У меня был генератор пассивного кода для хранимых процедур SQL, в котором использовались шаблоны. Это сгенерировало 90% наших хранимых процедур.

Так как мы сделали переход к Entity Framework, я создал активный кодогенератор, используя T4 (Text Template Transformation Toolkit) внутри визуальной студии. Я использовал его для создания базовых классов репозитория для наших объектов. Работает очень хорошо и экономит кучу кодирования. Я также использую T4 для украшения классов сущностей определенными атрибутами.

Ответ 23

Генераторы кодов действительно полезны во многих случаях, особенно при сопоставлении из одного формата в другой. Я сделал генераторы кода для IDL для С++, таблицы базы данных для типов OO и код маршаллинга, чтобы назвать несколько.

Я думаю, что авторы пытаются сделать так: если вы разработчик, вы сможете заставить компьютер работать на вас. Генерирование кода - всего лишь одна очевидная задача автоматизации.

Я когда-то работал с парнем, который настаивал на том, что он будет вручную сопоставлять IDL с С++. В начале проекта он смог не отставать, потому что все мы пытались понять, что делать, но в итоге он стал узким местом. Я сделал генератор кода в Perl, а затем мы могли бы в значительной степени выполнить его "работу" через несколько минут.

Ответ 24

Смотрите наш "универсальный" генератор кода на основе программных преобразований.

Я архитектор и ключевой исполнитель. Стоит отметить, что значительная часть этого генератора генерируется с использованием этого генератора.

Ответ 25

Во встроенных системах иногда вам нужен большой блок двоичных данных во вспышке. Например, у меня есть тот, который принимает текстовый файл, содержащий глифы шрифтов растрового изображения, и превращает его в пару файлов .cc/.h, объявляющую интересные константы (такие как первый символ, последний символ, ширина и высота символа), а затем фактические данные как большой static const uint8_t[].

Попытка сделать такую ​​вещь в самом С++, поэтому данные шрифта будут автоматически генерироваться при компиляции без первого прохода, будет больно и, скорее всего, неразборчивым. Написание файла .o вручную не может быть и речи. Таким образом, вырывается графическая бумага, кодируется вручную в двоичный файл и набирается все это.

ИМХО, для этого нужны генераторы кода. Никогда не забывайте, что компьютер работает для вас, а не наоборот.

Кстати, если вы используете генератор, всегда всегда включайте некоторые строки, такие как это как в начале, так и в конце каждого сгенерированного файла:

// This code was automatically generated from Font_foo.txt. DO NOT EDIT THIS FILE.
// If there a bug, fix the font text file or the generator program, not this file.

Ответ 26

В наших проектах используется генератор кода Telosys Tools: https://sites.google.com/site/telosystools/

Мы создали его для сокращения продолжительности разработки в повторяющихся задачах, таких как экраны CRUD, документация и т.д.

Для нас самое главное - настраивать шаблоны генератора, чтобы при необходимости создавать цели нового поколения и настраивать существующие шаблоны. Вот почему мы также создали редактор шаблонов (для файлов Velocity.vm). Он отлично работает для генератора кода Java/ Spring/AngularJS и может быть адаптирован для других целей (PHP, С#, Python и т.д.)