引子
计算机解决问题时,就是状态机从一个状态集合跳转到另一个状态集合的过程。状态迁移的过程是由计算机程序(亦即计算机汇编指令)来控制的,不同的指令序列会导致截然不同的计算结果,前面已经提到过指令序列的相似程度和字符串的相似程度是不同的。那么从计算机执行指令序列,能够得到计算字符串相似问题什么启发呢?
计算机指令序列
前面提到不同的计算机指令序列,在相同输入情况下所导致的结果有可能是截然不同的(有点儿蝴蝶效应的味道),因为指令类型中有控制跳转指令等分支指令,会导致在计算过程中在稍微不同的前提条件下就会导致完全背离的运算过程。现行的汇编指令是状态相关的,会当前不同的状态做出不同的选择。
汇编指令可以使用数学中的函数代替,例如”INC”可以使用f()表示,”ADD op1, op2”可以使用f(x, y)。一个程序的执行可以使用一个函数序列来表示,fb() = F()=Fi()*Fj()*Fk()…*Fw()。其中”*”表示后面的函数作用在前面的函数的输出结果上。不同的指令也可以通过不同的字符来表示,例如AIMT等。前面提到过指令序列的相似性是字符串相似性不同的,由于汇编指令中存在JMP指令,不可能通过编辑距离来测量指令序列的相似性。
那么通过能不能通过指令序列的执行时所导致的状态变化来测量字符串的相似性呢?答案是可以,但是需要对指令做一些调整。跳转指令首先需要删除,因为在相同的开始状态下,即使结果状态截然不同,指令序列也有可能是极其相似的。另外需要注意到汇编指令都是带参函数,这是和普通的字符串不同的。
但是我么可以自定义一种虚拟机出来来执行我们自定义的指令,来专门测试字符串相似性。