57. [20] When a program changes one or more of its own instructions in memory, it is said to have self-modifying code. MMIX insists that a SYNCID command be issued before such modified commands are executed. Explain why self-modifying code is usually undesirable in a modern computer.
—— THE ART OF COMPUTER PROGRAMMING VOLUME 1, FASCICLE 1, MMIX, A RISC Computer for the New Millennium, Page 28
- 【GGJ2023】《Arcknight_ Escape from the source code》演示 | Bilibili
- Arcknight Escape from the source code | Global Game Jam
递归、元编程、与自修改代码
作为一名 OIer,理所应当的,我十分喜欢含有 自我指涉 的程序,最简单的自我指涉可能就是递归了,在初一第一次看到递归程序时,我的感想是:哇,程序还能这么写!(要是能有人在更小的时候教我就更好了…)
长大后发现比递归更高级的自我指涉,是存在的,其中之一就是,元编程。。。
例如在 Pytorch 中,就有利用元编程方法生成各种模板的特化代码以优化效率的设计。。。
在开源机器人模拟软件 OpenRave 中、也有类似方法生成解动态运动学方程(Dynamics Kinetic Equation)的定制代码。(我是听老板说的。。。我可没办法求证。。囧。。。)
比元编程更高级的自我指涉程序也是存在的。。。。
就是上面 MMIX 里提到的。。。self-modifying code。。。。
self-modifying code 或许只能在汇编语言这个层级存在?因为它要去修改运行时这个代码本身所处在的存储空间。。在这类代码中,空间,规则,函数,一切的一切都是那么的不可考。。。自然会产生很多奇妙的事件。。。
(所以不会有人在生产环境中这么干吧。。。)
或许在一些解谜游戏中会产生这种 self-modifying code 。。。我不确定。。。但是我现在也没有特别好的 self-modifying code 的例子。。。
你看到的是,越接近底层,我们有时反而就越接近真理。。。
当然了。。。在动态语言里,我们可以使用 Eval 来 somehow 模拟这种 self-modifying code 的感觉。。。
(因为许多静态语言也都有一定的 reflection 能力了,所以看起来是否支持 Eval 是一个更好的区别动态语言和静态语言的 Critiria。。)
为什么喜欢自我指涉?
因为自我指涉通常伴随着悖论。。。而悖论的出现通常可以帮助你进行 debug 。。。从而获得洞见。。。(无理数、光电效应、etcs)
根据柏拉图的 洞穴理论,现在不搞点 bug 出来我们怎么去认识外面的世界啊。。。
WIP …