如何在运行时“编译”c ++中的表达式?

时间:2012-08-30 19:20:54

标签: c++ compilation runtime expression

  

可能重复:
  compile and run c++ code runtime

我希望将用户的表达式作为字符串输入并将其编译为可调用的c ++函数。是否有任何工具可以让您轻松完成此操作?

基本上,How do I compile an Expression Tree into a callable method, C#?似乎与我想做的相似,只是我需要在c ++而不是c#中执行此操作。

我当然可以使用lex和yacc创建一种通用的求值程序,但我不想每次都要解析字符串。基本上这个表达式将在一个关键的内循环中运行,所以我正在寻找一种方法来编译"它在运行时。

4 个答案:

答案 0 :(得分:1)

你可以写你的迷你翻译。命令与c ++相同(不是全部)。当然你的编译器会优化它但不确定多少。我在qbasic(mov,add,sub ...)中进行了汇编,但由于是翻译的翻译,所以它很慢:D

您是否考虑过进化计算和适应度函数?值得一看。

答案 1 :(得分:1)

您必须将表达式解析为抽象语法树并对其进行处理或对其进行就地评估。 Something like this应满足您对简单数学表达式的需求。

答案 2 :(得分:1)

这并不容易......如果你想要我的两分钱,我会按照以下步骤操作:

  1. 为您必须在运行时创建的代码创建一个接口。首先,您可以为自己的工作创建一个界面。例如,您的类必须从代表您的接口的纯虚基类继承。请注意您的程序不会使用任意代码,而是使用以特定方式创建的代码,因为它必须知道如何使用它。
  2. 从程序内部调用编译器。编译器应该从您的源代码创建一个库。您可以使用存储在某处的预定义项目,然后将其源文件替换为您自己的项目。因此,可以很容易地获得正确的库。
  3. 将您的库放在指定的源中,您可以在其中找到它。
  4. 在运行时加载库。如果搜索,您将看到可以在运行时加载动态库,而不仅仅是在链接时(例如,您可以为程序创建插件)。所以你的程序可以加载你的库并使用它。例如,您可以找到一些信息here
  5. 但是,正如其他人所说,这不是一项微不足道的任务。

    编辑:另一个解决方案是检查像boost :: spirit :: qi这样的解析器,这个解决方案很好用,可以提供极其有用的结果。

答案 3 :(得分:0)

您可以创建一个表示已解析的表达式树的数据结构,与每次解析字符串相比,在运行时评估它的开销会很小。

实际上在C ++中获取可调用方法将非常困难,因为您必须生成目标代码并将其动态加载到程序中。这将复制整个编译器工具链的许多内容。