C++的热重编译

9
我最近惊奇地看到Java代码被自动重新编译并注入到运行程序中。由于现代C++编译器(例如基于LLVM的编译器)开始研究JIT编译,所以我想知道在这个主题上是否有任何研究工作。更新:通过“热重新编译”,我的意思是编辑代码、重新编译可执行文件的特定部分,并在不重新启动程序的情况下运行它。常见的用例是具有无限循环的游戏引擎,在渲染步骤中编辑一些代码,并在下一帧中看到更改。C++的热重新编译的研究状态如何?是否有任何可工作的实现?

这个问题具体是什么? - Hogan
2
从问题来看,似乎是“重新编译并注入到正在运行的程序中”。所有其他常见的“热”和“重新编译”的用法都支持这一点。 - ssube
2个回答

10

可能你所说的"热重编译"是指Visual C++中的"编辑并继续"

也许这个链接可以回答你的问题。

但如果你能更清晰地定义你所问的术语"热重编译",那会更容易理解(当我写这篇文章时,它还没有被很好地定义)。

添加: C++的"编辑并继续"显然是在1990年代随着Visual C++ 6.0一起推出的。因此,一些Java实现现在也能够做到这一点,这只是略有惊奇。然而,启用编辑和继续的/Zi开关也会改变__LINE__的行为,例如原始的ScopeGuard实现就无法工作(然后必须使用Microsoft特定的__COUNTER__)。

祝好!


1
加一分,因为提到了Edit and Continue。我发现它对于调试某些问题非常有用。 - Mike Bailey
哇,我对VS中的这个功能毫不知情。其他编译器/IDE是否也实现了它? - Warren Seine

2

我猜你在谈论JVM实际上观察程序执行并且例如改变预测分支值以最小化跳转和取消流水线。这可以在Java中完成,因为源代码和实际机器指令之间有一个单独的、定义明确的中间阶段。这将使其能够在运行时替换中间代码,可能提高性能。

在C++中,程序直接构建为特定体系结构的机器语言,并且在大多数硬件上,代码页是只读的,原因包括防止意外和恶意代码更改。

现在,在C++中你可以使用类似Clang库的东西将代码部分重新编译为共享对象,然后使用dlopen等打开重新编译的共享对象来获取新版本的机器代码。当然,这需要你的程序比一个Java程序更加聪明才能利用JVM。我认为g++/gprof有一种模式,可以使用分析数据来影响g++的优化,也许这就是你要找的东西?


你所提到的是JIT编译器必须具备的常见特性。我并没有提到优化。我的问题更多地与@Alf建议有关。 - Warren Seine

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接