Compiler construction Erlang编译器-模式匹配性能和底层数据结构

Compiler construction Erlang编译器-模式匹配性能和底层数据结构,compiler-construction,erlang,pattern-matching,Compiler Construction,Erlang,Pattern Matching,我想知道所使用的底层数据结构是什么,模式匹配的性能是什么?特别是,与搜索Trie的性能相比 更新:我希望对Erlang编译器实现的模式匹配有一个简明而准确的理解。什么是底层数据结构,搜索模式的效率有多高?模式匹配编译本身并没有“底层数据结构”-它只是一种根据一组模式分解任何给定数据结构并将判断是否找到匹配所需的步骤数减到最少的策略,或者是否不可能匹配 如果您的输入是一个字符串,并且模式是该字符串的前缀,那么该行为与trie搜索的行为类似。以Erlang case开关为例,将其表示为: case

我想知道所使用的底层数据结构是什么,模式匹配的性能是什么?特别是,与搜索Trie的性能相比


更新:我希望对Erlang编译器实现的模式匹配有一个简明而准确的理解。什么是底层数据结构,搜索模式的效率有多高?

模式匹配编译本身并没有“底层数据结构”-它只是一种根据一组模式分解任何给定数据结构并将判断是否找到匹配所需的步骤数减到最少的策略,或者是否不可能匹配

如果您的输入是一个字符串,并且模式是该字符串的前缀,那么该行为与trie搜索的行为类似。以Erlang case开关为例,将其表示为:

case String of
    "tea" ->  3;
    "ted" ->  4;
    "inn" ->  5;
    "to"  ->  7;
    "in"  ->  9;
    "i"   -> 11;
    "ten" -> 12;
    "A"   -> 15
end
由于没有保护表达式使子句复杂化,编译器可以自由地对它们进行重新排序以提高效率(按类型和值排序),因此共享相同前缀的所有模式都是相邻的。这对程序员来说很方便,他们不必关心手动保持列表的有序性


之后,编译器将把子句集转换为许多嵌套的小写表达式,执行最少的测试。首先,它将检查第一个字符是
A
i
还是
t
。如果没有,则不能匹配,否则分支检查字符串的其余部分;e、 例如,如果第一个字符是
i
,请检查下一个字符是
n
还是字符串的结尾。同样,如果两者都不是,则不可能存在匹配,否则将再次分支。依此类推,生成代码以检查所有模式的所有分支。

请参阅这些问题的答案:-感谢您聚合这些链接。实际上,我在发布这篇文章之前已经阅读了这两篇文章,并确定即使它们很有用,它们也没有直接回答我的问题。我希望熟悉Erlang实现模式匹配方式的人能够看到这一点,并阐明与Trie相关的实现的算法复杂性,从而使编译器生成的那些子句成为数据结构。问题是-正在使用什么样的数据结构?如果它在搜索分支,我们要处理的是什么样的树结构?我不是在这里寻找模式匹配原则的一般解释。我希望能够准确地理解Erlang编译器如何将模式匹配编译优化为数据结构,以及搜索已编译数据结构所需的时间复杂性;只是一堆嵌套的if-then-else,执行搜索。唯一的数据结构是整个机箱开关的输入。除非你想把代码看作是一种“数据结构”,否则就没什么可说的了。感谢扩大的答案,这回答了我的问题。