GHC 的设计基于一种叫做 STG 的东西,它代表“spineless, tagless G-machine”。
现在 G-machine 显然是“graph reduction machine”的缩写,它定义了如何实现惰性。未求值的 thunk 存储为表达式树,执行程序需要将它们缩减为正常形式。(树是无环图,但 Haskell 的普遍递归意味着 Haskell 表达式形成一般图,因此是图归约而不是树归约。)
不太清楚的是术语“spineless”和“tagless”。
我认为“spineless”是指功能应用程序没有功能应用程序节点的“spine”。相反,您有一个对象来命名被调用的函数并指向其所有参数。那是对的吗?
我认为“无标记”指的是没有用构造函数 ID“标记”的构造函数节点,而是使用跳转指令解析大小写表达式。但现在我不确定这是否正确。相反,它似乎指的是节点没有用它们的评估状态标记的事实。谁能澄清这些解释中哪一个(如果有的话)是正确的?