LINUX.ORG.RU

Парадигма ситуационного программирования. Разработка интерпретатора

 


0

3

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

Разрабатываю интерпретатор языка. Код выглядит примерно так. Разработка интерпретатора ведется на языке Python 2.7 под Ubuntu. Код открыт.

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

Буду рад желающим принять участие в проработке парадигмы и разработке интерпретатора.

Как это соотносится с прологом (prolog)? Ты знаком с этим языком программирования?

dave ★★★★★ ()

тонко!

Твой код очень похож на одно глобальное состояние которое меняется одно-строчными командами-«атомами»

и отсутствие циклов - ты ведь не отказался от стека вызовов :) -а вообще как ни странно вот

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

ps. http://hosting.vspu.ac.ru/~chul/dijkstra/goto/goto.htm либо первоисточник(не на голландском и то хорошо) - https://www.cs.utexas.edu/users/EWD/ewd02xx/EWD215.PDF

qulinxao ★★☆ ()

Открыл код, испугался, закрыл, ухожу из треда пока мозг не вытек.

MLP_Fan ★★ ()

Чем это лучше brainfuck, кроме многословности?

RazrFalcon ★★★★★ ()

Это вариант брейнфака?

drull ★☆☆☆ ()
создавать ?что (=интерпретатор ?что программировать ?что дичь ?какой %WTF).

Просто дико укуренная игра в «Что? Где? Когда?» какая-то.

aido ★★ ()

Код выглядит примерно так.

Ты или от латиницы откажись, или от кириллицы. Адская нечитабельная смесь.

устанавливать ?что приоритет (?чего триггер, ?какой 3).

Без запятых и скобочек — никак?

процедура TP001
процедура TP002
процедура СP001
процедура СP002
процедура СP003
процедура СP004
процедура СP005
процедура СP006

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

Manhunt ★★★★★ ()

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

https://ru.wikipedia.org/wiki/Таблица_принятия_решений
https://en.wikipedia.org/wiki/Decision_table

Manhunt ★★★★★ ()

Как это соотносится с прологом (prolog)? Ты знаком с этим языком программирования?

Знаком. Думаю никак. Эта разработка несколько в другой плоскости.

и отсутствие циклов - ты ведь не отказался от стека вызовов :)

Цикличность и ветвление скрыты от разработчика, их как бы берет на себя интерпретатор, и вложенность/последовательность вызовов тоже.

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

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

Добавлю про «Что? Где? Когда?». Я называю их линкатами, в лингвистике они называются валентностями. Эти связки соединяют все понятия воедино и позволяют создавать сложные составные смысловые конструкции. Но вместе с тем, такая форма записи более упорядоченна по сравнению с действительно естественным языком, т.е. она более формальна - более понятна машине, легче обрабатывается, и в то же время легко понятна человеку, при условии, что он знаком с правилами построения. Предложения на естественном языке могут быть разложены и представлены в форме записи с использованием валентностей. Т.е. потенциально, в перспективе, ничто не мешает писать программные инструкции на действительно естественном языке, потом программно переводить их в промежуточный язык с валентностями и, если все валентности удалось корректно определить и заполнить, уже его выполнять.

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

Пример соответствия естественного языка и языка с валентностями. Суждение «синусоида ?что есть ?что функция ?какая тригонометрическая» означает «синусоида это тригонометрическая функция».

rimsleur ()
Ответ на: комментарий от rimsleur

В языке с валентностями суждение (предложение) выглядит в форме дерева (поэтому без скобок никак)
Предложения на естественном языке могут быть разложены и представлены в форме записи с использованием валентностей.

Дерево — это результат разбора исходного кода. А вот нафига засилие скобочек в собственно исходном коде — так и не ясно, ведь естественный язык без них преспокойно обходится! Скобки можно было бы требовать лишь в тех частных случаях, когда не получается однозначным образом построить дерево разбора.

Manhunt ★★★★★ ()
Ответ на: комментарий от Manhunt

Ты или от латиницы откажись, или от кириллицы. Адская нечитабельная смесь.

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

Без запятых и скобочек — никак?

Запятыми и скобочками организуется древовидная структура инструкций. Например, возьмем две похожие инструкции:

1. установить ?что значение (?чего поля, ?какое 1).
2. увеличить (?что значение ?чего поле, ?на-сколько 1).
Первая инициализирует переменную «поле» значением «1», вторая увеличивает значение этого поля на единицу. Как видно, открывающие скобки стоят в разных местах. Это не просто так.

Валентность может соединять только два понятия, образуя при этом триаду понятие1-валентность-понятие2. В первой инструкции открывающая скобка стоит после слова «значение», а во второй - после слова «увеличить». Все потому, что первая инструкция раскладывается на две независимые пары триад:

