在冯诺依曼架构上,程序和数据都存储在内存中,因此程序可以自行修改。这对程序员有用吗?你能举一些例子吗?
2 回答
变质
我想到的一个(有问题的)用例是变形计算机病毒。这些是恶意软件,它们通过将自己的机器代码重写为看起来不同的语义等效表示来隐藏基于签名的检测。
蹦床
另一个(更复杂但也更常见的)用例是蹦床,这是一种基于动态代码生成的技术,用于解决嵌套函数调用的某些问题。
即时编译
我能想到的动态代码生成最常见的用法是JIT (just-in-time) 编译。.NET 或 Java 等现代语言不会编译成本地机器代码,而是编译成某种中间语言(称为字节码)。然后在执行程序时(由为目标架构编写的虚拟机)解释此字节码。同时,后台进程会检查代码的哪些部分执行得非常频繁。然后这些部分很有可能被动态编译成本地机器语言以获得最佳性能。所有这些都发生在程序运行期间!
安全隐患
要记住的一件事是,将数据解释为代码的可能性对于利用计算机软件中的安全漏洞很有用,这就是为什么现代硬件和操作系统的趋势是启用并在可能的情况下甚至强制执行代码分离和数据(另见NX 位和DEP)。
我可以通过向您推荐一个类似(写得特别好,回答得很好)问题的答案来最好地回答这个问题,也在 StackOverflow - Homoiconic 和“不受限制”的自我修改代码 + lisp 真的自我修改吗?. 答案集中在 Lisp,一种以将“代码就是数据”提升到新水平而闻名的家庭语言,并探索了它在 AI 中的用途。