【问题标题】:C++ compilation at runtime运行时 C++ 编译
【发布时间】:2013-04-01 20:34:35
【问题描述】:

所以几个月前我观看了这段视频,Epic 展示了他们新的虚幻引擎 4 开发者功能。抱歉,我找不到视频,但我会尽力解释。

引起我注意的一个特性是 C++“动态”修改和编译。这家伙在编辑器中展示了他是如何玩游戏的,并修改了代码中的一些变量,保存它,并且这些更改立即反映在游戏中。

所以我一直在想......如何实现这一目标?目前我能想到两种可能的方法:要么是骗局,它只是“c 风格”——脚本语言而不是 C++ 本身,要么是共享库(阅读:DLL)魔法。

这是我自己尝试的东西(简化):

for(;;)
{
    Move DLL from build directory to execution directory
    Link to DLL using LoadLibrary() / dlopen() and fetch a pointer to function "foo()" from it
    for(;;)
    {
        Call the function "foo()" found in the dll
        Check the source of the dll for changes
        If it has changed, attempt to compile
        On succesfull compile, break
    }
    Unload DLL with FreeLibrary() / dlclose()
}

现在这似乎可行,但我不禁想知道还有哪些其他方法? 这种方法与使用脚本语言相比如何?

编辑: https://www.youtube.com/watch?v=MOvfn1p92_8&t=10m0s

【问题讨论】:

  • 你的问题有点含糊。您能否更具体一些,重点关注您要解决的实际问题?
  • 这很酷;不知道你能不能用clang的JIT编译做点什么?
  • C: The Complete Reference by Schildt(或者是 C++?)有一个示例项目,它是一个 C(++?) 解释器。也许是这样,或者在软件中包含一个微型但实际的编译器。
  • 最近在 isocpp.org 上有一个 similar thing
  • “这家伙展示了他如何......修改了一些变量......并且这些更改立即反映在游戏中。”您的调试器可以做同样的事情。跨度>

标签: c++ dll compiler-construction runtime shared-libraries


【解决方案1】:

是的,“热代码修改”绝对是许多 IDE/调试器在某种程度上可以拥有的一种能力。这是一篇好文章:

这是 MSVS“编辑并继续”的手册页:

【讨论】:

    【解决方案2】:

    Epic 的热重载通过将游戏代码编译并加载为 dll/.so 来工作,然后由引擎动态加载。然后,运行时重新加载只是重新编译库并重新加载,并在需要时存储和恢复状态。

    还有其他选择。您可以查看 Runtime Compiled C++(或查看 RCC++ blog and videos),或者尝试我在 wiki 上列出的其他 alternatives 之一。

    作为 Runtime Compiled C++ 的作者,我认为它有一些优势——重新编译的速度要快得多,因为它只编译你需要的代码,并且起点可以是单个 exe,所以你不需要配置一个dll的单独项目。然而,它确实需要一些学习和一些额外的代码才能让它工作。

    【讨论】:

      【解决方案3】:

      C 和 C++ 都不需要提前编译,尽管通常的目标环境(操作系统、嵌入式系统、高性能数字运算)通常从 AOT 中受益匪浅。

      拥有一个 C++ 脚本解释器是完全可能的。只要它遵守标准中的行为,它就是 C++,而不是您建议的“骗局”。

      也可以替换共享库,但要使其正常工作,您需要一种机制来序列化所有状态并在新版本下重新加载它。

      【讨论】:

      • 如果他们承诺通过使用 C++ 而不是脚本语言来提高性能,我认为这仍然会被视为骗局。您的建议听起来像是变相的脚本语言。
      • @TheDespite:提高性能是使用普遍的 C++ 提前编译工具的好处之一。它实际上不是该语言的特征。您的问题中没有任何内容声称它们有望获得良好的性能。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多