Language agnostic 什么是差异执行?

Language agnostic 什么是差异执行?,language-agnostic,differential-execution,Language Agnostic,Differential Execution,我偶然发现了一个堆栈溢出问题,它有一个很长很详细的答案。所有这些都有道理。。。但当我完成时,我仍然不知道差分执行到底是什么。它到底是什么?修订版。这是我第n次试图解释它 假设您有一个重复执行的简单确定性过程,始终遵循相同的语句执行或过程调用序列。 该过程调用自己,按顺序将所需的任何内容写入FIFO,并从FIFO的另一端读取相同数量的字节,如下所示:** 被调用的过程使用FIFO作为内存,因为它们读取的内容与之前执行时写入的内容相同。 所以,如果他们这次的论点恰好与上次不同,他们可以看到,并利用

我偶然发现了一个堆栈溢出问题,它有一个很长很详细的答案。所有这些都有道理。。。但当我完成时,我仍然不知道差分执行到底是什么。它到底是什么?

修订版。这是我第n次试图解释它

假设您有一个重复执行的简单确定性过程,始终遵循相同的语句执行或过程调用序列。 该过程调用自己,按顺序将所需的任何内容写入FIFO,并从FIFO的另一端读取相同数量的字节,如下所示:**

被调用的过程使用FIFO作为内存,因为它们读取的内容与之前执行时写入的内容相同。 所以,如果他们这次的论点恰好与上次不同,他们可以看到,并利用这些信息做任何他们想做的事情

要启动它,必须有一个只进行写入而不进行读取的初始执行。 对称地,应该有一个只有读而没有写的最终执行。 因此有一个“全局”模式寄存器,包含两个位,一个用于读取,另一个用于写入,如下所示:

初始执行是在模式01下完成的,因此只进行写入。 过程调用可以看到模式,因此它们知道没有以前的历史记录。 如果他们想创建对象,他们可以,并将识别信息放入FIFO(无需存储在变量中)

中间执行在模式11下完成,因此读取和写入都会发生,并且过程调用可以检测数据更改。 如果有要保持最新的对象, 他们的识别信息从FIFO读取并写入FIFO, 因此,可以访问它们,并在必要时对其进行修改

最后的执行是在模式10中完成的,因此只进行读取。 在这种模式下,过程调用知道它们正在清理。 如果有任何对象被维护,它们的标识符将从FIFO读取,并且可以删除它们


但真正的程序并不总是遵循相同的顺序。 它们包含IF语句(以及其他改变它们的行为的方式)。 这怎么办

答案是一种特殊的IF语句(及其终止的ENDIF语句)。 下面是它的工作原理。 它写入其测试表达式的布尔值,并读取测试表达式上次的值。 这样,它就可以判断测试表达式是否已更改,并采取措施。 它所采取的行动是临时改变模式寄存器

具体而言,x是从FIFO读取的测试表达式的先前值(如果启用读取,否则为0),y是写入FIFO的测试表达式的当前值(如果启用写入)。 (实际上,如果未启用写入,则测试表达式甚至不会计算,y为0。) 然后x,y简单地屏蔽了模式寄存器r,w。 因此,如果测试表达式已从True更改为False,则主体将以只读模式执行。相反,如果它已从False更改为True,则主体将在仅写模式下执行。 如果结果为00,则跳过If..ENDIF语句中的代码。 (您可能需要考虑一下,这是否涵盖了所有情况——确实如此。)

这可能不明显,但这些IF..ENDIF语句可以任意嵌套,并且可以扩展到所有其他类型的条件语句,如ELSE、SWITCH、WHILE、FOR,甚至调用基于指针的函数。在这种情况下,只要遵循模式,程序可以在任何需要的程度上划分为子程序,包括递归程序

(有一个必须遵循的规则,称为擦除模式规则,即在模式10中,不应进行任何结果的计算,例如跟踪指针或为数组编制索引。从概念上讲,原因是模式10的存在只是为了清除内容。)

因此,这是一个有趣的控制结构,可以利用它来检测更改,通常是数据更改,并对这些更改采取行动


它在图形用户界面中的用途是使某些控件集或其他对象与程序状态信息保持一致。对于该用途,这三种模式称为显示(01)、更新(11)和擦除(10)。 该过程最初在显示模式下执行,在该模式下创建控件,与控件相关的信息填充FIFO。 然后在更新模式下执行任意数量的执行,在更新模式下,根据需要修改控件以保持程序状态的最新状态。 最后,在擦除模式下执行,从UI中删除控件,并清空FIFO

这样做的好处是,一旦您编写了创建所有控件的过程,作为程序状态的函数,您就不必编写任何其他内容来保持更新或随后的清理。 任何你不必写的东西都意味着犯错误的机会更少。 (有一种简单的方法可以处理用户输入事件,而无需编写事件处理程序并为其创建名称。下面链接的一个视频对此进行了解释。)

在内存管理方面,不必组成变量名或数据结构来保存控件。它在任何时候只为当前可见的控件使用足够的存储空间,而潜在可见的控件可以是无限的。此外,对以前使用的控件的垃圾回收也没有任何顾虑——FIFO充当自动垃圾回收器

就性能而言,在创建、删除或修改控件时,无论如何都需要花费时间。 当它只是更新控件,并且没有更改时,与更改控件相比,读取、写入和比较所需的周期非常微小

另一个性能和正确性考虑,相对