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