Форум myROBOT.ru » Лаборатория » Алгоритмы » Задача проектирования - создание "компилятора"

Страниц (3): [1] 2 3 »
 

1. romeo - 14 Мая, 2011 - 20:16:24 - перейти к сообщению
Доброго времени суток.
Нам сейчас необходимо решить примерно следующую задачу
1. Есть скриптовый язык, программа на котором представляет собой XML выражение
2. Язык относительно простой - основные используемые операции
присвоение
вычисление значения функции (функций определено очень много, есть функции от функций)
условия
циклы
определение собственных функций
Классов, преобразований типов, указателей и пр. - ничего этого нет.
3. Стоит задача написания "процессора" на Java для исполнения программы на данном языке
4. Предполагается следующий вариант работы - система получает запрос на выполнение программы, выполняет ее в реальном времени и возвращает результат
5. Результат также представляет собой XML выражение, состоящее из тех же тегов, что и программа
6. Система многопользовательская (запросов одновременно может быть несколько), серверные ресурсы ограничены, поэтому вопросы производительности имеют значение
7. Предполагается, что "процессор" сначала будет некоторым образом транслировать программу в определенный набор Java объектов (связь многие ко многим)
одна команда - один объект
одна команда - несколько объектов
несколько команд - один объект
несколько команд - несколько объеков,
а затем работать с данными объектами.

В связи с этим необходимо решить
1. В виде какой структуры представлять и обрабатывать Java представление?
2. Какой алгоритм использовать для обхода и расчета дерева?
3. Можно ли как-то написать такую реализации, которая бы допускала параллельные вычисления?
и реализовать сам "процессор" :-)

Есть у кого-нибудь какие-нибудь мысли/ссылки/материалы, которые помогут в этом продвинуться?
Интересует именно самая общая идея-концепция, куда двигаться. С деталями готовы справляться сами.

Сама задача - это продолжение вот этого http://myrobot.ru/forum/topic.ph...=10&topic=24 , ну и развитие проекта http://webequa.org
2. killgur - 15 Мая, 2011 - 00:04:16 - перейти к сообщению
Видимо w3 консорциум уже решил все проблемы интернета, раз решил заняться такой ахинеей.
MAPL-a им чтоли не хватает.
3. romeo - 15 Мая, 2011 - 10:37:57 - перейти к сообщению
W3C сам решит, чем им заниматься.
По теме есть что сказать?

killgur пишет:
Видимо w3 консорциум уже решил все проблемы интернета, раз решил заняться такой ахинеей.
MAPL-a им чтоли не хватает.
4. -dead- - 15 Мая, 2011 - 11:51:16 - перейти к сообщению
Не понимаю, а в чем проблема? Напишите транслятор вашего XML в Java, прописав нужный вам упрощенный или полный XML-формат вывода результата, скормите это Java-компилятору, выполните код, верните результат, преобразовав его в XML если требуется.
5. killgur - 15 Мая, 2011 - 12:11:37 - перейти к сообщению
romeo пишет:
W3C сам решит, чем им заниматься.
По теме есть что сказать?

killgur пишет:
Видимо w3 консорциум уже решил все проблемы интернета, раз решил заняться такой ахинеей.
MAPL-a им чтоли не хватает.



По делу могу сказать, что если Вы в курсе, что существуют такие проекты как

http://www.sagemath.org/

и

http://sax.sourceforge.net/ (это про java парсинг xml)

то, что требуется еще кроме математического гения и искусства программиста?

И причем тут компилятор ... это скорей всего парсер называется если на входе xml и на выходе xml.
6. romeo - 15 Мая, 2011 - 12:49:04 - перейти к сообщению
Про http://www.sagemath.org/ - раньше не слышал, информация очень интересная, спасибо.
В части заявленной миссии Mission: Creating a viable free open source alternative to Magma, Maple, Mathematica and Matlab существует http://www.scilab.org/
С первого взгляда все аналогичные проекты - прямые конкуренты друг друга и коммерческого ПО. Остается надеяться, что область прикладных вычислений настолько большая, что места хватит всем.

По поводу этого
Цитата:
Не понимаю, а в чем проблема? Напишите транслятор вашего XML в Java, прописав нужный вам упрощенный или полный XML-формат вывода результата, скормите это Java-компилятору, выполните код, верните результат, преобразовав его в XML если требуется.


и этого
Цитата:
то, что требуется еще кроме математического гения и искусства программиста?


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

Понятно, что одного однозначного ответа тут не будет, но, возможно, кто-то предложит направление / соображение, куда смотреть - например, в сторону нейронных сетей :-)
7. -dead- - 15 Мая, 2011 - 13:19:26 - перейти к сообщению
"Хочу сделать то, не знаю что. Подскажите литературу, как это сделать оптимальней?" Улыбка

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

Для сохранения состояния программы и т.п. - проще всего посмотреть в сторону родных Java-инструментов выполнения - скорее всего там уже есть какие-то решения по управлению загрузкой.

"Как обходить это дерево" а какие есть варианты? Как только вы добавили ветвления и циклы - вы автоматически определили, что обходить всё будете последовательно. И вообще для параллелизма обычно явно в язык внедряют соотв. конструкции, которые скажем гарантируют, что вот эти 2 блока кода можно выполнять параллельно - они друг другу вообще ничего не передают.
8. romeo - 15 Мая, 2011 - 13:48:54 - перейти к сообщению
Конкретные вопросы:
1. в виде какой структуры хранить набор объектов, каждый из которых представляет собой определенную команду "скриптового" языка
2. как учесть 2.1 ограниченную мощность ресурсов 2.2 наличие нескольких параллельных серверов

