我正在实施一个跨平台(Mac OS X、Windows 和 Linux)应用程序,它将对财务数据进行大量 CPU 密集型分析。出于速度原因,大部分分析引擎将用 C++ 编写,用户可访问的脚本引擎与 C++ 测试引擎交互。随着时间的推移,我想编写几个脚本前端来模拟其他流行的软件,并拥有大量的用户群。第一个方面将是类似 VisualBasic 的脚本语言。
我认为 LLVM 将非常适合我的需求。由于数据量巨大,性能非常重要;运行一次测试可能需要数小时或数天才能得到答案。我相信使用 LLVM 还可以让我使用单一的后端解决方案,同时随着时间的推移为不同风格的脚本语言实现不同的前端。
测试引擎本身将与界面分离,测试甚至会在单独的过程中进行,并将进度和结果报告给测试管理界面。测试将包括与测试引擎代码集成的脚本代码。
在我之前编写的类似商业测试系统的实现中,我构建了一个快速解释器,它可以轻松地与测试库交互,因为它是用 C++ 编写的并直接链接到测试引擎库。从脚本代码到测试库对象的回调涉及在格式之间进行转换,开销很大。
我在想象,使用 LLVM,我可以直接在 C++ 中实现回调,这样我就可以使脚本代码几乎像用 C++ 编写一样工作。同样,如果所有代码都编译为 LLVM 字节码格式,LLVM 优化器似乎可以跨脚本语言和用 C++ 编写的测试引擎代码之间的边界进行优化。
我不想每次都编译测试引擎。理想情况下,我想 JIT 只编译脚本代码。对于小型测试,我会跳过一些优化过程,而对于大型测试,我会在链接期间执行完整的优化。
那么这可能吗?我可以将测试引擎预编译为 .o 目标文件或 .a 库文件,然后使用 JIT 链接脚本代码吗?
最后,理想情况下,我希望脚本代码实现特定方法作为特定 C++ 类的子类。因此,C++ 测试引擎只会看到 C++ 对象,而 JIT 设置代码编译的脚本代码实现了对象的一些方法。似乎如果我使用正确的名称修饰算法,将脚本语言的 LLVM 生成设置为看起来像 C++ 方法调用会相对容易,然后可以链接到测试引擎。
因此,链接阶段将有两个方向,从脚本语言调用测试引擎对象以检索定价信息和测试状态信息,以及从测试引擎调用某些特定 C++ 对象的方法,其中代码不是从 C++ 提供的,而是从脚本语言。
总之:
1) 我可以在 JIT 编译、代码生成过程中链接预编译(.bc、.o 或 .a)文件吗?
2) 我是否可以使用上面 1) 中的过程链接代码,以便我能够创建代码,就像它都是用 C++ 编写的一样?