metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2010-01-15 03:05 am
Entry tags:

Призрак ходит по Европе

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

Так вот, о чем это я. В массах в последнее время витает некая идея. Вкратце я бы ее сформулировать: "встроить правильную СУБД с преферансом и гимназистками прямо внутрь рунтайма функциональных языков" и поиметь на халяву сразу множество вещей.

Во-первых, уйти от долбаного SQL, который чем дальше, тем больше расползается в разные стороны в разных СУБД, но при этом не потерять ничего из его функциональности и лаконичности.

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

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

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

Двумерный интерфейс нужен по той причине, что линейное писание кода уже не соответствует задачам. У нас практически все структуры данных - дву- и больше-мерные, результат на экране тоже двумерный(если не трехмерный и выше), а мы до сих пор используем инструменты с одномерным текстом.
Причина непопулярности другого подхода в том, что дебилоиды с UML-инструментами загадили мозг людям, у них сразу отказ от текстового исходного кода ассоциируется с мучительным мышевозением в Rational Rose. Хотя можно же сделать нормальный клавиатурный интерфейс, с переходом к мыши, только в случае необходимости.
wizzard: (Default)

[personal profile] wizzard 2010-01-15 04:22 am (UTC)(link)
о, вы смогли сформулировать, зачем и почему нужно то, что я писал у себя в посте http://wizzard0.livejournal.com/115517.html Ж)))

[identity profile] metaclass.livejournal.com 2010-01-15 04:33 am (UTC)(link)
Да, я примерно по следам того поста про интерфейс и сформулировал.

[identity profile] zerthurd.livejournal.com 2010-01-15 04:33 am (UTC)(link)
Erlang/OTP, например, содержит в себе БД Mnesia, на которой можно весь этот преферанс реализовать.

[identity profile] lionet.livejournal.com 2010-01-15 05:44 am (UTC)(link)
В Mnesia нет типов, что затрудняет миграцию и проверку корректности.

[identity profile] inhate.livejournal.com 2010-01-15 05:59 am (UTC)(link)
Не надо. Открой дельфи, скопируй и вставь. В 6 вечера выключи компьютер, возьми в магазине пива (пока еще почки позволяют) и читай худлит.

[identity profile] metaclass.livejournal.com 2010-01-15 06:23 am (UTC)(link)
Не поможыд, у меня на дельфи реализована малая-малая часть описанной шизы, в продакшене уже 5 лет используется :)

[identity profile] nivanych.livejournal.com 2010-01-15 06:06 am (UTC)(link)
Совершенно правильно.
Только вот, реализовать это поверх существующих языков очень сложно.
Может быть, поверх Agda ещё можно,
она самая простая из современных.

+1

[identity profile] deni-ok.livejournal.com 2010-01-15 08:48 am (UTC)(link)
Да Агда, вроде, должна справиться, а без зависимых типов тяжело: если констрейнты задавать как часть типа, то предикаты в них (типа CHECK Price > 0) делают типы зависящими от данных.

[identity profile] w00dy.livejournal.com 2010-01-15 08:17 am (UTC)(link)
А чего б не встроить рантайм в СУБД, а не наоборот? Тот же постгрес очень удобная штука в этом плане, подключаем какой-нить ocamlpl или gh(c)pl и упирьод. Всю кухню выносим в sp и дёргаем банально select sp_getRandomFemaleGumnasiumStudent () ; и select sp_updatePreferenceStats ([['woody', 10], ['metaclass', 5], ['wizzard0', '0']]) ;

[identity profile] metaclass.livejournal.com 2010-01-15 10:48 am (UTC)(link)
Да, у меня эта мысль тоже была, подойдет как, так сказать, первая доза для индустрии.

[identity profile] alexott.livejournal.com 2010-01-15 08:22 am (UTC)(link)
вон и thesz ударился в мысли о БД - видимо это такой специальный грипп для функциональщиков :-)

[identity profile] jdevelop.livejournal.com 2010-01-15 08:35 am (UTC)(link)
ну это круто конечно, но не массово, нет

а раз не массово - значит сдохнет, не родившись

[identity profile] b00ter.livejournal.com 2010-01-15 08:38 am (UTC)(link)
Intersystems Cache? :)

[identity profile] metaclass.livejournal.com 2010-01-15 10:49 am (UTC)(link)
Нечеловеческое ебаное говно. Как и Матиссе и прочая постреляционка.

[identity profile] b00ter.livejournal.com 2010-01-15 10:50 am (UTC)(link)
Почему? (не ради поспорить, а ради интересу)

[identity profile] metaclass.livejournal.com 2010-01-15 10:56 am (UTC)(link)
Я пытался вкуривать Cache и прочее.
Там нет концептуальной целостности в идеях. Т.е. задумка была хорошая "давайте сделаем объектную БД", судя по всему, достаточно теоретически это не проработали и получилось нечто узкоспецифическое и продаваемое исключительно паровозом с уникальным софтом, который купили бы вообще с любой БД.
wizzard: (Default)

[personal profile] wizzard 2010-01-15 03:58 pm (UTC)(link)
+1. Мы на нее в 2008 посмотрели, плюнули и написали своё. Теперь я уже там не работаю, и хочется написать похожее, но круче.

