5

我正在学习惰性函数式语言评估并遇到了 STG 机器。为了理解它,我正在为功能语言(STG)构建一个小型玩具编译器。

然而,有一件事我无法真正理解:根据 1992 年的论文,stg 表达式可以是:let绑定、case表达式、应用程序、构造函数、内置操作或未装箱的文字。

因此,如果我有一个只使用变量而不调用它的程序,它仍然必须编译为应用程序,因为 stg 表达式变体中没有“var”选项(本文第 20 页)。例如:

id x = x

编译为

id = {} \ {x} -> x {}  # application with no arguments

但是,如果这个id函数需要一个原始值呢?( id :: Int# -> Int#) 它无法编译为应用程序,因为您无法“输入”原始值,但没有其他选择吗?

非常感谢

(编辑:链接到我所指的论文

4

1 回答 1

3

引用的论文将输入原始值与闭包区分开来。您建议的编译包括将原语应用于零参数是正确的。STG 机器被定义为仅在该值是指向闭包(即 an Addr)的指针时才进入应用程序的“函数”部分(第 5.2 节,规则 1)。如果它不是指针,而是原始值,则该规则不适用,并且不同的规则(第 5.5 节,规则 10)会导致返回原始值。

于 2022-01-17T22:59:21.260 回答