установить ?что значение ?чего поля.
установить ?что значение ?какое 1.
В данном случае и "?чего поля" и "?какое 1" относятся к понятию «значение», поэтому открывающая скобка и указывается после слова «значение». Т.е. триады «значение ?чего поля» и «значение ?какое 1» наделены смыслом. Если скобки убрать, то получится: «значение ?чего поля» и «поля ?какое 1». Тут вторая триада: «поля ?какое 1» является бессмысленной.

Вторая инструкция также может быть разбита на компоненты:

увеличить ?что значение ?чего поля.
увеличить ?на-сколько 1.
Тут "?на-сколько 1" относится к понятию «увеличить», потому открывающая скобка находится после слова «увеличить». Т.е. триады «увеличить ?что значение» и «увеличить ?на-сколько 1» имеют смысл. Что будет, если скобку переставить после слова «значение» или удалить скобки вообще...

Если открывающую скобку переставить:

увеличить ?что значение (?чего поля, ?на-сколько 1).
Получится следующий набор компонентов:
увеличить ?что значение
значение ?чего поля
значение ?на-сколько 1
Последняя триада является некорректной.

Если скобки убрать вообще:

увеличить ?что значение ?чего поля ?на-сколько 1.
то инструкция разобьется на следующие сочетания:
увеличить ?что значение
значение ?чего поля
поля ?на-сколько 1.
Последняя триада также некорректная.

rimsleur ()
Ответ на: комментарий от Manhunt

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

Конкретно эти процедуры, это обработчики ситуаций (условий), их имена технические и не важны, их вообще может не быть. В будущем вид каждой из этих процедур будет заменен на полноценное описание ситуаций. Т.е. вместо них будут записи следующего вида:

условие
(
    предпосылка1,
    предпосылка2,
    ..
    предпосылкаN
)
{
    Программный код условия
}
В круглых скобках указывается перечень предпосылок, которые запускают на выполнение код обработчика данной ситуации. Предпосылки это другими словами состояния и события программных объектов: полей (переменных), списков (массивов), записей (структур), таблиц. Каждая ситуация состоит из одной или более таких предпосылок (состояний/событий). Предпосылки я называю триггерами. У них только два состояния: установлен и сброшен. В момент когда все триггеры входящие в ситуацию находятся в установленном состоянии, срабатывает запуск обработчика этой ситуации.

rimsleur ()
Ответ на: комментарий от Manhunt

https://ru.wikipedia.org/wiki/Таблица_принятия_решений

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

условие
(
  погас свет в комнате
)
{
  проверить свет в соседней комнате.
}

условие
(
  погас свет в комнате,
  cвет в соседней комнате горит
)
{
  поменять лампочку.
}

условие
(
  погас свет в комнате,
  cвет в соседней комнате не горит
)
{
  проверить свет у соседей.
}

условие
(
  погас свет в комнате,
  cвет в соседней комнате не горит,
  свет у соседей горит
)
{
  проверить пробки.
}

условие
(
  погас свет в комнате,
  cвет в соседней комнате не горит,
  свет у соседей не горит
)
{
  позвонить диспетчеру.
}

rimsleur ()
Последнее исправление: rimsleur (всего исправлений: 2)
Ответ на: комментарий от rimsleur

Пояснение по предыдущему алгоритму.

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

rimsleur ()
Ответ на: комментарий от rimsleur

Если погас свет в комнате - проверить свет в квартире. Если нет света в квартире - проверить пробки. Если пробки не выбили - спросить соседей.

andregin ()
Последнее исправление: andregin (всего исправлений: 1)
Ответ на: комментарий от Manhunt

ведь естественный язык без них преспокойно обходится!

Я бы сказал, что это не ЕЯ без них спокойно обходится, а человек спокойно выполняет разбор неполного текста благодаря своим знаниям о мире.

Например, как передать машине такое предложение: «Трофей не влезал в чемодан, потому что он был слишком маленьким (большим).»? Человеку понятно, что если в предложении будет указано «маленьким», то местоимение «он» это ссылка на «чемодан», а если будет указано «большим», то «он» это ссылка на «трофей». Такая же проблема возникает при использовании омонимии в тексте.

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

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

rimsleur ()
Ответ на: комментарий от andregin

Если нет света в квартире - проверить пробки.

Обычно человек так и сделает. Я отталкивался от таблицы в примере по ссылке, и получилось так, как получилось. В данном случае, то, как будет выглядеть код важнее содержимого шагов.

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

rimsleur ()
Последнее исправление: rimsleur (всего исправлений: 1)

Похоже на пролог с укуренным синтаксисом. Т.е. идея прологовская а вот запись - нечто оригинальное. Мое мнение - стоит больше сосредоточится на развитии самой формы записи и либо забить на парадигму либо взять готовые решения, тем более что rete-1 открыт.

ya-betmen ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.