Вы создаете свои собственные генераторы кода? - PullRequest
28 голосов
/ 22 сентября 2008

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

Ответы [ 26 ]

20 голосов
/ 17 декабря 2008

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

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

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

ИМО, последние гораздо ценнее, потому что они приближаются к принципу СУХОЙ (не повторяйся).

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

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

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

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

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

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

9 голосов
/ 22 сентября 2008

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

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

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

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

8 голосов
/ 22 сентября 2008

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

6 голосов
/ 22 сентября 2008

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

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

5 голосов
/ 22 сентября 2008

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

3 голосов
/ 26 января 2009

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

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

2 голосов
/ 22 сентября 2008
Генераторы кода

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

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

2 голосов
/ 22 сентября 2008

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

2 голосов
/ 27 декабря 2017

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

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

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

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

1 голос
/ 22 сентября 2008

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

...