Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F# 解释器可以用符号表实现吗?_F#_Interpreter_Symbol Table - Fatal编程技术网

F# 解释器可以用符号表实现吗?

F# 解释器可以用符号表实现吗?,f#,interpreter,symbol-table,F#,Interpreter,Symbol Table,我经常听说使用符号表可以优化编程语言中符号的查找。目前,我的语言仅作为解释器实现,而不是作为编译器实现。我还不想分配时间来构建编译器,所以我正在尝试优化解释器。该语言在很大程度上基于Scheme语义和语法,并且是静态范围的。我使用AST在运行时执行代码(在我的解释器中,实现为有区别的联合,就像中的AST一样,在48小时内为自己编写一个方案 不幸的是,我的解释器中的符号查找速度很慢,因为使用了F#Map来按名称包含和查找符号。我想改为使用符号树来实现更快的符号查找。但是,我不知道是否或如何在解释器

我经常听说使用符号表可以优化编程语言中符号的查找。目前,我的语言仅作为解释器实现,而不是作为编译器实现。我还不想分配时间来构建编译器,所以我正在尝试优化解释器。该语言在很大程度上基于Scheme语义和语法,并且是静态范围的。我使用AST在运行时执行代码(在我的解释器中,实现为有区别的联合,就像
中的AST一样,在48小时内为自己编写一个方案

不幸的是,我的解释器中的符号查找速度很慢,因为使用了F#Map来按名称包含和查找符号。我想改为使用符号树来实现更快的符号查找。但是,我不知道是否或如何在解释器中实现符号表。我只在编译器的上下文中听说它们

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


谢谢!

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

如果你想优化你的解释器,不要在运行时需要一个符号表

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

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


符号表是用来存储符号的任何东西。它不引用特定的数据结构(AFAIK)。您考虑过使用哈希表吗?我知道您可能想要持久性(大概每个作用域都有自己的表),但您可以通过“作用域”的链接列表来实现这一点每个都有一个只读的符号字典。符号解析将包括从最里面的范围开始,向外遍历,一路上检查每个符号表。Danial-我认为使用符号表至少意味着常数时间查找的特性。这是我从我读过的文献中猜出的,至少是这样。我认为这有点像你的最后一个问题:在不知道为什么
Map
太慢以及速度有多快的情况下,只能给出一般性的建议,而不能给出精确的补救措施。哈希表将为每个范围提供O(1)个查找,所以O(m),其中m是作用域的数量,总的来说。我无法想象它对解释器来说不够快。让我有点不安的是,Jon Harrop明确表示要使用符号表,我想他心里有一个特定的数据结构。但是,我不确定我是否明确表示我需要对解释器进行优化,而不是我是一个编译器。很抱歉这些不清楚的问题-我在黑暗中摸索了一下。我希望Jon突然出现在这里澄清。谢谢你的链接-我将通读这些材料!但是,我在翻译的上下文中用谷歌搜索“Debriijn encoding”的引用时遇到了麻烦。@BryanEdds,我认为更准确的术语是De Bruijn indexing、 添加了一个到维基百科的链接。谢谢你的链接。但是,这对我来说是相当困难的,因为我不知道如何在我的解释器中翻译成实际代码:)是否有一些参考资料可以用来理解如何在我的程序中将理论与实践联系起来?@BryanEdds,继续研究,这需要一些时间来获得直觉,但这是值得的。我添加了一个简单的示例,演示如何在没有符号表的情况下解释De Bruijn索引代码。这似乎会导致错误消息(没有变量名?)。
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