Регистрация | Войти
Lisp — программируемый язык программирования
RSS
Экспертная система с WEB-интерфейсом
R1DDLE - 11.12.2018 17:16, Сообщений - 12
Здравствуйте!

Давно читаю о lisp, в том числе на ресурсе lisper.ru. Вдохновлён  статьями про Web на lisp и lisp в целом.
Практически ничего ещё не написал на lisp и ничего крупного на других языках программирования.

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

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

Интерфейс решил в первоначальном варианте делать Web, но с архитектурной возможностью минимальными усилиями перевести его на desktop. Подумываю реализовать декларативный DSL, в котором описываются необходимые элементы интерфейса и их логические, структурные взаимосвязи. Движок этого DSL должен будет сам строить интерфейс под размер окна/экрана. Думаю с таким подходом для переноса на desktop достаточно будет заменить часть DSL генерирующую html код на вызовы какой-либо GUI-библиотеки. Так же изначальная версия с Web-интерфейсом открывает возможность демонстрировать людям программу просто указав ссылку в интернете, где будет на VPS работать экспериментальная версия. Возможно кому-то станет интересно и появятся люди, которым интересно помогать развивать Web-версию как открытый продукт.

Собственно с этого места начинаются мои вопросы. Мне нужна помощь в том, чтобы сориентироваться как организовать процесс разработки и взаимосвязи emacs, slime, sbcl, место хранения исходников, удалённый доступ к исходникам и работающему Web-приложению. (Часто бываю в командировках и хотелось бы не носить с собой на флешке проект и не мучатся с запуском его на разных ОС. Думаю лучше иметь доступ из Emacs к VPS и запущенному образу программы на нём).

Подскажите пожалуйста по каким запросам что почитать, на что обратить внимание, а на что точно не нужно тратить время, как минимум для начала:
  1. Как организовать работу с разных ПК под разными ОС, с условием, что на каждой есть Emacs и slime к моей программе в VPS так, будто она на локальной машине?
  2. Где при этом должны быть исходники? С собой на флешке? Могут быть на VPS вместе с программой?
  3. Как всё это взаимодействует? Как редактировать, добавлять исходники и подгружать их в работающую программу?
  4. Какие библиотеки лучше использовать, чтобы особенно не концентрироваться на реализации Web-интерфейса, при этом сохраняя возможность в перспективе организовать этими же средствами многопользовательский авторизованный доступ к программе, например как к форуму?
  5. При условии что программа для своих вычислений должна использовать большое количество данных в виде похожем на базу данных. Эти данные изменяются. Хранится  на диске должны в удобочитаемом виде для человека, а в памяти программы являются узлами сложного дерева. Есть ли смысл реализовывать свою базу данных  на lisp или выше производительность программы будет при использовании внешней распространённой базы данных? 
Другими словами я вижу прогресс программы таким:
  1. Простой сайт на lisp с единственной страницей, где есть поля ввода и поля куда будет осуществляться вывод результата или передача клиенту файла с результатом. На этом этапе я единственный пользователь, кроме меня доступа нет ни у кого, даже адреса нет, только IP.
  2. Более-менее существенный функционал, где могут быть другие пользователи, которым я буду демонстрировать программу, возможно первые реальные пользователи.
  3. Достаточно сложный ресурс с AJAX, динамических интерфейсом, множеством пользователей и самое главное - ресурсоёмкими вычислительными задачами для каждого пользователя. Анимированная графика (графики, схемы принципиальные, анимация физики процессов)
Подскажите пожалуйста куда капать, что читать, чтобы сразу организовать себе удобную и эффективную для разработки и тестирования инфраструктуру и в одиночку максимально быстрыми темпами прийти к пункту 2 или даже между 2 и 3.

