我有一种基于堆栈的自定义语言,我正在尝试将其编译为 CIL,因此可以对其进行 JIT 处理。该语言本身相当简单,因为它只有整数和布尔值。但是,每种数据类型都有一个专用堆栈。语言本身是一个命令流,其中每个命令都可以从任一堆栈中查看、推送和/或弹出值。命令推送/弹出的整数或布尔值的数量永远不会改变(因此命令具有固定的数量)。还有一个平面整数数组,该语言可以读取和写入值,表示外部存储器。堆栈本身可以任意深。
对于像“add”、“subtract”等简单的命令,将整数堆栈命令转换为 CIL 几乎是微不足道的:CIL 堆栈可以完全替换整数堆栈(尽管我有一个附带问题:是否有限制如何CIL 堆栈的深度可以在规范中还是在实践中?)但是也有像 StoreIfTrue 这样的命令,它只会将一个值(来自整数堆栈)存储到某个索引处的平面整数数组(索引也来自整数堆栈) 如果布尔堆栈的顶部值为真。因此,对于某些命令,我需要同时访问布尔堆栈和整数堆栈。
现在我必须维护一个 System.Collections.Generic.Stack 来表示布尔堆栈。但是我想知道是否有一种已知的算法或方法可以将我的自定义语言的两个堆栈模型“扁平化”为一个与 CIL 更直接兼容的单一堆栈模型。