【问题标题】:C++ add new code during runtimeC++ 在运行时添加新代码
【发布时间】:2013-08-01 00:13:17
【问题描述】:

我正在使用 C++(在 xcode 和 code::blocks 中),我不太了解。 我想在运行时做一些可编译的东西。

例如:

char prog []={"cout<<"helloworld " ;} 

它应该编译 prog 的内容。 我读了一些关于 quines 的文章,但对我没有帮助。

【问题讨论】:

  • 您可以从您的程序中调用编译器,编译您可以在您的程序中创建的文件,然后从您的程序中运行结果。
  • 新代码是c++吗?该语言无法做到这一点,但您可以在将代码写入文件并调用编译器的地方进行一些操作。我不会推荐它。如果它不必是 c++,我听说过嵌入 Lua 的好消息。
  • 我认为来自 Python 背景!
  • quines 与您要实现的目标无关。 C++ 也没有内置的工具。
  • @LuchianGrigore 你能给一个你所说的链接吗?我想了解更多相关信息

标签: c++ quine


【解决方案1】:

这是可能的,但不是便携的,也不是简单的。 基本上,您必须将代码写入文件,然后 将其编译为 dll(使用 system 调用编译器),并且 然后加载dll。第一个简单,最后一个不太 困难(但需要实现特定的代码),但是 中间步骤可能具有挑战性:显然,只有在 编译器已安装在系统上,但你必须找到 安装位置,确认它是相同的版本(或 至少一个生成二进制兼容代码的版本), 使用与您的代码相同的选项调用它 已编译,并处理任何错误。

C++ 不是为此而设计的。 (编译语言一般 不是。)

【讨论】:

    【解决方案2】:

    简短的回答是“不,你不能那样做”。 C 和 C++ 的设计初衷从未如此。

    这也是对实际问题的长答案,但我将扩展一些想法。

    由编译器编译的代码肯定不是微不足道的。有一些技术可用于向程序“添加更多代码”:

    1. 添加动态共享库 (DLL),其中包含已与现有代码分开编译的代码。你当然也可以在你的程序中有代码来输出一些代码,用编译器编译这个代码,把它链接到一个动态库中,然后把它加载到你的代码中。

    2. 您可以构建自己的小型代码生成器,在一块内存中生成机器代码。请注意,您可能需要调用“特殊”内存分配函数,因为通常不允许执行“正常”内存分配 - 您需要分配“具有执行权限” - Windows 中的VirtualAlloc 确实有这样一个标志,和 Linux/Unix 风格的 mmap 也是如此。当然,您几乎必须“成为一名编译器”才能实现这一目标。

    3. 您当然也可以发明自己的解释性语言,这将允许您的程序加载例如带有要执行的命令/指令的文本文件,或者在程序中包含用于使用该语言执行的文本。

    但是就像我一开始说的那样,这不是 C 和 C++(以及大多数其他编译语言)的本意,所以它不会像“将一些 C++ 代码粘贴到一个字符串中,然后生成它”那么简单跑”。

    【讨论】:

      【解决方案3】:

      这取决于你为什么要这样做。

      如果是出于效率原因 - 你知道一个函数只在运行时做什么,但它必须非常高效 - 那么已经建议的内容(写入文件,编译到 dll / so 并动态加载它)是您的最佳选择。

      但是,如果您希望这样做的原因是允许用户输入行为,请说您从数据库中读取的一般功能(行为或单位游戏?情节中字段的值?) - 或者更一般地说,您只是想要在运行时更改/增强行为而不关心效率,我建议使用外部脚本语言,如 lua,它可以轻松与编译的 C++ 代码交互。

      【讨论】:

        【解决方案4】:

        C 和 C++ 语言编译为二进制机器代码,与 Java 和 C# 不同,Java 和 C# 为“虚拟机”或解释脚本语言(如 JavaScript)生成指令。 C++ 的编译是由一个单独的可执行文件编译器执行的,它不会合并到生成的可执行文件中。

        因此,一旦编译完成,该语言没有任何内置的“eval”功能来翻译进一步的代码。

        新 C/C++ 程序员认为他们需要这样做的情况并不少见,但他们通常不会这样做。也许您可以进一步扩展您实际想要做的事情。

        但如果您确实需要能够做到这一点,您的选择是:

        1. 编写代码以使用新代码编译新的可执行文件,然后运行生成的程序。
        2. 自己编写一个简单的解析器和“虚拟机”,
        3. 考虑采用嵌入式脚本/解释语言,例如Lua
        4. 尝试整合CINT

        另见:Scripting language for C++

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-08-08
          • 2021-12-12
          • 1970-01-01
          • 2015-07-15
          • 1970-01-01
          • 2011-04-14
          相关资源
          最近更新 更多