gpt4 book ai didi

ruby - 在编译过程中何时/何地发生类型检查

转载 作者:数据小太阳 更新时间:2023-10-29 07:47:26 24 4
gpt4 key购买 nike

想知道在编译过程中(在高层次上)通常何时进行类型检查(教科书与实践)。我对编译过程的大致理解是:

  1. 将源代码解析为 AST
  2. 将 AST 转换为中间表示 IR
  3. 优化 IR(即 SSA 表格、寄存器分配等)
  4. 简化 IR
  5. 生成最终输出代码

想知道类型检查是发生在 (1) 和 (2) 之间、(2) 和 (3) 之间,还是发生在 (4) 之后,或者它是否发生在整个过程中,或者其他什么地方。我很想知道面向对象、函数式和逻辑编程的答案(按优先顺序排列),但是如果我必须选择一个,那么 OO,例如像 Ruby 这样的动态类型语言,或者像 Ruby 这样的静态类型函数语言 haskell 。

最佳答案

静态类型检查通常在 AST 上执行,因此它要么发生在 1 和 2 之间,要么作为 2 的一部分(这意味着 IR 生成器在处理 AST 节点时调用类型检查器的函数 - 当然是IR 生成器和类型检查器应该仍然存在于不同的模块/文件中。

理论上,您可以对 IR 执行类型检查,但这通常至少会导致以下问题之一:

  1. IR 不包含足够的信息来捕获您想要的所有错误。
  2. IR 包含的信息不足以在所有情况下生成最佳错误消息。例如,考虑 IR 使用相同的指令表示数组访问和指针算术。现在您想要为具有浮点索引的数组访问产生错误。如果消息是“不允许将浮点值作为指针算术的操作数”,那么当代码不包含任何指针算术时会造成混淆。要求用户知道数组访问表示为指针算法以理解错误消息,这对用户来说不是很友好。
  3. 您为类型检查向 IR 添加了大量额外信息,使 IR 更加复杂和笨重,但您从中获得的只是能够以与您相同的方式处理 IR AST 会这样做,而不会获得任何好处。

通常处理 IR 而不是 AST 意味着您不必处理那么多情况(正是因为 IR 使用相同的指令表示不同的事物)。这是主要的好处。但是,如果您随后为了能够再次以不同的方式处理案例而跳过额外的环节,那么您不妨首先使用 AST。

因此通常首选对 AST¹ 进行类型检查。 GHC(主要的 Haskell 编译器)执行 AST 的类型检查。

¹ 或者至少是一些非常接近 AST 的东西——例如,在 AST 和最终的 IR 之间可能有一个表示,它在某些方面简化了事情(例如删除扁平化的嵌套表达式),而不会丢失相关信息进行类型检查。


动态类型检查发生在运行时。执行这些动态类型检查的代码是解释器的一部分(如果有解释器)或由代码生成器插入。

Ruby 在解释器中执行类型检查。

关于ruby - 在编译过程中何时/何地发生类型检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50546898/

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