是否由某种算法或数学过程生成,测试代码是否产生所需的结果且没有运行时/堆栈错误?或者是否有其他类型的启发式过程来决定要做出哪些更改。
答案 0 :(得分:1)
准确一点 - 任何类型的可执行代码写入基本上都是自修改代码,即使它没有产生任何有用的东西:)
但我假设您的意思是JIT或二元翻译等有用的用例(我们将保留手册,因为它们几乎只用作考试题目)。考虑编译器的工作 - 在某些时候它处理代码流(通常在中间表示中,一种带有附加信息的伪程序集)。然后,它分析它并构建数据流和控制流图,并运行各种算法来优化它们。 现在考虑不是在编译时静态执行此操作,而是有一些驱动程序或运行时内核可以动态执行此操作(具有额外的运行时数据,例如分支历史记录的采样)。然后,此代理可以修改代码(或者通常只生成一个新的和改进的代码),然后切换程序来运行它。它可以进一步回到那里,并在未来通过时改进它。 正常的编译器可以保证代码的正确性。还有一个混淆旧代码和新代码的风险(如果第三方在运行优化版本时更改旧代码会怎么样?如果TLB页面被清除怎么办?等等。)。还有一些优化没有得到充分保证,可以通过在生成的代码中添加断言(以及中止+展开流程)来保护。