我正在编写一个具有任意整数(编码,而不是字面意义)参数的小语言VM,并且即将实现if语句。 if语句要编译的久经考验的公式
if (EXPRESSION) {
BODY
}
进入
EXPRESSION
JUMP-IF-FALSE body-length
BODY
但是,我正在努力查看单遍编译器在生成JUMP-IF-FALSE
命令时如何确定主体长度。
使用恒定大小的指令,您可以只添加两个额外的字节或其他内容,然后返回并对其进行修补,但是对于需要插入或串联的可变大小的指令,则需要两个O(N)进程。
因此,我唯一的选择似乎是切换到恒定大小的跳转指令,并且每个MAXJUMP-1
字节插入一条命令以跳过下一条指令,然后再跳过另一条JUMP
指令。
即使这种情况(65k +固定字节并跳转2字节)真的不太可能,但我真的很想不必这样做。