metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2008-12-21 03:06 pm

Да, о DSL и метапрограммировании

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

Вот к примеру - нужно вставить в код двумерную таблицу каких-нибудь коэффициентов фильтра дурачных. Какой у нас есть выбор?

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

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

3) Запилить это дело в СУБД, грузить оттуда. Все то же самое, что с файлом, но еще нужен контекст коннекта к БД. Зато можно сделать редактор таблицы, бо если есть БД, то в проекте и вся инфраструктура CRUD-редакторов обычно наличествует.

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

В идеале это было бы что-то вроде: мы пишем некий код, нам понадобилось вставить что-то что в виде кода описывается с трудом. Мы пишем прямо тут в коде некую команду/ссылку на класс/чорти-чо и сбоку бантик но самое главное- чтобы это не более 5-15 символов занимало, и тут же запускаем на исполнение и у нас прямо посреди текстового редактора вылазит редактор в виде электронной таблицы/дизайнер GUI/поле для ввода SQL запроса и некий набор опций "куда сохранять результат(отдельный файл, ресурс, прямо в коде, бд, настройки) и без всяких хождений по сотне файлов проекта мышой начинаем править объект в естесвенном и удобном для него виде.
Причем если нам понадобится - мы можем написать прямо для проекта своих таких произвольных редакторов и вызывать их. Да еще и оставить это дело в проекте в рунтайме для настройки его на месте.

Отдаленно похожим на такое является intellisense - что бы там не говорили гуру с бесконечной памятью, лучше набрать пару-тройку символов идентификатора и дальше выбрать из списка, чем набирать идентификатор длиной в 10-15 символов целиком. Это как бы получается "редактор для более удобного ввода идентификаторов".

Вроде, насколько я помню, что-то похожее есть в IDEA, с ее рефакторингами и подсказками.

И самое главное - что это дело требует меньших усилий для переключения контекста работы, как сейчас - переход от кода к SQL запросам или редактированию GUI требует перехода куда-то хз куда в IDE, да еще не всегда на это горячие клавиши есть.

В экстремальном случае это будет выглядеть таким кошмаром:
начинаем писать текст, постепенно наворачиваем DSL и редакторы для него, язык программирования на ходу меняется, в нем появляются графические и табличные вставки, к концу разработки уже пишем чуть ли не по методу "пару строк - готов новый модуль в систему", а исходный код вместо линейного одномерного текста превратился в двумерную картинку типа электронной схемы :)

[identity profile] thesz.livejournal.com 2008-12-21 09:09 pm (UTC)(link)
"Гуру с бесконечной памятью"

ААА!!! ;)

Двумерные картинки вместо линейного одномерного текста так и не стартовали на моей памяти.

[identity profile] metaclass.livejournal.com 2008-12-21 09:25 pm (UTC)(link)
Стартовали, массово.
Все поганьские гуи-дизайнеры, asp.net-дизайнеры, редакторы печатных форм и прочая печаль. Стандартная реализация декларативного описания: лежит куча объектов, связаны либо относительным расположением друг от друга, либо в инспекторе указаны ссылки друг на друга.

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

[identity profile] volodymir-k.livejournal.com 2008-12-21 11:07 pm (UTC)(link)
Угу, в Дельфи можно было свой редактор свойств наколбасить и прямо у живого компонента в дизайн-тайме что хошь накорябать.

[identity profile] vp.livejournal.com 2008-12-22 07:06 am (UTC)(link)
да, вот нечто подобное и нужно. Но насколько известно, по такому пути кроме борланда никто не пошел, даже ресурсы формы вместо отдельного хранилища стали пихать в основной код и парсить пару раз чтоб им пусто было