Бойко Банчев - Язык РЕФАЛ - взгляд со стороны (обсуждение)

Apr 13, 2011 16:31

Знакомство с языком Рефал полезно программисту хотя бы потому, что этот функциональный язык не похож ни на один из других - среди них он занимает особое место и по возрасту, и по происхождению, и по назначению, и по стилю. Достойно сожаления то что, несмотря на свои качества, язык не очень популярен ( Read more... )

#7

Leave a comment

lionet April 14 2011, 06:31:01 UTC
Не на fp, а на декларативном языке, без тьюринг-полноты.

Reply

_slw April 14 2011, 07:38:26 UTC
а почему без тьюринг-полноты?
и какой ее частью надо жертвовать?

Reply

_slw April 14 2011, 11:34:50 UTC
мы зациклились.
ответов (на вопросы) нет.

пролог ведь тьюринг-полный? декларативный.
"Скорее всего этот опыт и привёл меня в итоге к функциональным языкам."

Reply

lionet April 14 2011, 12:23:09 UTC
1. Язык должен быть декларативным: описывать зависимости, а не последовательности действий.
2. Язык при этом не должен быть Тьюринг-полным. Поэтому, например, у него скорее всего не должно быть переменных, возможности эти переменные модифицировать, возможности вызывать функции, не должно быть глобально модифицируемого состояния. Inheritance с модификацией переменных наследуемой среды - ещё куда ни шло.
3. Формальной модели того, чего "достаточно" или "необходимо" иметь в языке у меня нет, поэтому отсутствие тьюринг-полноты - это ограничение "сверху" - чтобы язык конфигурации был "не экспрессивнее" чем любой сколько-либо простой язык программирования.

Вопрос "какой частью тьюринг-полноты надо жертвовать" я не понял.

Reply

_slw April 14 2011, 12:29:59 UTC
1. Язык должен быть декларативным: описывать зависимости, а не последовательности действий.
OK.
FP, вроде под это тоже подходит, или я чего не понимаю?

Поэтому, например, у него скорее всего не должно быть переменных
спорно.
но если с
возможности эти переменные модифицировать
то переменные, которые нельзя пмодифицировать допустимы или нет?

возможности вызывать функции
спорно.
для, скажем конфига RADIUS-сервера, как сказать, что session-timeout есть функция от направления, баланса и тарифа?

не должно быть глобально модифицируемого состояния.
ок

Вопрос "какой частью тьюринг-полноты надо жертвовать" я не понял.
ну я темный, сиволапый. потому, когда говорят "отсутсвие тьюринг-полноты" - для меня звучит как "что-то от тьюринг-полноты должно отсутсвовать".

Reply

lionet April 14 2011, 13:02:18 UTC
> FP, вроде под это тоже подходит, или я чего не понимаю?

Скорее нет, чем да. Вот \x -> x + 1 - это fp или нет? FP. Но это не то, что я считаю декларативным описанием. Лямбды какие-то, эта-редукции...

> то переменные, которые нельзя пмодифицировать допустимы или нет?

Неизменяемые атрибуты и key/value - конечно допустимы. Это же основа конфигурации вообще-то.

> для, скажем конфига RADIUS-сервера, как сказать, что session-timeout есть функция от направления, баланса и тарифа?

Как-как, описанием декларативно:

session-timeout "timeout1" {
type "constant";
value "42";
}

session-timeout "timeout1" {
type "js-function";
value "function(env) { return env.direction + env.balance - env.tariff + 13; }";
}
Бенефит: сайд-эффекты не расползаются по коду конфига. Контаминейшн тьюринг-полнотой ограничен конкретным микро-углом конфигурации. Язык имплементации функций не фиксирован, и может быть каким угодно (список по выбору). Сам по себе язык конфигурации фиксирован и не меняется - хорошо для поддержки легаси компонентов, ( ... )

Reply

_slw April 14 2011, 13:16:32 UTC
Неизменяемые атрибуты и key/value - конечно допустимы. Это же основа конфигурации вообще-то.
Вот $ENV{USER} или $HOME -- это ж переменная. но не атрибут или key/value.

Как-как, описанием декларативно:
какое ж это декларативно! это мало того что многозначно, так еще и с функциями!

Бенефит: сайд-эффекты не расползаются по коду конфига.
ну да, пока ты первый и второй вариант не разнес мегабайтом конфига.

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

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

Reply

lionet April 14 2011, 14:37:16 UTC
> какое ж это декларативно! это мало того что многозначно, так еще и с функциями!

Это ты правильно подловил - я сначала написал полностью декларативный вариант, затем заменил его на встроенную функцию. Текст вверху оставил.

> просто компоненты должны делать вызов "дай session-timeout для текущего контекста"

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

ну или из циклов, памяти и условных переходов выкинем память -- будет ОК?

"ОК" будет так, как я показал в той своей статье.

Reply

_slw April 14 2011, 19:54:15 UTC
Это ты правильно подловил - я сначала написал полностью декларативный вариант, затем заменил его на встроенную функцию. Текст вверху оставил.
и в мыслях ловить не было.
это я конфигами испорчен и подумал, что ты проказал стандартную ситуацию -- дефолтное константное значение и в отдельных случаях функция.

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

"ОК" будет так, как я показал в той своей статье.
если это так, как ты тут в примерах показываешь -- то это заметание мусора по ковер, поскольку вопрос языка относится во-первых "на потом", во-вторых для каждого компонента он может оказаться индивидуальным, а в третьих если будет нужна связь между параметрами/компонентами -- то что делать?

Reply

lionet April 15 2011, 05:27:04 UTC
Макароны - это когда весь конфиг можно выполнить, и посчитать на нём факториал. Вот это - макароны. А когда тьюринг-полнота не распространяется на конфиг, и доступна только в некоторых местах (которых ну совсем нельзя описать декларативно, только через функцию-зависимость) - это не макароны, а так. Angel hair pasta.

Почему макароны - это потому что мы фактически не пишем конфигурацию, а пишем программу. Теперь представим некий веб-интерфейс с кнопочками и попапчиками, который эту конфигурацию-программу меняет. Представили? Нет? Вот и я нет - делать интерфейсы к декларативным инструментам проще, чем делать интерфейсы к языку, который может содержать произвольную сложность, в том числе вычислительно сложную. Что если нужно матрицы считать, чтобы таймаут выяснить? Это не должно быть частью конфига, а должно описываться конфигом, что "надо-бы тут матрицу посчитать; как именно - ты знаешь, или вот тебе функция, которой ты знаешь, как пользоваться".

Reply

_slw April 15 2011, 06:23:23 UTC
еперь представим некий веб-интерфейс с кнопочками и попапчиками, который эту конфигурацию-программу меняет. Представили? Нет?
чего там представлять? видел я такое и пользовался.
ну не веб, а gui на жабе, но что в лоб, что по лбу.
редактор сценариев для cisco callcenter express.

и не скажу, что это был больший ад и пиздец, чем веб-интерфейс к конфигу роутера. такое же неудобное говно.

в реальных условиях попытка скрестить ежа с ужом для конфига радиус-сервера приводит к фэйлу для декларативного конфига.

Reply

lionet April 15 2011, 13:53:34 UTC
Конфиг циски (ios, pix) - декларативный, с возможностью ссылки на сценарии в ключевых местах. Сценарии могут быть на разных языках (tcl, lua, js). Это в существенной степени соответствует тому списку критериев и ограничений, которые я привёл.

Это практика и реальные условия.

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

Reply

_slw April 15 2011, 13:58:12 UTC
вот даже без всяких сценариев -- веб-интерфейс к декларативном конфигу такой же ужас как и гуй-интерфейс к редактору сценариев CCX.

а конфиг а радиус-сервера в декларативных терминах в мои потребности не укладывается никак, без всяких сценариев.

Reply

lionet April 15 2011, 14:26:10 UTC
Ну не укладывается так не укладывается, проблем-то. Я описал свой опыт и свои выводы из попытки удержать от превращения в лапшу конфигурации системы из тысяч взаимодействующих сущностей, управляемую десятком людей с разным уровнем подготовки. У меня получилось, и я описал, почему.

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

Reply

_slw April 15 2011, 14:40:38 UTC
у меня есть опыт попыток воспользоваться.
опыта имплементации нет (надюсь, что только пока нет. в любом случае я сначала лекции дослушаю).
но прежде чем бросаться сломя голову имплементировать что попало разложить по полочкам.

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

Reply


Leave a comment

Up