【问题标题】:implementing jump-statement in ast-walking interpreter在 ast-walking 解释器中实现跳转语句
【发布时间】:2015-06-24 20:53:44
【问题描述】:

在 ast-walking 解释器中,代码是逐个节点执行的。如何实现 goto、break 或 continue 等功能?我停止当前执行并跳转到另一个节点?有什么最佳做法吗?

【问题讨论】:

    标签: interpreter abstract-syntax-tree break goto


    【解决方案1】:

    最佳做法是“不要为带有 goto 的语言解释 AST”。

    从根本上说,如果语言主要处理标量,则树遍历中的任何类型的不连续都会导致严重的减速。 (如果您的语言主要处理复杂的值,例如数组语言 APL,则无关紧要)。

    最好的办法是预先遍历树并确定 goto 在 AST 中的实际位置,并将其记录在旁边的关联缓存中。然后,当您遇到 goto 时,只需查询缓存而不是搜索树。

    但这是迈向编译的第一步,例如,在执行之前预先计算你可以做的事情。

    【讨论】:

    • 谢谢。解释语言的最佳方式是什么?我已经编写了构建 AST 的解析器。
    • 恕我直言,更好的方法是遍历您的 AST,生成所谓的线程代码,然后执行它。线程代码是由操作码组成的虚拟指令集,这些操作码实际上是指向操作码执行例程的指针。解释器在汇编中实现为“通过模拟 PC 获取下一个线程代码操作码;递增模拟 PC;通过指针间接跳转”。这段代码附加到每个操作码执行例程的end。这样的解释器很容易为其生成代码,并且在执行方面对解释器来说非常快。
    • 谢谢你:)。是否有任何关于生成线程代码的教程或指南?我认为解释这些说明并不难(link)。但一开始我必须定义自己的虚拟指令集?
    • 我现在读到它并用 java (link) 构建了一个小例子。你能看看代码吗?我只是想知道这是否是要走的路。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-29
    相关资源
    最近更新 更多