【问题标题】:Compile Haskell programs to C将 Haskell 程序编译为 C
【发布时间】:2018-08-27 11:04:39
【问题描述】:

我必须遵循我正在尝试编译为 C 的 Haskell 程序。 我查看了this SO post,但在那里找不到答案。

quicksort [] = []
quicksort (p:xs) = (quicksort lesser) ++ [p] ++ (quicksort greater)
  where
    lesser  = filter (<  p) xs
    greater = filter (>= p) xs

main = print(quicksort([5,2,1,0,8,3]))

这是我尝试过的:

$ ghc -C main.hs

我得到的是:

ghc: the option -C is only available with an unregisterised GHC
Usage: For basic information, try the `--help' option.

这有点奇怪,因为当我查看帮助时,我看到了这个:

-C 生成 C 后停止(.hc 输出)

【问题讨论】:

  • 请注意,您可以使用外部函数接口将 Haskell 编译为目标文件和 C header 文件。然后可以将它们链接到 C 程序中。这比从字面上反编译成 C 源代码要好得多。

标签: c haskell compilation


【解决方案1】:

现在编译为 C 是一种特殊用途的技巧,主要用于引导新架构。因此,默认情况下不支持它。 The GHC wiki 有一些关于在启用此支持的情况下自己构建 GHC 的说明;标准构建和能够编译为 C 的构建之间的主要区别是使用 --enable-unregisterised 标志进行配置。另请参阅full list of pages on building GHC——它非常复杂,所以如果你决定这样做,你会想把它放在手边。

【讨论】:

    【解决方案2】:

    那个选项很古老。

    几年前,GHC 曾经通过 C 编译,但在正常情况下不再这样做。现在 GHC 使用自己的本机代码生成器(或 LLVM),而不是生成 C 代码并使用 gcc 进行编译。

    从技术上讲,可以将 GHC 本身编译为“未注册”以重新启用该选项。这需要从其源代码自定义构建 GHC。然而,这将产生相当低效的 C 代码。务实地说,这只在交叉编译或将 GHC 移植到新架构时才会这样做。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-03
      • 2018-05-10
      • 1970-01-01
      • 1970-01-01
      • 2018-10-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多