Generalizing/compiling haskell 代码到 lambda

Generalizing/compiling haskell code into a lambda

我几乎 90% 确定这个问题的标题是错误的,但我不知道正确的标题是什么(如果有建议,我很乐意编辑标题!)。

在阅读 Haskell 和语言的核心原则时,您总是会发现它是一种语言 "based on lambda expressions"。我记得在某处读到这意味着最后,main 函数只是将 "proprocessed" 变成一个大的 lambda,一切都被内联,基本上你的整个代码变成了一个单一的、巨大的 lambda 表达式。

我的问题是:

  1. 我上面说的是真的吗?

  2. 如果问题1的答案是"yes",有没有...decompiler/partialcompiler/preprocessor?我知道 this 可以让您看到 C/++ 和 Haskell 等语言背后的汇编代码,但是有什么我可以用来探索生成的 lambda 表达式的吗?

这个问题是纯粹从教育的角度提出的,并不是为了寻求特定问题的解决方案。我只是想更多地了解一门我觉得非常迷人的语言。

我们来区分一下语义的Haskell和GHC的实现。主要是因为我们对语言语义使用的术语与汇编术语不同,而且还因为其他一些编译器的处理方式可能与 GHC 不同。

每个 Haskell 程序都定义了 main,它是类型 IO ()表达式。我不喜欢称它为 "lambda expression" 因为类型表明它不是函数。 main 的定义是一些嵌套的函数调用树。甚至 do 块中的连续行也被定义为对函数 (>>)(>>=).

的调用

GHC 使用启发式方法来决定内联什么,以获得最佳的运行时性能。它通常会内联非递归的小表达式。我相信运行时系统维护当前正在评估的函数的调用堆栈,这与用 C 或其他命令式语言编译函数调用的运行时结果没有什么不同。

GHC 提供 many options for printing intermediate stages of compilation。我不确定您会发现哪个有趣。核心是最低级的表示,感觉像Haskell。 Cmm(也叫C--)是最高级别的表示,感觉像汇编。