【发布时间】:2011-02-17 20:40:42
【问题描述】:
我正在实施一个跨平台(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++ 编写的一样?
【问题讨论】: