将haskell代码概括/编译为lambda

将haskell代码概括/编译为lambda,haskell,compilation,decompiling,Haskell,Compilation,Decompiling,我几乎90%确信这个问题的标题是错误的,但是我不知道正确的标题是什么(如果有建议,我会很乐意编辑标题!) 当阅读Haskell和语言的核心原则时,你总会发现它是一种“基于lambda表达式”的语言。我记得在某个地方读到过,这意味着最后,main函数只是被“预处理”成一个大lambda,所有内容都被内联,基本上你的整个代码变成了一个巨大的lambda表达式 我的问题是: 我上面说的是真的吗 如果问题1的答案是“是”,是否有。。。反编译器/部分编译器/预处理器?我知道这可以让你看到C/+++和Has

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

当阅读Haskell和语言的核心原则时,你总会发现它是一种“基于lambda表达式”的语言。我记得在某个地方读到过,这意味着最后,
main
函数只是被“预处理”成一个大lambda,所有内容都被内联,基本上你的整个代码变成了一个巨大的lambda表达式

我的问题是:

  • 我上面说的是真的吗

  • 如果问题1的答案是“是”,是否有。。。反编译器/部分编译器/预处理器?我知道这可以让你看到C/+++和Haskell等语言背后的汇编代码,但是有什么我可以用来探索生成的lambda表达式吗


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

    让我们区分一下Haskell的语义和GHC的实现。这主要是因为我们对语言语义使用的术语与汇编语言不同,但也因为其他一些编译器的工作方式可能与GHC不同

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

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


    GHC提供。我不确定你会对哪个感兴趣。Core是感觉像Haskell的最低级别表示。Cmm(也称为C-)是感觉像汇编的最高级别表示。

    让我们区分Haskell的语义和GHC的实现。这主要是因为我们对语言语义使用的术语与汇编语言不同,但也因为其他一些编译器的工作方式可能与GHC不同

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

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


    GHC提供。我不确定你会对哪个感兴趣。Core是感觉像Haskell的最低级别表示。Cmm(也称为C-)是感觉像汇编的最高级别表示。

    解释器可以自由地执行它想要的操作,但大多数解释器不会构造一个巨大的(lambda)表达式。在lambda演算中,它认为可以用一个lambda表达式来表示每个Haskell程序。但实际上,编译器更“实用”。例如,在lambda演算中,整数通常被实现为peano数,但这会使其速度非常慢。解释器可以自由地执行它想要的操作,但大多数解释器不会构造一个巨大的(lambda)表达式。在lambda演算中,它认为可以用一个lambda表达式来表示每个Haskell程序。但实际上,编译器更“实用”。例如,在lambda演算中,整数通常被实现为peano数,但这会使其速度非常慢。