【问题标题】:Hot recompilation for C++C++ 的热重新编译
【发布时间】:2011-08-20 17:16:13
【问题描述】:

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

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

C++热重编译的研究现状如何?有没有可行的实现?

【问题讨论】:

  • 问题到底是什么?
  • @Hogan 我已经更新了问题。
  • @Alf 从问题来看,它似乎是“重新编译并注入到正在运行的程序中”。 “热”和“重新编译”的所有其他常见用法都支持这一点。

标签: c++ compiler-construction jit


【解决方案1】:

可能“热重新编译”是指 Visual C++ 中的 "Edit and continue"

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

但如果你能更清楚地定义你所询问的术语“热重新编译”会更容易(在我写这篇文章时,它的定义并不明确)。

添加: 在 1990 年代,C++ 的“编辑并继续”显然是 introduced with Visual C++ 6.0。所以有些Java实现现在可以做到这一点只是有点令人惊讶。 但是,我记得,启用编辑和继续的/Zi 开关也确实改变了__LINE__ 的行为,例如最初的 ScopeGuard 实现不起作用(然后必须使用 Microsoft 特定的 __COUNTER__)。

干杯,

【讨论】:

  • +1 用于提及编辑并继续。我发现它对于调试某些东西非常有用。
  • 哇。我不知道VS中的这个功能。是否有其他编译器/IDE 实现它?
【解决方案2】:

来自automatically recompiled and injected into a running program. 我假设您说的是 JVM 实际监视程序执行,例如在运行时更改预测的分支值以最小化跳转和取消流水线。

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

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

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

【讨论】:

  • 您所说的是 JIT 编译器必须具备的共同特性。我没有提到优化。我的问题与@Alf 的建议更相关。
猜你喜欢
  • 1970-01-01
  • 2013-09-04
  • 2019-04-11
  • 2021-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多