C++ “我该怎么做?”;编撰;c++;在运行时?
可能重复:C++ “我该怎么做?”;编撰;c++;在运行时?,c++,compilation,runtime,expression,C++,Compilation,Runtime,Expression,可能重复: 我想把用户的表达式作为字符串输入,并将其编译成可调用的C++函数。有没有什么工具可以让你轻松做到这一点 基本上,似乎与我想做的类似,除了我需要用C++来做这件事,而不是用C。p> 我当然可以使用lex和yacc生成一种通用的求值器,但我不想每次都解析字符串。基本上,这个表达式将在一个关键的内部循环中运行,所以我正在寻找一种在运行时“编译”它的方法 您可以编写迷你解释器。命令与C++相同(不是全部)。当然,编译器会对其进行优化,但不确定优化程度。我用qbasic(mov,add,su
<>我想把用户的表达式作为字符串输入,并将其编译成可调用的C++函数。有没有什么工具可以让你轻松做到这一点
基本上,似乎与我想做的类似,除了我需要用C++来做这件事,而不是用C。p>
我当然可以使用lex和yacc生成一种通用的求值器,但我不想每次都解析字符串。基本上,这个表达式将在一个关键的内部循环中运行,所以我正在寻找一种在运行时“编译”它的方法 您可以编写迷你解释器。命令与C++相同(不是全部)。当然,编译器会对其进行优化,但不确定优化程度。我用qbasic(mov,add,sub…)为汇编做了这件事,但速度相当慢,因为我是解释器的解释器:D
你有没有想过进化计算和适应度函数?值得一看。您可以创建一个表示已解析表达式树的数据结构,与每次解析字符串相比,在运行时计算该结构的开销较小
实际上,在C++中调用一个可调用的方法会非常困难,因为你必须生成目标代码并动态加载到程序中。这将重复整个编译器工具链的许多功能。您必须将表达式解析为抽象语法树,并对其进行遍历或原地求值。应该能满足你对简单数学表达式的需求。这不容易。。。如果你想要我的两分钱,我将按照以下步骤操作:
编辑:另一个解决方案是检查一个解析器,如boost::spirit::qi,它使用得很好,可以提供非常有用的结果。这似乎是Hmmm的副本,是的,它是副本。但这个问题也没有一个好的答案……我会调查libclang和llvm。你应该意识到C++使这个任务变得非常容易,而C++中的劳动密集型。您可以使用重量级的解决方案,比如使用实际的编译器,无论是外部的还是嵌入式的(例如,LLVM可以在嵌入式JIT编译器中使用),或者您可以实现自己的字节码编译器和计算器(或者使用其他人的;Lua是作为嵌入式字节码编译器/计算器实现的。当然,它只处理Lua语言).也许这就是你要找的-尼克这似乎是一个连贯但困难的解决方案。让我看看结果如何。