LINUX.ORG.RU

Похоже, что мне нужен свой макропроцессор. Как?


0

0

Всем привет.

Хочется облегчить себе жизнь путем уменьшения количества тупого кодинга. Для этого хочется поиметь инструмент, который позволил бы разворачивать конструкции очень простого диалекта собственной разработки в целевой код, на котором ведется разработка. Собственный диалект - по сути несложная штука декларативного характера, без сложных синтаксических и семантических конструкций и т.п. По диагонали посмотрел в сторону lex-ов yacc-ов - похоже, что в моем случае это тяжелая артиллерия. Возникло ощущение, что по сути мне нужен препроцессор/макропроцессор. Навскидку видится несколько вариантов:

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

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

3. Морокаться по полной и попытаться использовать тяжелую артиллерию.

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

Буду весьма пизнателен за комментарии и-или советы по проблеме в целом и возможным перечисленным вариантам.


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

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

возможно Вам подойдёт просто m4 - готовый макропроцессор и есть он на всех системах

imho - из предлженных Вами подходов, наиболее реальный - №1. во первых задача станет более понятной, во вторых при остальных подходах всё-равно будет момент, когда всё лучше переделать заново :)

MKuznetsov ★★★★★
()

Возможно, m4 подойдет. Сам видел реально работающее решение -- два прохода m4, потом cc.

watashiwa_daredeska ★★★★
()
Ответ на: комментарий от MKuznetsov

Ну вот и я склоняюсь к первому варианту.

Целевой код - perl. Диалект описывает:

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

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

3. Потенциально - какие-то конструкции, которые можно разворачивать в код просто потому, что perl такой, какой он есть (местами громоздкий).

Еще как вариант рассматриваю возможность создания xml разметки и написания xslt шаблонов для разворачивания в то, что нужно. Из плюсов - гибкость, которой может хватить надолго, из минусов - все та же громоздкость синтаксиса. Еще один достаточно серьезный плюс - потенциальная возможность написания шаблонов для вывода в другой целевой язык если когда-нибудь мне все это надоест ;)

perl в данном случае выбирался достаточно осознанно, на то были причины (это на случай упреков в выборе неправильно выбранного инструмента ;)

За m4 спасибо, сейчас буду шшупать.

ach
() автор топика
Ответ на: комментарий от ach

А кто-то из "перлистов" говорил, что на перле есть отличный генератор перлового кода (читай - макропроцессор).

yyk ★★★★★
()
Ответ на: комментарий от anonymous

ещё есть cog

а что-то писать своё совсем с нуля не стоит. Хотя скорее всего тебе m4 хватит по самые уши

cvv ★★★★★
()
Ответ на: комментарий от cvv

>а что-то писать своё совсем с нуля не стоит. Хотя скорее всего тебе m4 хватит по самые уши

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

anonymous
()
Ответ на: комментарий от anonymous

аutoconf использует m4 для генерации shell скриптов.

anonymous
()
Ответ на: комментарий от anonymous

Спасибо откликнувшимся, перевариваю полученную информацию ;)

>а можно привести живые проекты, использующие m4

sendmail. упрощают работу по генерации ацкого конфига.

приводится в качестве примера тут:
http://www.ibm.com/developerworks/ru/library/l-metaprog1/index.html

вторая часть статьи на случай если заинтересовало тут:
http://www.ibm.com/developerworks/ru/library/l-metaprog2/index.html

с m4 идут всяческие экзамплы
Можно так же почитать развернутое описание по русски
http://ural.tn.ru/proforg/docs/apps/gnu/m4/index.html

ach
() автор топика
Ответ на: комментарий от anonymous

На m4 был написан генератор сишного кода в проекте XCB (freedesktop.org) в самом начале. Правда потом его заменили на связку XML/XSLT.

Еще на память пришло: основная библиотека отпечатков электронных компонентов в проекте PCB тоже написана на m4. Из этих описаний потом генерируются графические изображения компонентов.

Zubok ★★★★★
()
Ответ на: комментарий от bugmaker

Я знал, что лисп обязательно выплывет ;))

ach
() автор топика
Ответ на: комментарий от anonymous

> а можно привести живые проекты, использующие m4?

Знаю один close-source проект, в котором куча кода генерируется из описаний с помощью m4.

execve
()
Ответ на: комментарий от anonymous

конфиги sendmail до 8-ой версии (или даже до 9-ой?) генерились m4.

Но если целевой язык - перл, то правильный способ это сорсфильтры.

anonymous
()

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

Miguel ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.