我一直在从头开始实现自己的脚本语言+虚拟机,这是一个小实验。脚本读取器解析脚本并将其转换为运行时引擎将执行的指令流。
起初我没有考虑,但是现在我想包括流控制(循环,分支等)。我对语言理论不太了解,只是看了一些启发性的例子。
但是x86和Java虚拟机都有大量用于流控制的指令。在x86中,有很多指令根据标志的状态跳转,而其他指令则以一种或另一种方式操纵相关标志。在Java中,似乎有16条指令可以进行某种比较和条件跳转。
这可能是有效率的,或者是出于硬件特定的原因,但这不是我想要的。
我正在寻找一种精简,优雅的流控制解决方案,该解决方案仅需要一些专用指令,并且实现和维护起来不会太复杂。
我非常有信心,我可以提出一些可行的方法,但是我宁愿提高自己的知识,而不是重新发明轮子。非常欢迎对相关材料的任何解释或链接!
通常,流控制所需的最小原语是
无条件跳转
条件跳转
其中,条件跳转是一个复杂的跳转,它至少需要在原子上支持以下内容:
测试二进制变量/标志
如果设置了标志,则导致指令执行跳到某些指定位置
如果未设置该标志,则允许指令执行不间断地继续
然而,通过这种原始的条件跳转,您将需要将二进制变量/标志设置为适用于您的语言的流控制结构的每种类型的布尔表达式的适当值。
因此,这将导致需要设置复杂度不同的各种基元来设置二进制变量/标志,或者需要发出复杂的指令序列以获得所需的效果。
另一种选择是引入更复杂的条件跳转原语。
通常,每个条件的条件跳转原语的数量和复杂度之间都要进行权衡。条件(变量/标志)设置原语;发出的指令。