代码之家  ›  专栏  ›  技术社区  ›  Rares Dima

将haskell代码泛化/编译成lambda

  •  0
  • Rares Dima  · 技术社区  · 6 年前

    main 函数只是被“预处理”成一个大的lambda,所有的东西都被内联,基本上你的整个代码变成一个单一的,巨大的lambda表达式。

    我的问题是:

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

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

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

    1 回复  |  直到 6 年前
        1
  •  3
  •   bergey    6 年前

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

    每个Haskell程序定义 main 表达 类型 IO () 主要的 是一些嵌套的函数调用树。即使是一个 do 块定义为对函数的调用 (>>) (>>=)

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

    GHC提供 many options for printing intermediate stages of compilation