Да, о DSL и метапрограммировании
Dec. 21st, 2008 03:06 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Кроме всего прочего, меня еще посещает мысль, что привычное программирование в виде последовательного набора линейного текста слабо совместимо с идеями DSL и метапрограммирования, из-за чего в новых языках возникают жуткие малочитабельные конструкции.
Вот к примеру - нужно вставить в код двумерную таблицу каких-нибудь коэффициентов фильтра дурачных. Какой у нас есть выбор?
1) Записать ее в виде массива прямо на нашем языке программирования. Выглядит криво, редактировать неудобно, менять в рунтайме не получится, зато обращение быстрое.
2)Поместить ее в файл и оттуда загружать, что тянет за собой: либо парсинг файла, либо придумывание его формата, либо требование наличия метапрограммирования в языке для того, чтобы этот файл подгрузить на этапе компиляции и сгенерить тут же на месте парсер. Возникает жесткая связь между программой и наличием файла и его форматом со всеми вытекающими последствиями типа "клоуны-юзера удалили файл потому что подумали, что он мешает им работать". Код загрузки файла в качественно написанной программе тоже немалый получается - проверка ошибок, вывод сообщений(а представьте себе вывод сообщения юзеру, если этот код находится в глубинах сервера приложений). Опять же - редактировать файл только руками.
3) Запилить это дело в СУБД, грузить оттуда. Все то же самое, что с файлом, но еще нужен контекст коннекта к БД. Зато можно сделать редактор таблицы, бо если есть БД, то в проекте и вся инфраструктура CRUD-редакторов обычно наличествует.
Выборы, скажем так, примерно равнозначные, я с ходу не скажу какой лучше, какой хуже. Поэтому, если по хорошему, то реализовываться они должны примерно с одинаковыми усилиями.
В идеале это было бы что-то вроде: мы пишем некий код, нам понадобилось вставить что-то что в виде кода описывается с трудом. Мы пишем прямо тут в коде некую команду/ссылку на класс/чорти-чо и сбоку бантик но самое главное- чтобы это не более 5-15 символов занимало, и тут же запускаем на исполнение и у нас прямо посреди текстового редактора вылазит редактор в виде электронной таблицы/дизайнер GUI/поле для ввода SQL запроса и некий набор опций "куда сохранять результат(отдельный файл, ресурс, прямо в коде, бд, настройки) и без всяких хождений по сотне файлов проекта мышой начинаем править объект в естесвенном и удобном для него виде.
Причем если нам понадобится - мы можем написать прямо для проекта своих таких произвольных редакторов и вызывать их. Да еще и оставить это дело в проекте в рунтайме для настройки его на месте.
Отдаленно похожим на такое является intellisense - что бы там не говорили гуру с бесконечной памятью, лучше набрать пару-тройку символов идентификатора и дальше выбрать из списка, чем набирать идентификатор длиной в 10-15 символов целиком. Это как бы получается "редактор для более удобного ввода идентификаторов".
Вроде, насколько я помню, что-то похожее есть в IDEA, с ее рефакторингами и подсказками.
И самое главное - что это дело требует меньших усилий для переключения контекста работы, как сейчас - переход от кода к SQL запросам или редактированию GUI требует перехода куда-то хз куда в IDE, да еще не всегда на это горячие клавиши есть.
В экстремальном случае это будет выглядеть таким кошмаром:
начинаем писать текст, постепенно наворачиваем DSL и редакторы для него, язык программирования на ходу меняется, в нем появляются графические и табличные вставки, к концу разработки уже пишем чуть ли не по методу "пару строк - готов новый модуль в систему", а исходный код вместо линейного одномерного текста превратился в двумерную картинку типа электронной схемы :)
Вот к примеру - нужно вставить в код двумерную таблицу каких-нибудь коэффициентов фильтра дурачных. Какой у нас есть выбор?
1) Записать ее в виде массива прямо на нашем языке программирования. Выглядит криво, редактировать неудобно, менять в рунтайме не получится, зато обращение быстрое.
2)Поместить ее в файл и оттуда загружать, что тянет за собой: либо парсинг файла, либо придумывание его формата, либо требование наличия метапрограммирования в языке для того, чтобы этот файл подгрузить на этапе компиляции и сгенерить тут же на месте парсер. Возникает жесткая связь между программой и наличием файла и его форматом со всеми вытекающими последствиями типа "клоуны-юзера удалили файл потому что подумали, что он мешает им работать". Код загрузки файла в качественно написанной программе тоже немалый получается - проверка ошибок, вывод сообщений(а представьте себе вывод сообщения юзеру, если этот код находится в глубинах сервера приложений). Опять же - редактировать файл только руками.
3) Запилить это дело в СУБД, грузить оттуда. Все то же самое, что с файлом, но еще нужен контекст коннекта к БД. Зато можно сделать редактор таблицы, бо если есть БД, то в проекте и вся инфраструктура CRUD-редакторов обычно наличествует.
Выборы, скажем так, примерно равнозначные, я с ходу не скажу какой лучше, какой хуже. Поэтому, если по хорошему, то реализовываться они должны примерно с одинаковыми усилиями.
В идеале это было бы что-то вроде: мы пишем некий код, нам понадобилось вставить что-то что в виде кода описывается с трудом. Мы пишем прямо тут в коде некую команду/ссылку на класс/чорти-чо и сбоку бантик но самое главное- чтобы это не более 5-15 символов занимало, и тут же запускаем на исполнение и у нас прямо посреди текстового редактора вылазит редактор в виде электронной таблицы/дизайнер GUI/поле для ввода SQL запроса и некий набор опций "куда сохранять результат(отдельный файл, ресурс, прямо в коде, бд, настройки) и без всяких хождений по сотне файлов проекта мышой начинаем править объект в естесвенном и удобном для него виде.
Причем если нам понадобится - мы можем написать прямо для проекта своих таких произвольных редакторов и вызывать их. Да еще и оставить это дело в проекте в рунтайме для настройки его на месте.
Отдаленно похожим на такое является intellisense - что бы там не говорили гуру с бесконечной памятью, лучше набрать пару-тройку символов идентификатора и дальше выбрать из списка, чем набирать идентификатор длиной в 10-15 символов целиком. Это как бы получается "редактор для более удобного ввода идентификаторов".
Вроде, насколько я помню, что-то похожее есть в IDEA, с ее рефакторингами и подсказками.
И самое главное - что это дело требует меньших усилий для переключения контекста работы, как сейчас - переход от кода к SQL запросам или редактированию GUI требует перехода куда-то хз куда в IDE, да еще не всегда на это горячие клавиши есть.
В экстремальном случае это будет выглядеть таким кошмаром:
начинаем писать текст, постепенно наворачиваем DSL и редакторы для него, язык программирования на ходу меняется, в нем появляются графические и табличные вставки, к концу разработки уже пишем чуть ли не по методу "пару строк - готов новый модуль в систему", а исходный код вместо линейного одномерного текста превратился в двумерную картинку типа электронной схемы :)
no subject
Date: 2008-12-21 02:38 pm (UTC)no subject
Date: 2008-12-21 03:01 pm (UTC)no subject
Date: 2008-12-21 03:10 pm (UTC)Но я лично глубоко сомневаюсь в удобстве такого подхода.
Проблема не в рюшечках "редактировать на месте",
Вот Qt вполне успешно решили эту проблему различного представления данных - без интеграции вставки картинок в исходный код. Точнее, картинки я в исходный код могу вставлять, но не руками, а через ресурсы. А вот на эти ресурсы - транслятор их в плюсовые сорцы, что линкуются в общем порядке.
Вопрос - в языке, и его интепорабельности к конкретной предметной области.
Об этом я и написал в своём комменте.
no subject
Date: 2008-12-21 08:12 pm (UTC)Forth
no subject
Date: 2008-12-21 08:14 pm (UTC)no subject
Date: 2008-12-21 08:31 pm (UTC)1. формы не нужны
2. если нужно взаимодействие с пользователем, то это нужно делать только через веб
3. если нужны формы, то пользуйтесь связкой +питон +лурвлурв +удвудвоуд +улврулвру
4.
5.
..
no subject
Date: 2008-12-23 12:43 pm (UTC)http://fforum.winglion.ru/viewtopic.php?t=1436&sid=b71414f6fa0d6208362027f72752fabd
no subject
Date: 2008-12-23 03:32 pm (UTC)no subject
Date: 2008-12-23 05:02 pm (UTC)я не знаю, поскольку сам не пользовался, но думаю есть такие. Впрочем, идеала нет - тут либо шашечки (DSL средствами языка, гибкие сущности) либо ехать (дизайнер форм, ооп.. etc).
Я вот например не смог найти дизайнер форм для GTK даже на сях (может плохо искал?), и я ничего не слышал про RAD в функциональных языках. Учитывая это думаю, что не RAD`ом единым...
no subject
Date: 2008-12-23 05:29 pm (UTC)По форме генерируется валидный плюсовый (жабный, питоновский) код, который нельзя модифицировать, но который можно инклудить (импортить), наследоваться от него, и так далее прямо в коде.
Также можно подключать обработчики на события виджетов из этой формы (т.е. подключать обработчики на события объектов виджетов из сгенерированного кода).
Ничего лучше я пока не встречал. Но такого, на мой взгляд, достаточно.
no subject
Date: 2008-12-23 08:51 pm (UTC)Glade is a RAD tool to enable quick & easy development of user interfaces
for GTK+/GNOME. It can generate the C source code needed to create
the interfaces designed within Glade's interface editor.
WWW: http://glade.gnome.org/
ы?
no subject
Date: 2008-12-23 09:05 pm (UTC)no subject
Date: 2008-12-21 03:21 pm (UTC)Я пока этого монстра не смотрел, но "Это что-то типа".
no subject
Date: 2008-12-21 03:33 pm (UTC)no subject
Date: 2008-12-21 04:45 pm (UTC)Если не ошибаюсь то этим в Eclipse как ра mylin занимается http://www.eclipse.org/mylyn/
no subject
Date: 2008-12-21 09:09 pm (UTC)ААА!!! ;)
Двумерные картинки вместо линейного одномерного текста так и не стартовали на моей памяти.
no subject
Date: 2008-12-21 09:25 pm (UTC)Все поганьские гуи-дизайнеры, asp.net-дизайнеры, редакторы печатных форм и прочая печаль. Стандартная реализация декларативного описания: лежит куча объектов, связаны либо относительным расположением друг от друга, либо в инспекторе указаны ссылки друг на друга.
Они как бы всем хороши, кроме того, что для их расширения и переделки под себя обычно приходится лезть в ужасные дебри(если это вообще возможно), полуавтоматической генерации того что в них дизайнится из каких-либо других структур данных нет, и переход между текстом-кодом, дизайнером и инспектором объектов - обязательно ТОЛЬКО мышью и не менее чем несколькими кликами и каждый из которых должен не менее секунды отрабатывать (делать горячие клавиши, да еще быстро работающие запрещено - тогда программисты смогут быстро работать, а это запрещено рыночными соображениями).
no subject
Date: 2008-12-21 11:07 pm (UTC)no subject
Date: 2008-12-22 07:06 am (UTC)чтоб им пусто былоno subject
Date: 2008-12-21 10:45 pm (UTC)no subject
Date: 2008-12-22 01:11 am (UTC)no subject
Date: 2008-12-22 09:30 am (UTC)