metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2011-06-24 03:03 pm

Лямбды и Firebird, ад продолжается

А теперь, внимание, бородатая женщина будет есть червей мнение разработчика Firebird о лямбда-функциях:

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

[identity profile] nivanych.livejournal.com 2011-06-26 09:04 am (UTC)(link)
Какой именно проблемы?
Язык высокого уровня с удобной работой с низкоуровневым?
Ну, теоретически, решили. Практически, пока не очень.
Запихивать элементы функциональных языков в низкоуровневые?
Ну, если говорить о "проблеме", то решили.
Но вот, имплементаций нормальных нет.

[identity profile] permea-kra.livejournal.com 2011-06-26 09:42 am (UTC)(link)
Проблемы вменяемого (т.е. нормальный параметрический полиморфизм с удобным синтаксисом и хвостовой рекурсией) языка для работы с сырой памятью, низким оверхедом и легким рантаймом.

[identity profile] blackyblack.livejournal.com 2011-06-26 06:24 pm (UTC)(link)
Да, не сделали. Для функциональных языков расход памяти плохо считается. Но скорее решат проблему нехватки памяти, чем сделают правильный язык.

[identity profile] fraks-nsk.livejournal.com 2011-06-27 04:31 am (UTC)(link)
Вы клинический идиот если считаете что метакласс, вдруг бросится переписывать уже написанные и внедренные программы на сервер "X" из-за того что какому-то идиоту не понравился разработчик сервера "Y".

[identity profile] metaclass.livejournal.com 2011-06-27 04:55 am (UTC)(link)
Вдруг не брошусь, но такой вариант рассматривается, при наличии ресурсов.

[identity profile] osdm.livejournal.com 2011-06-27 06:07 am (UTC)(link)
Эх, а ведь именно в SQL лямбды были бы наиболее полезны как средство передачи дополнительных условий фильтрации в функции/SQL-запросы. Потому что динамический SQL - это конечно круто, но статика с лямбдами была бы намного удобнее.

[identity profile] metaclass.livejournal.com 2011-06-27 06:39 am (UTC)(link)
Вот именно.

[identity profile] volodymir-k.livejournal.com 2011-06-27 01:34 pm (UTC)(link)
Настоящие индейцы передают строки с условиями, их сервер конкатенирует и execute immediate. Медленно? Если вы думаете, что в чём-то можно сильно сэкономить на парсинге AST и анализе планов, то сильно ошибаетесь -- дисковая операция в 1000 раз медленнее самого навороченного парсинга с планированием.

[identity profile] osdm.livejournal.com 2011-06-27 01:43 pm (UTC)(link)
Дело столько не в том, что медленно, сколько в том, что неудобно. Конструкции получаются громоздкими (удвоение кавычек, переносы строк и прочая фигня). Переменные не в фильтре приходится явно биндить, а переменные в фильтре переводить в строку, рискуя получить injection vulnerability. Ошибки выявляются в runtime, а не в процессе компиляции и т.п.

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

[identity profile] volodymir-k.livejournal.com 2011-06-27 07:00 pm (UTC)(link)
> Переменные не в фильтре приходится явно биндить, а переменные в фильтре переводить в строку, рискуя получить injection vulnerability.

По-моему это невалидный аргумент, уже лет 20 как передаётся строка и массив объектов в любое API.

> Конструкции получаются громоздкими (удвоение кавычек, переносы строк и прочая фигня).

Да, во многих языках нету литералов, и некрасивенько.

> когда его приходится вызывать сотню тысяч раз за расчет... и на парсинге тоже стоит поэкономить

Как правило такое вычисление экономят на клиенте и не пересекают 10 слоев, а БД обычно делается сетевое с 50 мс задержкой.

А кто делает расчёты на T/PL-SQL на сервере...тот ценитель извращений.


А знаете, какая самая проблема передать лямбду? потому что будет хотеться передать с контекстом, и непредсказуемой сложности вычисление. А ведь одно дело -- условие where a < b и другое where factorial(x) < 12345678. То есть лямбду в общем случае не оптимизируешь, как условие.

Page 3 of 3