最近我惊讶地看到Java代码被自动重新编译并注入正在运行的程序中。由于现代C ++编译器(例如基于LLVM)开始调查JIT编译,我想知道是否有关于此主题的任何工作。
更新:通过“热重新编译”,我的意思是编辑代码,重新编译可执行文件的特定部分并运行它而无需重新启动程序。常见的用例是具有无限循环的游戏引擎,您可以在渲染步骤中编辑某些代码,并在下一帧中查看更改。
C ++热重编译的研究状态是什么?有没有工作实施?
答案 0 :(得分:10)
可能通过“热重新编译”,你的意思是像Visual C ++中的"Edit and continue"。
也许该链接可以解答您的问题。
但是如果你要定义你所询问的术语,“热重编译”,更清楚(因为我写这篇文章并没有明确定义)会更容易。
加入:
在1990年代,C ++的“编辑并继续”显然是introduced with Visual C++ 6.0。所以现在有些Java实现可以做到这一点,这有点令人惊讶。 &LT g取代;但是,正如我记得的那样,启用编辑和继续功能的/Zi
开关也会改变__LINE__
的行为,例如原始的ScopeGuard实现不起作用(然后必须使用特定于Microsoft的__COUNTER__
)。
干杯&第h。,
答案 1 :(得分:2)
从automatically recompiled and injected into a running program.
我假设您正在谈论实际观察程序执行的JVM,例如在运行时更改预测的分支值以最小化跳转和非流水线。
这可以用Java完成,因为在源代码和实际机器指令之间有一个单独定义良好的中间阶段。这将使它能够在运行时替换中间代码,从而提高性能。
在C ++中,程序直接构建在特定架构的机器语言中,在大多数硬件上,代码页只是出于各种原因而被读取,包括防止意外和恶意代码更改。
现在,在C ++中可以做的事情是使用类似他的Clang库来重构代码段到共享对象然后使用dlopen
等打开重新编译的共享对象拿起新版本的机器代码。这当然要求您的程序比Java程序更加智能,以利用JVM。我相信 g ++ / gprof有一种模式,可以使用分析数据来影响g ++的优化,但也许这就是你要找的东西?