Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
В момент первоначальной загрузки обработчика в память.
Можно анализировать его код и выставить приоритеты всем обработчикам.
Система сама заботится об этом при помощи специального механизма приоритетов выполнения. Это означает, что из двух обработчиков сначала будет вызван тот, в котором значение переменной изменяется, после чего будет вызван обработчик, в котором значение этой переменной используется.
Хороший вопрос. В статье я действительно это не описал, чтобы не усложнять.
По поводу Вашего вопроса: в каждом событии указано для какой переменной оно создано, а в каждой ситуации указано какие события в ней задействованы.
Какой именно?
Как, имея под курсором переменную, узнать, какой обработчик(-и) будет вызван, когда значение этой переменной изменится с 2 на 3?
По ключу, состоящему из имени переменной + ее значения (это предварительно) находим соответствующее событие для данной переменной и ее значения 3. Т.е. ключ такой 'имя_переменной=3'. По идентификатору события просматриваем все ситуации, к которым оно привязано.
Без проблем — сохраняем «переменные» в реляционной бд, а дальше по индексам.
С точки зрения процесса разработки можно обязать документировать «ситуации» в литературном стиле (или хотя бы аннотировать побочные эффекты и писать описания ситуаций) и получить управление сложностью программы существенно лучше чем в среднем по индустрии.
Тогда у нас будут такие «ситуации»:
Отображать в веб-клиенте кол-во денег на счете. Если оно изменилось — перерисовать кол-во денег
Дать возможность клиенту иницировать в веб-клиенте перевод
На сервере асинхронно запустить перевод («условие» — авторизованный клиент пытается совершить перевод". Перевод — это отправка асинхронного запроса в стороннюю систему. Внутри этого «события» мы помним номер запроса"
Сообщить об ошибке, если («условие») сторонняя система вернула отказ в денежном переводе. Для этого возможно нужно найти событие, которое помнит номер запроса
Если (условие) сторонняя система успешно перевела деньги — изменить кол-во денег на счете клиента
Управление сложностью становится простым за счет того что мы можем читая описание «ситуаций» явно видеть их взаимосвязь.
01. Объявить переменную «количество денег на счете» внутри домена «текущий пользователь»
«текущий» пользователь —$_SESSION[current_user]
[...]
Она [эта переменная] меняется внутри «ситуаций», в которых явно аннотирование изменение этой переменной.
02. Объявить условие «изменение количества денег на счете» для ref:01
03. Обявить ситуацию — обновление кол-ва денег в интерфейсе пользователя, срабатывающий при активации условия «изменилось кол-во денег на счете»
05. Объявить ситуацию «перевод средств», храняющую состояние (текущий пользователь, дата/время, сумма, код завершения, размер тайм-аута, ...).
06. Объявить ситуацию «отказ в переводе», срабатывающую при наступлении условия «получен отрицательный ответ от сторонней системы», отобразить сообщение об отказе пользовалею
07. Объявить ситуацию «успешный перевод» срабатывающую при наступлении условия «получен положительный ответ от сторонней системы», изменить кол-во денег на счете, что вызовет срабатывание условия ref:02
что может позволить (в теории) не смотреть в код, а объяснять машине что и когда делать.
Допустим для каждой части предложения (главный глагол, актор, актант и все их валентности) будет предусмотрена своя переменная, то их будет не так и много.
В таком случае машина будет продолжать движение, пока не встретилась преграда, срабатывает ситуация и машина либо пытается объехать препятствие, либо остановиться.
Возможно сигналы от датчика будет обрабатывать промежуточный микроконтроллер, который уже будет подавать сигнал «наверх».
Параллельно две ситуации «сумма на счету превысила сто рублей» возникнуть не могут. Мы загружаем проводки из файла последовательно, запись за записью.
Что такое «встретилась преграда»? Событие? Состояние?
Имеет ли смысл машине задействовать тормоз, если двигатель выключен, но перед ней появился пешеход? Нет.
Имеет ли смысл машине задействовать тормоз, если двигатель включен, но коробка в режиме нейтрали или паркинга, хотя опять же перед ней появился пешеход? Нет.
Значит ситуация, при которой нужно останавливается актуальна только тогда, когда двигатель работает, и передача включена.
переменная отражающая наличие препятствия на дороге.
Робот включает двигатель, срабатывает первое событие. Оно превращается в состояние. Т.е. это флажок и он будет взведен, пока робот не выключит двигатель. После включения двигателся робот включает первую передачу и начинает движение. Срабатывает второе событие и переводится в режим состояния. Но ситуация вызваться не может, т.к. остается неактивированным последнее событие. Имеем 2 активированных события и одно неактивное. Если сейчас выключить двигатель, то деактивируется первое событие, а для того, чтобы сработала ситуация и выполнился ее обработчик должны быть одновременно активными все события, привязанные к ситуации.
Нет, но для упрощения будем рассматривать ее.Предполагается что перед выключением двигателя робот переключил трансмиссию в паркинг и колеса блокированы. Ну можно еще показания спидометра анализировать.
Вот, прекрасно, откуда вы ее возьмете?Да хоть аппаратным прерыванием. Это не важно.
В чем выгода?Тут ее либо сразу видишь, либо нет.
Ну и самое главное. Пока вы работаете с состояниями — вы вынуждены разделять состояния между обработчиками. Как вы будете разрешать возникающие коллизии?Тут не уловил, какие коллизии?
Тут ее либо сразу видишь, либо нет.
Тут не уловил, какие коллизии?
объяснить плюсы тоже не могу.
А, только последовательно. Они могут друг от друга зависеть.
С первого вопроса начиналась наша дисуссия. Планирую определять порядок выполнения приоритетами. В момент начальной загрузки каждого обработчика в нем проверяются зависимости и выставляется приоритет. Это пока первый приоритет.
По второму вопросу не ясно, блокировки на переменные может какие-то.
Вы представляете себе алгоритмическую сложность решения такой задачи? По идее, конечно, это обычная топологическая сортировка с выявлением колец, но мне почему-то кажется, что наличие условий либо сделает этот граф гигантским (а там все-таки NC2), либо переведет в другой класс.Потому тогда вначале и написал, что работоспособность такого подхода еще предстоит доказать.
Во-первых, «блокировки на переменные» вам не нужны: если вы сказали, что у вас обработчики выполняются только последовательно, у вас никогда не будет одновременного обращения.Теоретически, могут быть обращения из других потоков, между вызовами обработчиков в текущем потоке. Но это потом, не заморачиваюсь я сейчас темой параллелизма.
Кстати, а для каких задач оправдан ваш подход, по-вашему?
Теоретически, могут быть обращения из других потоков, между вызовами обработчиков в текущем потоке.
Так вот лингвистический процессор возможно сможет работать на таком подходе.
Можно будет на естественном языке описывать ситуацию и как нужно действовать, когда она наступит.
Если обработчики выполняются последовательно, то не важно, из каких потоков.В одном потоке точно будут выполняться только последовательно, но для разных пока не регламентировано.
Что вы понимаете под лингвистическим процессором? Разбор фразы?Да, разбор вопроса и поиск ответа.
Описать ситуацию на естественном языке — это одно дело. А среагировать на нее — это другое дело.Инструкции будут на том же языке. Это как раз второй подход, про который я говорил. Т.е. один язык для обмена информацией и для ее обработки. Эта тема заслуживает отдельной статьи. Подход тоже спорный и также не всем будет понятен.
Предположим, ситуация описана (не важно, естественным языком, или DSL). Какую функцию будет выполнять сама система, которая эти ситуации обрабатывает и реагирует на них?Обработчик будет содержать инструкции на том же языке, которые будут надиктовываться системе через тот же интерфейс, что и запросы к базе данных.
В одном потоке точно будут выполняться только последовательно, но для разных пока не регламентировано.
Да, разбор вопроса и поиск ответа.
Обработчик будет содержать инструкции на том же языке, которые будут надиктовываться системе через тот же интерфейс, что и запросы к базе данных.
(серьезно?)Да, разве не возможна псевдопараллельность в одном потоке, когда изменениями состояний эмулируется одновременное выполнение нескольких циклов?
Например, есть n обработчиков ситуации «баланс счета выше 100». Как обеспечить консистентность их работы?Не понимаю я этого. N перегруженных обработчиков? Но такого ничего не будет. А если в рантайме, то в единицу времени одни обработчик для текущего обрабатываемого счета. Мы же проводки все равно поодиночке грузим, хоть сервис, хоть что. А если нужно параллельно, то запускаем отдельный процесс и грузим отдельно, экземпляры обработчиков там свои будут.
(Замечу, что даже в вашем предполагаемом применении без параллелизма не обойтись)Пока обходился. Для каждого нового запроса создаю новый поток со своим экземпляром интерпретатора.
Эта задача вообще не требует «событий» и «ситуаций», она фиксирована и не меняется во времени.Это процесс обучения, добавление нового поведения, корректировка уже заложенного поведения.
Вы не поняли мой вопрос. Я спрашиваю, какие задачи будет решать эта система — проще говоря, зачем она нужна?Информационно-поисковая система позволяющая точно описывать то, что требуется найти. Не коммерция, чисто исследовательская работа.
Да, разве не возможна псевдопараллельность в одном потоке, когда изменениями состояний эмулируется одновременное выполнение нескольких циклов?
Не понимаю я этого.
А если в рантайме, то в единицу времени одни обработчик для текущего обрабатываемого счета.
Мы же проводки все равно поодиночке грузим, хоть сервис, хоть что.
А если нужно параллельно, то запускаем отдельный процесс и грузим отдельно, экземпляры обработчиков там свои будут.
Это процесс обучения, добавление нового поведения, корректировка уже заложенного поведения.
Когда доступ к коду не обязателен, или отсутствует.
Информационно-поисковая система позволяющая точно описывать то, что требуется найти.
Отчего такой интерес? Вы же никаких преимуществ для себя не отметили.
Да нет никакого «грузим проводки», откуда вы его берете?Оттуда что разрабатывал и внедрял банковское ПО.
Вот у вас игрушечная платежная система в интернетике. В один и тот же момент (а) пользователь решил перевести деньги на другой счет (б) активировалась запланированная операция и (ц) пришло списание из интернет-магазина.Ну а как такие конфликты решаются обычно. При помощи Logical unit of work, или по нашему ранзакциями. Какой платеж первым заблокировал данные, тот и обрабатывается. Остальные лочатся и ждут завершения транзакции. Эти механизмы можно надеть на любую парадигму. Не стоит на них сосредотачиваться.
Экземпляры обработчиков-то ладно, а что вы с данными будете делатьНичего не буду делать. В каждом отдельном потоке: ждем, пока остатки на счетах отпустят другие потоки, лочим их, меняем остатки обоих счетов, отпускаем для других потоков.
Это не имеет отношения к парсингу текста. Вы постоянно перепрыгиваете из задачи в задачу.Имеет, никто никуда не прыгает. Непосредственно разбор предложения и построение синтаксического дерева это только полдела. Если база знаний содержит даты рождений и может ответить на вопрос «Когда родлися Х?» то не факт, что имея данные об объемах двигателей она сможет ответить на вопрос «Объем двигателя модели Х больше объема двигателя модели Y?» Этот вопрос сравнительного характера, он более сложный, система должна его распознать. Кто будет добавлять возможность отвечать на новые типы вопоросов? Вы ответите — программист, и будете правы. А я отвечу — обычный человек будет это делать, не программист, он даже в код смотреть не будет. И я тоже буду прав. Только этому человеку соответствующий инструмент нужно дать.
есть тысяча и один подход,Ок, этот будет тысяча вторым. Я же не говорю, что на нем свет клином сошелся.
Продолжаю не понимать, откуда у вас там события.
Оттуда что разрабатывал и внедрял банковское ПО.
Какой платеж первым заблокировал данные, тот и обрабатывается. Остальные лочатся и ждут завершения транзакции. Эти механизмы можно надеть на любую парадигму. Не стоит на них сосредотачиваться.
Кто будет добавлять возможность отвечать на новые типы вопоросов? Вы ответите — программист, и будете правы. А я отвечу — обычный человек будет это делать, не программист, он даже в код смотреть не будет. И я тоже буду прав. Только этому человеку соответствующий инструмент нужно дать.
На любые входные данные можно наложить события. А для вычленения определенной совокупности входных данных (конкретный набор слов) эти события можно сложить в ситуацию и и работать как с целым.
Мы можем навесить на слово «мама» событие, которое будет выстреливать каждый раз когда на входе актором будет слово «мама». На слово мыть мы тоже навешиваем событие, как и событие на слово «рама» в качестве актанта. Объединяем все ри события в ситуацию.
Вот не надо за меня додумывать мои ответы. Если нам нужна система со внешним обучением, то совершенно не обязательно, что ее обучает программист. И да, ему надо дать инструмент для этого обучения… вот только вы определитесь, вы хотите разработать такой инструмент, или парадигму программирования?Инструмент. Но на этом подходе. Описал его, чтобы потом иметь возможность ссылаться. Да и сам тогда понимаешь лучше.
но вот называть каждое условие событием — строго ошибочно.Ну это игра терминов. Собствено, почему изначально назвалось событием, потому что переменная означающая актора изменилась со значения Х на значение «мама». Произошло событие. Это потом стало ясно, что оно имеет свойства и состояния, потому что оно не перестанет быть активным, пока значение переменной не измениться на другое. А ситуация это уже больше похоже на условие, когда одновременно имеют значение несколько событий.
Инструмент. Но на этом подходе. Описал его, чтобы потом иметь возможность ссылаться. Да и сам тогда понимаешь лучше.
Ну это игра терминов
Собствено, почему изначально назвалось событием, потому что переменная означающая актора изменилась со значения Х на значение «мама».
А почему обязательно на этом подходе? Чем этот подход лучше любого другого?Он похож на подход, которым человек объясняет правила (чего либо) другому человеу. Я приводил пример с объяснением хода в карточной игре. Вот в этом причина. Программирование
И никакого «значение переменно изменится на другое» у вас тоже не будет — вы просто выбросите все дерево целикомКак раз этого не планировал. Раз уж переменные глобальные (по крайней мере пока), будем посторно их использовать. А это значит, что в переменной до слова «мама» было значение из предыдущего предложения. И после его обработки это уже неинтересный мусор
Он похож на подход, которым человек объясняет правила (чего либо) другому человеу.
Я приводил пример с объяснением хода в карточной игре.
А это значит, что в переменной до слова «мама» было значение из предыдущего предложения. И после его обработки это уже неинтересный мусор
В этом примере, как мы уже обсуждали, ровно одно событие (и оно, на самом деле, просто триггер, в реальности мы анализируем набор данных, начинающийся с карты, с которой сходил противник).Так и есть одно событие, остальные уже стали состояниями. Правильно ли я понимаю, что переименование события в условие (так сказать, элементатное, неделимое условие) решит проблему? Ну а ситуация стало быть это сложное (составное) условие.
Правильно ли я понимаю, что переименование события в условие (так сказать, элементатное, неделимое условие) решит проблему?
Ну и да, то, что вы описываете — это полностью последовательная система, со всеми описанными недостатками.Вы цепляетесь к деталям. Си тоже последовательный, а параллельность работы потоков контроллируется объектами ядра (семаформаи, мьютексами). Проблема параллельности СУБД решается транзакциями. Это все наживные детали.
В ООП не требуется явным образом определять какие действия выполняются при изменении какого состояния, и не требуется объяснять почему это сделано так.
Этот подход — это своебразное развитие той же тенденции, кмк
Это надстройка над событийно-ориентированным программированием.
Позволяет упростить программирования за счет абстрагирования от разделяемого состояния. «Ситуации» и «условия» как раз его и абстрагируют
и у любого объекта есть ровно два события — «значение изменилось» и «значение равно x»).Тут нельзя ставить точку, самое главное в продолжении: события объединяются в логические группы, образую нечто, описывающее реальную ситуацию из жизни
В примере с машиной — есть ситуация езды, а есть ситуация стоянки. Поведение машины (как реакция на внешние события) в этих состояниях отличается. Если мы пользуемся такой формой абстракции — это упрощает программирование поведения и внесение изменений в код.
В примере с машиной — есть ситуация езды, а есть ситуация стоянки. Поведение машины (как реакция на внешние события) в этих состояниях отличается. Если мы пользуемся такой формой абстракции — это упрощает программирование поведения и внесение изменений в код.
int Main(int arg)
{
var n = SomeFunc(arg);
return 0;
}
Это надстройка над событийно-ориентированным программированием.
Отличается наличием диспетчера, который мониторит состяние и запускает «ситуации», если «условия» сработали.
Позволяет упростить программирования за счет абстрагирования от разделяемого состояния. «Ситуации» и «условия» как раз его и абстрагируют
Любая интеллектуальная система подразумевает наличие процесса обучения… Такое изменение поведения должно выполнятся специальными средствами метапрограммирования и в конечном счете приводит к внесению изменений в исходный код интеллектуальной программы.
и делает практически невозможным изменение программой самой себя
Во-первых, дополнительное условие if (s[i]==c) нельзя добавить в произвольное место программы, а только внутрь цикла FOR.
Во-вторых, поскольку внутри цикла FOR теперь больше одной инструкции, его нужно дополнить фигурными скобками.
В-третьих, порядок добавляемых инструкций не является произвольным. Их перестановка приведет к некорректному поведению программы
И тогда, в определенный момент запустится ее обработчик, который будет смотреть «есть ли у меня козырь?»…
Только практика покажет, придется проблему решать, или лучше игнорировать ...
избавляет от изучения смежных блоков кода
делает исходный код менее строкозависимым
выносит ветвление и цикличность за рамки кода, оставляя только простой линейный алгоритм
допускает изменение исходного кода непосредственно в момент выполнения программы
делает разработку кода более похожей на процесс мышления человека, что может снизить требуемый уровень подготовки разработчика
потенциально может упростить процесс автоматизированного изменения поведения программ
задумайтесь о возможностях, которые открываются, когда одни программы могут автоматизированно (и осмысленно) изменять другие программы.
Иначе: почему бы не приложить усилия и сделать прототип самостоятельно, чтобы продвинуть обсуждение вперед?
Уважаемый потенциальный Папа Римский, задумайтесь о возможностях, которые открываются, когда одни программы могут автоматизированно (и осмысленно) изменять другие программы.
Можете привести примеры, когда самомодификация упрощает написание и поддержку кода?Когда она их полностью заменяет
К сожалению, не смешно.За время переписки я достаточно о вас узнал, чтобы предугадать это.
вы правда думаете, что в искусственном интеллекте самомодификация заменяет написание и поддержку кода?Нет, там работает CLIPS, которая просто модифицирует правила.
(более важный) действительно ли предлагаемая парадигма упрощает написание самомодифицирующихся программ?Тут стоит разделить на самомодификацию с учителем и без. С учителем однозначное да. По тому видео вы возможно и сами это понимаете, но не хотите признавать. Т.к. там приведен яркий пример ситуативного программирования. Что касается обучения без учителя, то на данный момент нет. Вернее я пока такой возможности не вижу, но она потенциально присутствует. Собственно я много чего не видел, до начала реализации. Только не спрашивайте чего именно не видел, т.к. конкретно ответить не смогу. Не видел в целом картины взаимодействия компонентов, так, как вижу ее сейчас. И это видение постоянно расширяется в результате обсуждений и попыток реализации. При этом важно как первое, так и второе, даже неизвестно что важенее больше. Я к тому, что не реализовав подход, мы этого не узнаем наверняка.
Тут стоит разделить на самомодификацию с учителем и без.
Много вы знаете самомодифицирующихся систем искусственного интеллекта?Кроме вредоносных, пытающихся изменить свою сигнатуру, не знаю
(мене важный) приносит ли способность програм к самомодификации выигрыш при их написании и поддержке?Тут главное, что мы ожидаем от этого, и что получим в результате. Всем известно, что программист во время написания кода должен сосредотачиватся, чтобы держать как можно больше объектов в голове. Если программа сама будет брать на себя хотя бы это, уже будет выиграш. Меньше нагрузка на мозг, меньше ошибок.
Что программа будет «брать на себя»?Будет уменьшать количество объектов, состояние которых программист должен учитывать в один момент времени. Если он оперирует ситуацией, то держит в голове только объекты задействованные в ней.
Кстати, вы не правы. Чем лучше устроена программа, тем меньше объектов программисту нужно держать в голове. Именно для этого нужен information hiding, который вашим подходом отвергаетсяНе отвергается. Этот вопрос пока не урегулирован. Незначимые для глобального уровня объекты возможно будут прятаться.
И в чем это будет выражаться?Слово «возможно» подразумевает, что это на данном этапе реализации не известно.
Действительно, этот момент не был рассмотрен в статье автора. Неявно как бы предполагалось, что все подписки и отписки сделаны во время инициализации.
Если в алгоритме переменная используется в нескольких местах по-разному.
Парадигма ситуационно-ориентированного программирования