C++ 热重编译

问题描述 投票:0回答:2

我最近惊讶地发现 Java 代码被自动重新编译并注入到正在运行的程序中。由于现代 C++ 编译器(例如基于 LLVM 的)开始研究 JIT 编译,我想知道是否有关于此主题的任何工作。

更新: “热重新编译”是指编辑代码,重新编译可执行文件的特定部分并运行它,而无需重新启动程序。常见的用例是具有无限循环的游戏引擎,您可以在渲染步骤中编辑一些代码,并查看下一帧的更改。

C++热重编译的研究现状如何?有有效的实施吗?

c++ jit
2个回答
10
投票

有可能“热重新编译”指的是 Visual C++ 中的“编辑并继续”

也许该链接可以回答您的问题。

但是,如果您更清楚地定义您所询问的术语“热重新编译”,则会更容易(在我写这篇文章时,它的定义还没有很好)。

添加: C++ 的“编辑并继续”显然是在 1990 年代随 Visual C++ 6.0 引入的。因此,一些 Java 实现现在可以做到这一点,这只是有点令人惊讶。 但是,据我记得,启用编辑并继续的 /Zi 开关也会改变 __LINE__

 的行为,例如最初的 
ScopeGuard
 实现不起作用(必须使用 Microsoft 特定的 
__COUNTER__)。
干杯,

来自

2
投票
我假设您正在谈论 JVM 实际监视程序执行,例如在运行时更改预测分支值以最大限度地减少跳转和非流水线操作。

这可以在 Java 中完成,因为源代码和实际机器指令之间有一个单独的明确定义的中间阶段。这将使其能够在运行时替换中间代码,从而可能提高性能。

在 C++ 中,程序直接构建到特定架构的机器语言中,并且在大多数硬件上,出于各种原因(包括防止意外和恶意代码更改),代码页是只读的。

现在,你在 C++ 中可以做的就是使用 Clang 库之类的东西将代码段重建为共享对象,然后使用

dlopen

等打开重新编译的共享对象以获取新版本的机器代码。当然,这要求您的程序比 Java 程序要聪明得多,才能利用 JVM。我

相信 g++/gprof 有一种模式,可以使用分析数据来影响 g++ 的优化,但是,也许这就是您正在寻找的?

	
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.