gpt4 book ai didi

f# - 解释器可以用符号表来实现吗?

转载 作者:行者123 更新时间:2023-12-01 08:12:10 32 4
gpt4 key购买 nike

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

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

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

谢谢!

最佳答案

符号表将一些信息与每个符号相关联。在解释器中,您可能会将值与符号相关联。 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

关于f# - 解释器可以用符号表来实现吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11524770/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com