Спасибо за уделённое моему вопросу время!
[#]

Давно подхожу к реализации одного интересного мне проекта. Долго выбирал какой инструмент использовать. Недавно пришёл к выводу, что нужен lisp. Так как до конца не понятно как будет работать и как будет устроен проект, нужны эксперименты. Мало ресурсов - я один буду делать первую предварительную версию, а дальше надеюсь на либо сообщество, либо спонсоров.<< Прототип на лиспе, когда идея выкристаллизуется, рассмотреть варианты.

Интерфейс решил в первоначальном варианте делать Web, но с архитектурной возможностью минимальными усилиями перевести его на desktop. Подумываю реализовать декларативный DSL, в котором описываются необходимые элементы интерфейса и их логические, структурные взаимосвязи. Движок этого DSL должен будет сам строить интерфейс под размер окна/экрана. Думаю с таким подходом для переноса на desktop достаточно будет заменить часть DSL генерирующую html код на вызовы какой-либо GUI-библиотеки. Так же изначальная версия с Web-интерфейсом открывает возможность демонстрировать людям программу просто указав ссылку в интернете, где будет на VPS работать экспериментальная версия. Возможно кому-то станет интересно и появятся люди, которым интересно помогать развивать Web-версию как открытый продукт.
<< Большая задача, лучше сосредоточиться на тонком клиенте. Для desktop у открытых реализаций CL нет нормальных кроссплатформенных биндингов для GUI.
  1. Как организовать работу с разных ПК под разными ОС, с условием, что на каждой есть Emacs и slime к моей программе в VPS так, будто она на локальной машине? << Читать про SLIME. Фактически, в образе лисп-системы крутится сервер, к которому обращается клиент из Emacs. M-x slime-connect.
  2. Где при этом должны быть исходники? С собой на флешке? Могут быть на VPS вместе с программой? << В системе контроля версий. Git как VCS и github как хранилище одни из самых популярных. Независимо от этого забыть сохранить изменения из буфера Emacs или потерять что-то при сборе образа системы - одни из любимых граблей при разработке на CL.
  3. Как всё это взаимодействует? Как редактировать, добавлять исходники и подгружать их в работающую программу? << Как обычно в slime - написать/открыть в буфере Emacs с включённым SLIME и загрузить в образ системы.
  4. Какие библиотеки лучше использовать, чтобы особенно не концентрироваться на реализации Web-интерфейса, при этом сохраняя возможность в перспективе организовать этими же средствами многопользовательский авторизованный доступ к программе, например как к форуму? << Реализовать клиент-серверную архитектуру, клиентскую часть писать как обычное web-приложение, инструментов больше и они более стабильные, чем библиотеки чистого CL. Если хочется именно на CL, то посмотреть, как сделан данный сайт.
  5. При условии что программа для своих вычислений должна использовать большое количество данных в виде похожем на базу данных. Эти данные изменяются. Хранится  на диске должны в удобочитаемом виде для человека, а в памяти программы являются узлами сложного дерева. Есть ли смысл реализовывать свою базу данных  на lisp или выше производительность программы будет при использовании внешней распространённой базы данных? << Последнее. Postgres, например. Зачем удобочитаемость при хранении?
Исходя из вышеописанного я бы предложил идею реализовать локально, не задумываясь пока о развёртывании на стороне и многопользовательском режиме. Параллельно осваивать технологии. После этого станет понятно, как и что нужно показывать.
EO - 11.12.2018 17:42
[#] Ответ на комментарий от EO 11.12.2018 17:42
EO >> "Исходя из вышеописанного я бы предложил идею реализовать локально, не задумываясь пока о развёртывании на стороне и многопользовательском режиме. Параллельно осваивать технологии. После этого станет понятно, как и что нужно показывать."

Для обеспечения "мобильности" разработки есть ли способ организовать хотя-бы portable конфигурацию emacs+slime+sbcl и автоматически подключаемому к этой связке каталогом с файлами проекта. С запуском в настроенном как мне нужно виде с usb-накопителя на любой windows-машине?
R1DDLE - 11.12.2018 17:47
[#] Ответ на комментарий от R1DDLE 11.12.2018 17:47
Думаю да. Emacs, quicklisp и SBCL установить в отдельные папки, установить нужные пакеты, рядом положить папку для работы с исходниками.
Прописать пути до всего через вспомогательные переменные окружения. Написать простой batch, который будет выставлять значения PATH, HOME- и своим переменным, после этого запускать Emacs. При включении slime mode он из настроек увидит окружение и подтянет пакеты/запустит процесс CL. Это в теории.

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

Обычно мобильность разработки обеспечивается наличием личного ноута. Ценные вещи нужно не забывать периодически сбрасывать в резервные хранилища.
EO - 11.12.2018 17:56
[#] Ответ на комментарий от EO 11.12.2018 17:42
 EO >> "<< Последнее. Postgres, например. Зачем удобочитаемость при хранении?"

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

(def-elemet
   :name Резистор
   :type-value Ом
   :value 10
   :inputs 1 (inI inU)
   :outputs 1 (outI outU)
   :model-U (* I value)
   :model-I (/ U value)
)

EO >> "<< Прототип на лиспе, когда идея выкристаллизуется, рассмотреть варианты."
Изначально хотел сразу на Ada 2012 реализовать. Но на данном этапе слишком много нужно отвлекаться на низкоуровневые детали реализации.
R1DDLE - 11.12.2018 17:58
[#] Ответ на комментарий от R1DDLE 11.12.2018 17:58
Нужно разделять модель данных и само хранилище. Если нужно редактировать значения или некритичный для работы состав таблиц, то для этого есть инструменты. Код всё равно нужно писать, но это не велосипед.
Если сама модель данных может сильно меняться, то можно рассмотреть вариант с генерацией схемы БД. Другое дело, что автоматизировать отслеживание таких изменений и адаптацию кода без большой ручной работы - задача нетривиальная. Корректное наполнение тестовыми данными - тоже.

В старых системах встречались хранилища на plain text файлах, но тут встаёт вопрос производительности. 

Если это не хранилище, а именно описание модели, то это просто кусок исходников проекта, из которых получается набор данных в памяти. Code is data и вот это всё. Пример выше может разворачиваться в defstruct с генерацией всяких вспомогательных вещей, например. Генерировать такой код модели из внешних источников тоже можно.

Но на данном этапе слишком много нужно отвлекаться на низкоуровневые детали реализации << Сначала советую отвлечься хотя бы на примерную модель данных и data flow, понять, что будет наполняться руками, что генерироваться, что будет подгружаться со стороны, как примерно преобразовываться. Прикинуть, что из этого в процессе поисков будет меняться, а что трогать не потребуется. Дальше станет понятно, что и как хранить.
EO - 11.12.2018 18:11
[#] Ответ на комментарий от EO 11.12.2018 18:11
EO >> "Если это не хранилище, а именно описание модели, то это просто кусок исходников проекта, из которых получается набор данных в памяти. Code is data и вот это всё. Пример выше может разворачиваться в defstruct с генерацией всяких вспомогательных вещей, например. Генерировать такой код модели из внешних источников тоже можно."

В первую очередь по этой причине обратил внимание на lisp. Возможность без трудоёмкого написания парсеров и их модификации в связи с изменением модели данных загружать через макросы или другие стандартные инструменты lisp'а данные как код.

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

По моменту "Генерировать такой код модели из внешних источников тоже можно." до сих пор не могу точно сориентироваться, есть ли разница в трудоёмкости  в изменении кода загрузки в память описания моделей и IF-THEN последовательностей по причине изменения изменения модели данных в реализации на lisp и в реализации на Ada или, например на C++...

EO >> "В старых системах встречались хранилища на plain text файлах, но тут встаёт вопрос производительности. "
Тут тоже не понятно что будет быстрее работать, загрузка описания моделей парсером lisp'а по принципу code is data или создание объектов в памяти программы на основе содержимого БД. Как я понимаю в последнем случае скорость слабо зависит от конкретного используемого компилируемого в машинный код ЯП.
R1DDLE - 11.12.2018 18:37
[#] Ответ на комментарий от R1DDLE 11.12.2018 18:37
Для начала предлагаю остановиться на файлах с кодом на DSL, которые загружаются стандартным образом.
С точки зрения разработки будет быстрее.
Для боевого решения скорость будет ограничиваться на чтении из БД, так что язык вторичен (если не брать разогрев, in-memory, наличие шустрых биндингов и т.д., этот вопрос тут вряд ли встанет). В БД можно хранить те же строки, которые быстро находить по ключу. А строка - это тот же исходник.
EO - 11.12.2018 18:45
[#] Ответ на комментарий от EO 11.12.2018 18:45
Большое спасибо EO за советы и рекомендации!

Если будут ещё мысли, советы, уточнения - буду рад!
R1DDLE - 11.12.2018 18:47
[#]
Поздравляю! Какое-то время тому назад, тоже было желание напсать что-то подобное. Но никогда не мог придумать куда его применить. :)
У вас есть практическое применение и это уже хорошо.
Извините за любопытство человека несведующего, а почему не CLIPS? Он вроде бы специально заточен для разработки экспертных систем.

ilowry - 11.12.2018 22:13
[#] Ответ на комментарий от ilowry 11.12.2018 22:13
ilowry >> "Извините за любопытство человека несведующего, а почему не CLIPS? Он вроде бы специально заточен для разработки экспертных систем."

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

Таким образом, благодаря Common lisp, есть возможность построить систему от общего к частному. Где есть базовые стратегии и алгоритмы. Наборы эвристик и прочих вспомогательных алгоритмов для них. И при этом на каждом последующем этапе работы системы, можно компилировать код следующего этапа работы включая нужные эвристики и алгоритмы, вырезая не нужные в данном частном случае. То есть привнести в систему мутабельность с целью повышения скорости вычисления.
R1DDLE - 12.12.2018 13:15
[#] Ответ на комментарий от ilowry 11.12.2018 22:13
Плюс в перспективе, когда алгоритмы будут проверены и испытаны, можно добавить функционал, позволяющий во время исполнения программы, некоторые алгоритмы компилировать на язык GPU и вычислять их на GPU.
R1DDLE - 12.12.2018 13:27
[#] Ответ на комментарий от ilowry 11.12.2018 22:13
Спасибо за поздравление!
Возможно, когда появится рабочая версия программы достойная для презентации обществу, Вам будет интересно присоединиться.
R1DDLE - 12.12.2018 13:29
@2009-2013 lisper.ru