我正在创建一种编译为字节码并在自定义VM上运行的小语言,其架构在很大程度上受到我读过的关于Python和Lua的影响。有两个堆栈 - 一个存储函数参数,局部变量和临时值的数据堆栈,以及一个每个活动函数调用包含一个条目的帧堆栈。帧堆栈上的每个条目都包含诸如当前函数,指令指针(当前函数的字节码数组的索引)和基指针(索引到数据堆栈 - 标记函数的args / locals开始的位置)等信息。
我失去的地方是实施REPL,或者更具体地说是eval()
的实施。到目前为止,这个想法一直是在同一个堆栈框架内持续评估用户输入 - 但我看不到一种简洁的方法来允许在eval()
内创建新的局部变量。因为临时数据总是高于堆栈上的本地数据(堆栈向上增长),我能够想到的唯一方法是以某种方式注意到eval()
创建了新的本地化,然后使用一些hackery重新排列堆栈 - 但这会在一般情况下产生问题。例如,如果有一个有条件地使用eval()
的递归函数,我需要遍历帧堆栈并可能调整每个帧的数据堆栈。
我的VM是否能够支持合理实施eval()
?如果是,上述方法是否合理?如果不是,需要进行哪些架构更改?