2012-01-17 3 views
2

Я хочу иметь возможность указывать математические правила во внешнем местоположении для моего приложения и иметь приложение, которое обрабатывает их во время выполнения и выполняет действия (снова описанные извне). Каков наилучший способ сделать это?Динамическое описание математических правил

Например, я мог бы выполнять функцию MyFunction1(), когда следующее вычисляется в true:

(a < b) & MyFunction2() & (myWord == "test").

Заранее за вашу помощь.

(если это имеет какое-то отношение, я хотел бы использовать C++, C или C++/CLI)

+0

Я думаю, вы имели в виду '&&', а не '&'. – celtschk

+0

@celtschk Я использую логические символы, а не синтаксис C/C++ – JonaGik

+0

Конечно, логический символ для * и * есть ∧. И математический знак равенства равен =, а не ==. – celtschk

ответ

3

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

Хорошие варианты включают:

  1. Javascript, хотя Google v8. (Я не люблю это с точки зрения внедрения, , но javascript с ним легко работать, и многие это уже знают)

  2. Lua. Его быстрый и портативный. Синтаксис, возможно, не так хорош, как Javascript, но вложение легко.

  3. Python. Чистый синтаксис, множество библиотек. Не очень весело встраивать.

Я бы предпочел использовать SWIG, чтобы помочь сгенерировать привязки ... Я знаю, что это работает на python и lua, но не уверен в v8.

+1

Python довольно легко вставлять, если вы используете Boost.Python. –

+0

@PaulManta У меня были проблемы с boost.python ранее. В основном это было с попыткой внедрить интерпретатор python в приложение на C++ (а не наоборот, что кажется более распространенным). Хотя это было много лет назад, и с тех пор ситуация улучшилась. –

+0

Что-то, вероятно, изменилось с годами. Я использовал Boost для встраивания Python в мое приложение на C++ за последние месяцы, и у меня не возникало проблем с библиотекой. –

1

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

0

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

expr = bin-op-expr | rel-expr | func-expr | var-expr | "(" expr ")" 

bin-op = "&" | "|" | "!" 
bin-op-expr = expr bin-op expr 

rel-op = "<" | ">" | "==" | "!=" | "<=" | ">=" 
rel-expr = expr rel-op expr 

func-args = "(" ")" 
func-expr = func-name func-args 

var-expr = name 

, а затем перевести, что в грамматике для синтаксического анализатора. Например. вы можете использовать Boost.Spirit, который предоставляет DSL, чтобы вы могли выразить грамматику в своем коде на C++.

0

Если этот расчет происходит во внутреннем цикле, вам нужна высокая производительность, вы не можете использовать языки сценариев. Основываясь на том, как «разворачиваться» и насколько независимы от платформы, вы бы хотели:

1) Вы могли бы выразить уравнения в C++ и дать g ++ компилировать его для вас во время выполнения, и вы могли бы связать с полученным результатом общий объект. Но этот метод очень зависит от платформы на каждом шагу! Необходимые системные вызовы, компилятор для использования, флаги, загрузка общего объекта (или DLL) ... Это было бы супербыстро в конце, хотя, особенно если вы скомпилируете самый внутренний цикл с помощью уравнения. Уравнение будет вложенным и все.

2) Вы можете использовать java таким же образом. Вы можете получить хороший java-компилятор в java (из Eclipse, я думаю, но вы можете легко вставлять его).С этим решением результат будет несколько медленнее (в зависимости от того, сколько магии шаблона вы хотите), я бы ожидал, в большинстве случаев, в 2 раза. Но это решение чрезвычайно переносимо. Как только вы его заработаете, нет причин, по которым он не должен работать нигде, вам не нужно ничего внешнего по отношению к вашей программе. Еще одна минута этого - писать ваши уравнения в синтаксисе Java, что является уродливым для сложной математики. Первое решение намного лучше в этом отношении, так как перегрузка операторов сильно помогает математическим уравнениям.

3) Я не знаю много о C#, но может быть решение, подобное (2). Если есть, я знаю, что в C# есть перегрузка операторов, поэтому ваши уравнения будут приятнее писать и смотреть.

Смежные вопросы