GHC的设计是基于一种叫做STG,它的全称是“有骨气,无标签G-机”。
现在G-机显然是短期的“图形减速机”,它定义懒惰是如何实现的。 未计算的thunk存储为表达式树,并执行该程序涉及减少这些降至正常形式。 (A 树是一个非循环图,但Haskell的普适递归意味着Haskell的表达式形成一般图 ,因此图的减少和不树还原)。
不太清楚的是,术语“骨气”和“无代码”。
我认为 ,“骨气”是指一个事实,即功能的应用不具有的功能应用节点“脊梁”。 取而代之的是,你有一个对象,它的名字叫功能,并指出它的所有参数。 那是对的吗?
我认为“无标签”指的是构造节点不被“标记”构造ID,而是区分表达式是用一个跳转指令解决。 但现在我不知道这是正确的。 相反,它似乎是指一个事实,即节点没有被标注为他们的评价状态。 任何人都可以澄清这些解释它(如果有的话)是正确的?
GHC维基包含由Max波林勃洛克STG写一篇介绍性文章:
我知道功夫:学习举例STG
该STG机是GHC,全球领先的Haskell编译的重要组成部分。 它定义了Haskell的评价模型应在标准硬件上有效执行。 尽管这个键的作用,人们普遍了解甚少之间GHC用户。 该文献的目的是通过一系列表示的Haskell源代码是如何编译简单的例子,以提供在其现代,EVAL /应用为主,指针标记的化身STG机器的概述。
你说得对有关“骨气”,这是它,如果我是正确的。 它是在1988年的文章由烧伤,佩顿-Jones和罗布森“的骨气G-机”基本上描述。 我读过它,但它不是在我的脑海那么新鲜。 基本上,在G-机,所有的堆栈条目指向应用节点以外的一个在顶部,它指向的表达式的头部。 这些应用节点使访问间接的参数,并在一些G-机的描述,将一个函数之前堆栈重新排列,使堆栈上的最后n个节点是由指向的说法,而不是应用程序节点。 如果我没有错的,则“骨气”部分是完全避免具有层叠在这些应用节点(其被称为图形的脊),从而避免了各还原之前重新安排。
至于“无需生成代码”的一部分,你现在,你用更正确的,但...上的节点使用的标签是一个非常,非常古老的东西。 你能想出如何动态类型语言,如实现LISP的? 每个细胞都必须有它的价值和它说类型的标签。 如果你想要的东西,你必须检查标签,并采取相应的行动。 在Haskell的情况下,评估状态比种类更为重要,Haskell是静态类型的。
在STG机,不使用的标签。 标签被替换了,也许通过OO lanaguages的灵感,由一组函数指针。 当你想这还未计算节点的值,该函数将计算它。 当它已经计算,该函数返回。 这允许在什么该功能可以在不使客户端代码进行任何更复杂的做了很多的创意。
这种“无需生成代码”的一部分,是的,在“执行功能的语言对股票硬件”的SPJ文章描述。
也有反对这种“无标签”的东西。 基本上,这涉及函数指针,这是在计算机体系结构的术语间接跳转。 和间接跳转是一个障碍,分支预测,并因此流水线一般。 因为无论是架构考虑上有跳跃参数数据的依赖性,停止管道,或体系结构假设它不知道目的地和停止管道。
通过migle答案正是STGM的spinlessness和taglessness意思。 今天,它确实不值得尝试了解这两个功能的名称,因为名称从图表减排技术史干:从G-机,没有骨气的G-机和骨气和无需生成代码G-机。
在G-机同时使用脊椎和标签。 一种脊椎是从一个函数应用到该函数的节点的根节点边缘的列表。 例如,一个功能应用“F E1 E2 ... en”的表示为
root = AP left_n en
left_n = AP left_n-1 en-1 ...
left_2 = AP left_1 e1
left_1 = FUN f
在G-机等的脊是由left_n的边缘的列表 - > left_n-1 - > ... - > left_2 - > left_1。 这是字面上的功能应用的脊柱!
在相同功能的应用程序,有标签AP和乐趣。
在接下来的先进G-机所谓的骨气G-机,有通过在连续的块,其第一时隙点至f,第二槽指向E1代表这样的功能的应用程序,...没有这样的脊柱,并且的n + 1个时隙点EN。 在此表示,我们并不需要一个脊椎。 但块开始一个特殊的标签指定插槽的数量等等。
在最先进的G-机所谓的骨气无需生成代码G-机,这样的标签替换为函数指针。 为了评估功能应用是函数指针跳转到的代码。
很不幸地发现,西蒙佩顿琼斯的STGM纸不给编译/评估规则在一些抽象的水平,所以这是很自然的人不容易理解的STGM的精髓。