Generalizing/compiling haskell 代码到 lambda
Generalizing/compiling haskell code into a lambda
我几乎 90% 确定这个问题的标题是错误的,但我不知道正确的标题是什么(如果有建议,我很乐意编辑标题!)。
在阅读 Haskell 和语言的核心原则时,您总是会发现它是一种语言 "based on lambda expressions"。我记得在某处读到这意味着最后,main
函数只是将 "proprocessed" 变成一个大的 lambda,一切都被内联,基本上你的整个代码变成了一个单一的、巨大的 lambda 表达式。
我的问题是:
我上面说的是真的吗?
如果问题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--)是最高级别的表示,感觉像汇编。
我几乎 90% 确定这个问题的标题是错误的,但我不知道正确的标题是什么(如果有建议,我很乐意编辑标题!)。
在阅读 Haskell 和语言的核心原则时,您总是会发现它是一种语言 "based on lambda expressions"。我记得在某处读到这意味着最后,main
函数只是将 "proprocessed" 变成一个大的 lambda,一切都被内联,基本上你的整个代码变成了一个单一的、巨大的 lambda 表达式。
我的问题是:
我上面说的是真的吗?
如果问题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--)是最高级别的表示,感觉像汇编。