如何在运行时“编译”C++表达式?

3
我想从用户那里以字符串形式输入一个表达式并将其编译为可调用的C++函数。是否有任何工具可以轻松地完成这个任务?基本上,How do I compile an Expression Tree into a callable method, C#? 看起来与我想要做的类似,只是我需要在C++而不是C#中完成这个任务。我肯定可以使用lex和yacc创建一种通用评估器,但我不想每次都解析字符串。基本上,这个表达式将在关键内部循环中运行,因此我正在寻找一种在运行时“编译”它的方法。

嗯,是的,这是一个重复问题。但是那个问题也没有一个好的答案... - undefined
我会研究一下libclang和llvm。你应该知道,在C#中,这个任务非常容易,而在C++中则需要付出很多努力。 - undefined
2
@owagh 这是因为实际上并没有一个很好的答案。你可以使用一个重量级的解决方案,比如使用一个真正的编译器,无论是外部还是嵌入式的(例如,LLVM可以用作嵌入式JIT编译器),或者你可以实现自己的字节码编译器和评估器(或者使用别人的;Lua就是作为可嵌入的字节码编译器/评估器实现的,当然它只处理Lua语言)。 - undefined
@Tim 我希望我能使用Lisp,但是我不能... - undefined
1
也许这个是你正在寻找的。-nick - undefined
显示剩余2条评论
4个回答

1

你可以编写自己的迷你解释器。使用与C++相同的命令(不是全部)。当然,你的编译器会进行优化,但不确定优化效果如何。我曾经在QBasic中为汇编语言编写过解释器(mov、add、sub等),但由于是解释器的解释器,速度相对较慢:D

你有没有考虑过进化计算和适应性函数?值得研究。


1

这并不容易... 如果你想听我的建议,我会按照以下步骤进行:

  1. 为必须在运行时创建的代码创建一个接口。首先,你需要为可以执行的操作创建一个接口。例如,你的类必须继承自一个纯虚基类,该基类将表示你的接口。请注意,你的程序将不使用任意代码,而是使用以特定方式创建的代码,因为它必须知道如何使用它。
  2. 从程序内部调用编译器。编译器应该从源代码创建一个库。你可以使用一个预定义的项目,将其存储在某个地方,然后用你自己的源文件替换它。这样就可以轻松获得正确的库。
  3. 将库放在指定的源中,以便找到它。
  4. 在运行时加载库。如果你搜索一下,就会发现可以在运行时加载动态库,而不仅仅是在链接时(例如,你可以为程序创建插件)。因此,你的程序可以加载你的库并使用它。例如,你可以在这里找到一些信息。

但是,正如其他人所说,这不是一项简单的任务。

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


这似乎是一个连贯但困难的解决方案。让我看看这个能否奏效。 - undefined

1

你需要将表达式解析成抽象语法树,并在其中遍历或直接进行求值。这样的实现应该能够满足你对于简单数学表达式的需求。


0
你可以创建一个表示解析表达式树的数据结构,与每次解析字符串相比,在运行时评估的开销很小。
实际上,在C++中获取可调用的方法将会非常困难,因为你需要生成对象代码并动态加载到程序中。这将重复许多编译器工具链所做的工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接