动态描述数学规则

时间:2012-01-17 07:53:44

标签: c++ math

我希望能够在我的应用程序的外部位置指定数学规则,并让我的应用程序在运行时处理它们并执行操作(再次在外部描述)。这样做的最佳方式是什么?

例如,当以下评估为MyFunction1()时,我可能想要执行函数true

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

提前感谢您的帮助。

(如果它有任何相关性,我希望使用C ++,C或C ++ / CLI)

4 个答案:

答案 0 :(得分:3)

我认为不要重新发明轮子---使用嵌入式脚本引擎。这意味着您将使用标准表单来描述操作和逻辑。有几个很好的选择,可能会满足您的需求。

好的选择包括:

  1. Javascript虽然谷歌v8。 (从嵌入的角度来看,我不喜欢这个,  但javascript很容易使用,很多人已经知道了)

  2. 的Lua。它快速便携。语法可能不如Javascript好,但嵌入是  容易。

  3. 的Python。干净的语法,很多库。嵌入并没有太多乐趣。

  4. 我考虑使用SWIG帮助生成绑定...我知道它适用于python和lua,不确定v8。

答案 1 :(得分:1)

我会查看command设计模式来处理调用外部数学谓词,以及Factory设计模式来运行外部定义的代码。

答案 2 :(得分:0)

如果您的数学表达语言如此简单,那么您可以为它定义语法,例如:

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 ++代码中表达语法。

答案 3 :(得分:0)

如果计算发生在内部循环中,您需要高性能,则不能使用脚本语言。基于“可部署”的方式以及您希望的平台多少:

1)你可以用C ++表达方程式,让g ++在运行时为你编译它,你可以链接到生成的共享对象。但是这种方法在每一步都非常依赖于平台!必要的系统调用,编译器使用,标志,加载共享对象(或DLL)......但最终会超级快,特别是如果你用方程式编译最里面的循环。该等式将被内联并且全部。

2)你可以用同样的方式使用java。你可以在java中获得一个很好的java编译器(我想从Eclipse开始,但你可以轻松地嵌入它)。使用这个解决方案,结果会稍微慢一些(取决于你想要多少模板魔法),我预计,对于大多数用途来说,这个数字会减少2倍。但这种解决方案非常便携。一旦你使它工作,没有理由它不应该在任何地方工作,你不需要任何外部的程序。另一个缺点是必须用Java语法编写方程式,这对于复杂的数学来说是丑陋的。在这方面,第一种解决方案要好得多,因为运算符重载极大地有助于数学方程式。

3)我对C#了解不多,但可能有类似于(2)的解决方案。如果有的话,我知道在C#中有运算符重载,所以你的方程式编写和查看会更愉快。