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

StackOverflow https://stackoverflow.com/questions/113286

  •  02-07-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

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

Другие советы

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

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

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

По моему мнению, последние гораздо более ценны, потому что они приближаются к принципу DRY (не повторяйся).

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

CodeSmith — функциональный инструмент, и существует множество готовых к использованию шаблонов.Он основан на Т4 и написание собственного шаблона занимает слишком много времени, как в Т4.Есть пробная и коммерческая версия.

Zontroy — это новый инструмент с удобным пользовательским интерфейсом.Он имеет собственный язык шаблонов, и его легко освоить.Рынок онлайн-шаблонов существует и он развивается.Вы даже можете доставлять шаблоны и продавать их через Интернет на рынке.Имеет бесплатную и коммерческую версию.Даже бесплатной версии достаточно для реализации среднемасштабного проекта.

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

Дешевле ли с точки зрения времени и денег в долгосрочной перспективе написать собственный код или генератор кода?

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

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

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

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

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

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

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

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

Я использую функции генерации кода, предоставляемые EMF — платформа моделирования Eclipse.

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

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

Однажды я работал с парнем, который настоял на том, чтобы вручную выполнить сопоставление IDL с C++.В начале проекта ему удавалось идти в ногу со временем, потому что остальные из нас пытались понять, что делать, но в конечном итоге он стал узким местом.Я создал генератор кода на Perl, и тогда мы могли выполнить его «работу» за несколько минут.

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

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

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

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

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

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

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

Мы используем Телосис генератор кода в наших проектах: http://www.telosys.org/

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top