【问题标题】:Can an interpreter be implemented with a symbol table?解释器可以用符号表来实现吗?
【发布时间】:2012-07-17 14:31:18
【问题描述】:

我经常听说使用符号表可以优化编程语言中符号的查找。目前,我的语言仅作为解释器实现,而不是编译器。我还不想分配时间来构建编译器,所以我正在尝试优化解释器。该语言大部分基于 Scheme 语义和语法,并且是静态范围的。我使用 AST 在运行时执行代码(在我的解释器中,实现为可区分联合,就像 Write Yourself a Scheme in 48 Hours 中的 AST。

不幸的是,由于使用 F# Map 按名称包含和查找符号,我的解释器中的符号查找速度很慢。 (嗯,事实上,它使用了 Trie,但性能同样有问题)。我想改用符号树来实现更快的符号查找。但是,我不知道是否或如何在解释器中实现符号表。我只在编译器的上下文中听说过它们。

这可能吗?如果实现策略或性能与编译器中的符号表不同,您能描述一下差异吗?最后,在我可能会查看的解释器中是否存在符号树的现有参考实现?

谢谢!

【问题讨论】:

  • 一个符号表是用来存储符号的任何东西。它不引用特定的数据结构 (AFAIK)。
  • 您考虑过使用哈希表吗?我意识到您可能想要持久性(大概是每个作用域都有自己的表),但是您可以通过“作用域”的链接列表来实现这一点,每个“作用域”都有一个只读的符号字典。符号解析将包括从最内层范围开始并向外遍历,沿途检查每个符号表。
  • Danial - 我认为符号表的使用至少意味着恒定时间查找的属性。无论如何,这是我从我读过的文学作品中的猜测。
  • 我认为这有点像你的最后一个问题:不知道为什么Map 太慢以及速度有多快,只能给出一般建议,而不是精确的补救措施。哈希表将为每个范围提供 O(1) 查找,因此 O(m),其中 m 是范围的总数。我无法想象它对口译员来说不够快。
  • 让我有点吃惊的是,Jon Harrop 特别提到要使用符号表,我想他心里有一个特定的数据结构。但是,我不确定我是否明确表示我需要优化解释器而不是编译器。抱歉这些不清楚的问题 - 我在黑暗中摸索了一下。我希望乔恩来这里澄清一下。

标签: f# interpreter symbol-table


【解决方案1】:

符号表将一些信息与每个符号相关联。在解释器中,您可能会将值与符号相关联。 Map 是一种特别适合函数式解释器的实现。

如果您想优化您的解释器,请在运行时摆脱对符号表的需求。一种方法是De Bruijn idexing

还有关于从函数式解释器机械派生优化解释器、VM 和编译器的优秀文献,例如:

http://www.brics.dk/RS/03/14/BRICS-RS-03-14.pdf

举个简单的例子,考虑使用 De Bruijn 索引编码的常量的 lambda 演算。请注意,评估器没有符号表,因为它可以使用整数进行查找。

type exp =
    | App of exp * exp
    | Const of int
    | Fn of exp
    | Var of int

type value =
    | Closure of exp * env
    | Number of int

and env = value []

let lookup env i = Array.get env i
let extend value env = Array.append [| value |] env
let empty () : env = Array.empty

let eval exp =
    let rec eval env exp =
        match exp with
        | App (f, x) ->
            match eval env f with
            | Closure (bodyF, envF) ->
                let vx = eval env x
                eval (extend vx envF) bodyF
            | _ -> failwith "?"
        | Const x -> Number x
        | Fn e -> Closure (e, env)
        | Var x -> lookup env x
    eval (empty ()) exp

【讨论】:

  • 感谢您的链接 - 我会处理材料!但是,我无法在解释器的上下文中搜索“DeBruijn 编码”的参考。
  • @BryanEdds,我认为更准确的术语是 De Bruijn 索引。添加了维基百科的链接。
  • 感谢您的链接。然而,这对我来说是相当高的,因为我不知道如何在我的解释器中翻译成实际的代码:) 有没有一些参考资料可以用来理解如何在我的程序中将理论与实践联系起来?
  • @BryanEdds,继续研究,这需要一些时间来获得直觉,但这是值得的。我添加了一个简单的示例,演示如何在没有符号表的情况下解释 De Bruijn 索引代码。
  • 这似乎会导致糟糕的错误消息(没有变量名?)。
猜你喜欢
  • 1970-01-01
  • 2013-05-01
  • 2017-03-30
  • 2010-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-10
  • 1970-01-01
相关资源
最近更新 更多