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