有一些解释型语言,如Lisp、Tcl、Perl等,可以在运行时轻松地在代码中定义lambda/proc/sub,并在同一会话中进行评估。
还有一些编译型语言,如C++,其执行速度远快于解释型语言,但在运行时定义函数并执行它并非易事,甚至可能根本不可能实现。
这里的问题是要做到以下几点:
-
在运行时定义函数:例如,根据初始输入数据推导出数据的分析模型。
-
在循环中快速执行上述函数:例如,应用推导出的分析模型来分析传入的数据。
我看到的一个解决方案并不十分理想:
-
根据初始输入数据,在嵌入式Tcl中推导出表示分析模型的过程。
-
通过在Tcl中对一组样本点评估该过程,创建一个查找表,这些样本点乐观地讲,可以覆盖适用范围。
-
将查找表从Tcl解释器传回给二进制文件(该文件是用C++开发的)。
-
然后通过在查找表中“足够接近”的值之间进行插值来分析传入的数据。
上述解决方案虽然有效,但存在不少概念和计算上的问题。因此问题来了:是否可以在C++中纯粹定义一个函数,并使其在同一运行时会话中可用?
从概念上讲,是否可以像创建一个字符串形式的函数,在内存中编译它,然后以某种方式将其链接回正在执行的二进制文件?
回答:
如果你想要一个开箱即用的解决方案,可以看看ExprTK。如果你想自己编写表达式解析器,可以查看Boost Spirit。
另一种方法是在运行时动态创建C++代码,将其编译为共享库(插件)并加载。这可能是最快的解决方案。