15

我正在开发一个用 C++ 编写的高性能系统。该过程需要能够在运行时理解一些复杂的逻辑(规则),这些逻辑(规则)是用为此应用程序开发的简单语言编写的。我们有两个选择:

  1. 解释逻辑 - 运行嵌入式解释器并生成动态函数调用,当接收到数据时,根据解释的逻辑对数据进行处理

  2. 将逻辑编译成plugin.so动态共享文件,使用dlopen、dlsym加载插件并在运行时调用逻辑函数

选项 2 看起来非常有吸引力,因为它将优化机器代码,在此过程中运行速度比嵌入式解释器快得多。

我正在探索的选项是:

    • 编写编译方法 string compile( string logic, list & errors, list & warnings )
    • 这里的输入逻辑是一个字符串,包含用我们的自定义语言编码的逻辑
    • 它生成llvm ir,compile方法的返回值返回ir字符串
    • 写链接方法 bool 链接(字符串 ir,字符串文件名,列表和错误,列表和警告)
    • 对于链接方法,我搜索了 llvm 文档,但我无法确定是否有可能编写这样的方法

    如果我是正确的,LLVM IR 将转换为 LLVM 字节码或汇编代码。然后要么使用 LLVM JIT 在 JIT 模式下运行,要么使用 GNU Assembler 生成本机代码。

    是否有可能在 LLVM 中找到一个可以做到这一点的函数?如果这一切都是从代码中完成的,而不是使用 C++ 中的系统命令来调用“as”来为我的要求生成 plugin.so 文件,那就更好了。

    如果您知道我可以在运行时从我的进程生成共享库本机二进制代码的任何方法,请告诉我。

    4

    1 回答 1

    3

    llc 是一个 llvm 工具,可以将 LLVM-IR 转换为二进制代码。我认为这就是你所需要的。

    基本上你可以按照你想要的方式生成你的 LLVM IR,然后通过你的 IR 调用 llc。

    您可以从命令行调用它,也可以转到 llc 的实现,并了解它是如何在您自己的程序中执行此操作的。

    这是一个有用的链接:

    http://llvm.org/docs/CommandGuide/llc.html

    我希望它有所帮助。

    于 2014-05-02T19:59:33.360 回答