Для простоты можно предположить, что второго вопроса пока нет.

-dead- пишет:
"Хочу сделать то, не знаю что. Подскажите литературу, как это сделать оптимальней?" Улыбка

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

Для сохранения состояния программы и т.п. - проще всего посмотреть в сторону родных Java-инструментов выполнения - скорее всего там уже есть какие-то решения по управлению загрузкой.

"Как обходить это дерево" а какие есть варианты? Как только вы добавили ветвления и циклы - вы автоматически определили, что обходить всё будете последовательно. И вообще для параллелизма обычно явно в язык внедряют соотв. конструкции, которые скажем гарантируют, что вот эти 2 блока кода можно выполнять параллельно - они друг другу вообще ничего не передают.
9. killgur - 15 Мая, 2011 - 14:24:44 - перейти к сообщению
romeo пишет:
Конкретные вопросы:
1. в виде какой структуры хранить набор объектов, каждый из которых представляет собой определенную команду "скриптового" языка
2. как учесть 2.1 ограниченную мощность ресурсов 2.2 наличие нескольких параллельных серверов

Для простоты можно предположить, что второго вопроса пока нет.



Стоит перейти от сложных слов к простым и наконец изучить Apache Tomcat Servlet/JSP container.

Вряд ли тут есть большие спецы по этому модулю.
10. -dead- - 15 Мая, 2011 - 15:02:13 - перейти к сообщению
В общем я так понял основной вопрос - как управлять пачкой параллельно выполняющихся Java-процессов, это надо у спецов по серверным приложениям на Java спрашивать надо, и пожалуй действительно надо посмотреть в сторону web-серверных приложений, там как раз задача пачку независимых запросов обрабатывать.
11. killgur - 15 Мая, 2011 - 15:33:57 - перейти к сообщению
На самом деле все заданные вопросы давно решены т.е. как хранить как выполнять и как организуется параллельная обработка запросов и.т.п. это уровень сервера... который уже готовый.

Его надо качать, ставить на никсы естественно и "курить маны".

А, что под сервер писать ... это вот уже личный выбор каждого.
12. romeo - 15 Мая, 2011 - 16:40:24 - перейти к сообщению
Вы меня не так поняли... :-)
Да, действительно - вся система будет реализована как web приложение в виде jsp/beans на JSP контейнере (Tomcat, JBOSS и пр).
Да, вопросы обработки параллельных запросов и балансирования нагрузки как-то решаются на уровне этого самого JSP контейнера.
Но в данном случае речь идет не об оптимизации обработки всех запросов вместе, а об оптимизации обработки одного конкретного запроса.
Попробую объяснить еще раз.
Например, надо вычислить что-то типа a1(a2,a3) = a2(b1,b2) +a3(c1,c2(d1)))
Есть варианты
1. Можно сделать полное представление этого в виде java объектов
a1, a2, a3
b1, b2
c1, c2
d1
Потом считать последовательно с2, a3, a2, a1.
2. Можно распараллелить вычисление a2 и a3 между разными агентами и в каждом из них представлять только необходимые объекты.
3. Можно остановить на втором уровне - т.е. сначала посчитать a2 и с2, а затем полностью повторить все для выражения a1(a2,a3) = a2 +a3(c1,c2) (без сохранения промежуточного результат)

Вопрос - какой вариант выбрать.
13. killgur - 15 Мая, 2011 - 17:27:48 - перейти к сообщению
romeo пишет:
Вы меня не так поняли... :-)
Да, действительно - вся система будет реализована как web приложение в виде jsp/beans на JSP контейнере (Tomcat, JBOSS и пр).
Да, вопросы обработки параллельных запросов и балансирования нагрузки как-то решаются на уровне этого самого JSP контейнера.
Но в данном случае речь идет не об оптимизации обработки всех запросов вместе, а об оптимизации обработки одного конкретного запроса.
Попробую объяснить еще раз.
Например, надо вычислить что-то типа a1(a2,a3) = a2(b1,b2) +a3(c1,c2(d1)))
Есть варианты
1. Можно сделать полное представление этого в виде java объектов
a1, a2, a3
b1, b2
c1, c2
d1
Потом считать последовательно с2, a3, a2, a1.
2. Можно распараллелить вычисление a2 и a3 между разными агентами и в каждом из них представлять только необходимые объекты.
3. Можно остановить на втором уровне - т.е. сначала посчитать a2 и с2, а затем полностью повторить все для выражения a1(a2,a3) = a2 +a3(c1,c2) (без сохранения промежуточного результат)

Вопрос - какой вариант выбрать.


между какими такими агентами?
14. -dead- - 15 Мая, 2011 - 19:38:56 - перейти к сообщению
romeo пишет:
Вопрос - какой вариант выбрать.

Ответ - тот который будет лучше в вашей конкретной ситуации.

Вы же не даете никакой информации о типичных задачах и никаких требований что оптимизируем и в каких границах.

Или вы предлагаете рассказать вам тут теорию вычислительной сложности алгоритмов, методы оценки объема используемой памяти и общие принципы выбора того или иного решения?
15. romeo - 15 Мая, 2011 - 22:51:57 - перейти к сообщению
Агенты могут быть разными - это может быть другой сервер, который получает такие же запросы на вычисления, отдельный модуль на сервере приложений (например, специализирующийся на определенных функциях) и т.д.

Цитата:
Ответ - тот который будет лучше в вашей конкретной ситуации.

Согласитесь - этот ответ можно было дать сразу после первого поста в теме.

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

Требуется минимизировать время обработки запроса.