[identity profile] http://apps.breds.ru/k.pierre.k (from livejournal.com) 2010-01-15 11:46 am (UTC)(link)
> Вкратце я бы ее сформулировать: "встроить правильную СУБД с преферансом и гимназистками прямо внутрь рунтайма функциональных языков" и поиметь на халяву сразу множество вещей.

Такое есть уже почти 20 лет, и называется k/q/kdb+. Иммутабельности там конечно никакой нет, да и не нужна она там. Зачем делать какие-то откаты, когда можно писать b:a+1, где a и b -- таблицы :-) Правда, назначение видимо несколько иное -- time series в основном, и сложные ADT там совсем не нужны. (А нужны ли они вообще? :-))

[identity profile] volodymir-k.livejournal.com 2010-01-15 11:57 am (UTC)(link)
Какую-то не ту задачу решаете. Вот упомянута миграция. Самих тулов для миграции сотни. Дальше, проверка корректности типов. Что имеется в виду? Типа, давать в описании типа переменной ссылку на БД? НАподобие в PL/SQL Oracle VAR X: SOMETABLE.SOMECOLUMN%TYPE? Или "пытаемся сохранить, оно нам показывает список функций" -- именно так оно там и работает. Ну сломалось 600 функций из 601, сильно помогло? Ещё более чётко САП Р/3 отслеживает типа, генерит формы на основании описаний, даёт стандаратные интерфейса лукапов и т.д.

А при чём тут функциональное программирование, берете сорцы компилятора FreePascal и вставляете мост к БД, чтобы на этапе компиляции оттуда выколупывал и проверял. Можно даже проще: по БД тулом генерить юнит с определением типов + режим строгой типизации.

Прогон про "версии" и "транзакционную память" как-то совсем грустно. Объект истории сущности не сводится к сущности, иногда всё сложнее.


"подключаемся к базе, открываем таблицу "описания типов", лезем в тип" -- напоминает мне мои попытки 1998 года делать аналог Borland Database Object Repository. Тогда всякая УМЛ-щина была модна, метапрограммирование и т.д. Сделаем в БД таблицу метаданных -- хотя сама БД уже хранит таковую -- но она без бизнес-смысла, а мы с оным. Потом появится желание к свойствам "полей" добавлять структурированные атрибуты, на атрибуты ещё атрибуты, и закончится тем, что надо остановиться.

По большому счёту проблема в стремлении "всё обобщить", при этом не представляя себе точно это "всё". Стандартная рекомендация: скромнее надо быть, решать ограниченную текущую актуальную задачу.

Всё это бурчение (Вас, ЗАбиватора и т.д.) мне напоминает о зимней депрессии. Средство против -- вино с шашлыками, девушки, танцы, упражнения со штангой. )))

[identity profile] metaclass.livejournal.com 2010-01-15 12:07 pm (UTC)(link)
Да, это как раз и есть "все обобщить, не понимая что именно".

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

А 600 функций просто не сломается, если будет использоваться метапрограммирование и вывод типов. Сломается, скажем, "вывод на печать" какой-нибудь никогда не используемой ведомости, если мы захотим рефакторить таблицу удалением поля, которое только в ней и используется. Сейчас такое отслеживать меня просто удалбывает.

[identity profile] g-rub.livejournal.com 2010-01-15 01:00 pm (UTC)(link)
Двумерность мало что даст. В общем случае можно говорить об n-мерных структурах данных и кода, и не обязательно n<=2.

А проекция структур различной размерности на одномерный текст -- это и есть та самая декомпозиция, namespace-ы, код в различных модулях и т.п.

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

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

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

[identity profile] metaclass.livejournal.com 2010-01-15 01:06 pm (UTC)(link)
Для обработки двумерного представления инструментов хватает. Например, тот же SQL, если мы используем какую-нибудь функциональщину - там HOF над списками столько что никакие grep, awk и прочий нетипизированный текстовый мрак не сравнится.
В данном случае, под двумерным я понимаю множество объектов, где по вертикали - объекты, а по горизонтали - структура их типов.

[identity profile] blacklion.livejournal.com 2010-01-15 01:04 pm (UTC)(link)
Причина непопулярности другого подхода в том, что дебилоиды с UML-инструментами загадили мозг людям, у них сразу отказ от текстового исходного кода ассоциируется с мучительным мышевозением в Rational Rose.
Ты MPS от JetBrains видел?

[identity profile] metaclass.livejournal.com 2010-01-15 01:07 pm (UTC)(link)
Еще не добрался, но идея заменить текстовый редактор на MVC для AST там весьма правильная.

[identity profile] permea-kra.livejournal.com 2010-01-15 03:09 pm (UTC)(link)
>>уйти от долбаного SQL, который чем дальше, тем больше расползается в разные стороны в разных СУБД, но при этом не потерять ничего из его функциональности и лаконичности.

Это означает написание embedded XPath/XQuery, а втыкать его в строгую систему типов тяжко.

[identity profile] clayrat.livejournal.com 2010-01-15 06:10 pm (UTC)(link)
а говорите "грибы будут против" =)

[identity profile] tonal.myopenid.com (from livejournal.com) 2010-01-17 11:03 am (UTC)(link)
Для Haskell-я:
http://hackage.haskell.org/package/TCache

Для ООЯ:
http://www.garret.ru/databases.html