Compiler construction 是否有一种算法来确定某些命令式代码是否是引用透明的?

Compiler construction 是否有一种算法来确定某些命令式代码是否是引用透明的?,compiler-construction,functional-programming,static-analysis,Compiler Construction,Functional Programming,Static Analysis,是否有一种算法可以确定,给定命令式代码(以及周围的程序)的块X,该代码是否是引用透明的 到目前为止,我得到的是: 一段代码是RT,如果 在控制流离开X后,不会读取分配给X中的非参考变量 所有在X中被取消引用和赋值的参考变量都可以被证明是指遵循规则1的变量 不读取变量或调用函数,其值取决于运行时状态(即scanf(),time(),argv) 编辑:参见注释 这种算法的精确性并非绝对必要,但更可取。(这是真实的生活,不是CS类,所以,“简单比正确好一点。”) 编辑2: 无引用或指针的简化语言

是否有一种算法可以确定,给定命令式代码(以及周围的程序)的块
X
,该代码是否是引用透明的

到目前为止,我得到的是:

一段代码是RT,如果

  • 在控制流离开X后,不会读取分配给X中的非参考变量

  • 所有在X中被取消引用和赋值的参考变量都可以被证明是指遵循规则1的变量

  • 不读取变量或调用函数,其值取决于运行时状态(即
    scanf()
    time()
    argv

  • 编辑:参见注释

    这种算法的精确性并非绝对必要,但更可取。(这是真实的生活,不是CS类,所以,“简单比正确好一点。”)

    编辑2:

    无引用或指针的简化语言的算法草图/想法,表示为抽象语法树:

  • 查找因果对(即变量的赋值和使用)
  • 对于每一对,将AST中的父节点标记为最低公共祖先之前且不包括最低公共祖先的非RT节点

  • 问题:如何处理初始值设定项?它们算作作业吗?

    你可能想了解“效果系统”或“类型和效果系统”,这是一种描述和跟踪计算的副作用类型的机制。我不确定是否有任何系统能够进行推理,而不是依赖效果注释,但至少你应该能够了解你需要担心什么。

    你可能想了解“效果系统”或“类型和效果系统”,这是一种描述和跟踪计算有哪些副作用的机制。我不确定是否有任何系统能够进行推理,而不是依赖效果注释,但至少您应该能够了解您需要担心的事情。

    是否可以确定两段代码在一般情况下是否具有引用透明性?不,为什么?因为没有一个程序的分析是完全精确的(证据:大量不同的公式,基本上是停止问题)。但是,您可以是近似值。一般来说,有一些技术可以证明什么类型的程序绝对是引用透明的(因为我们在不近似的保守方面出错,所以必然会有一些程序是正确的,但无法证明是正确的):

    • 首先,您需要修复一种语言。分析取决于语言,分析的复杂性将根据您的语言所具有的特性而发生很大变化:并发性、引用、指针,所有这些都很难处理。(引用和指针不一样,一般来说,处理任意指针算法比简单引用更难!)
    • 你可以看看一些定理证明或模型检验。这些工具可用于检查两个程序是否具有相同的输出,方法是导出对程序建模的公式,然后尝试确定它们是否描述了相同的行为集
    • 是一种非常流行且不断发展的技术,用于在指针存在的情况下证明两个命令式程序是正确的。其基本思想是对堆的不相交部分进行组合推理(为什么这是好的?考虑写一个链表实现,现在将它与一些随机写入到链表中间的代码结合起来。这是验证的地狱))
    • 在函数世界中,人们试图将等式推理应用到他们的代码中。虽然这在命令式程序中并不完全相同,但如果使用对堆断言建模,则可以执行类似的操作

    有没有现成的工具可以应用于大型代码库?不,因为大型代码库使用的是无法进行推理的东西(反射、困难的别名类等等)。本质上,你的问题归结为某种定理证明,你需要能够证明两个程序是等价的。有很多关于子问题的论文都在讨论这个问题。例如,考虑用玩具语言编写的非常简单的程序(是一个流行的例子!),大量的论文试图解决这样的问题。不,为什么?因为没有一个程序的分析是完全精确的(证据:大量不同的公式,基本上是停止问题)。但是,您可以是近似值。一般来说,有一些技术可以证明什么类型的程序绝对是引用透明的(因为我们在不近似的保守方面出错,所以必然会有一些程序是正确的,但无法证明是正确的):

    • 首先,您需要修复一种语言。分析取决于语言,分析的复杂性将根据您的语言所具有的特性而发生很大变化:并发性、引用、指针,所有这些都很难处理。(引用和指针不一样,一般来说,处理任意指针算法比简单引用更难!)
    • 你可以看看一些定理证明或模型检验。这些工具可用于检查两个程序是否具有相同的输出,方法是导出对程序建模的公式,然后尝试确定它们是否描述了相同的行为集
    • 是一种非常流行且不断发展的技术,用于在指针存在的情况下证明两个命令式程序是正确的。基本的想法是对堆的不相交部分进行组合推理(为什么这是好的)?考虑写一个链表实现,现在你将它与一些随机写入到链表中间的代码结合起来。这就是VILF的地狱。