【问题标题】:Compiling to idiomatic C编译成惯用的 C
【发布时间】:2009-12-08 17:34:30
【问题描述】:

是否有编译成惯用 C 的函数或 lisp-ish 语言的编译器?那里的大多数编译器似乎都提供了类似于由 C 宏组成的机器语言的东西。我想知道是否有任何东西可以生成基于高级语言的可读 C 代码。

【问题讨论】:

  • 但是……你为什么要它这样做?
  • 问题在于,无论你怎么看,许多高级结构在 C 级别上都是混乱的。例如,考虑嵌套闭包。
  • 我想知道是否有足够聪明的编译器可以弄清楚如何将尾递归循环转换为 for 循环,或者将事物转换为 CPS 并使用传递数据结构蹦床至少这通常是可读和可以理解的。
  • GCC 足够聪明,可以发现尾递归循环(甚至几乎是几乎尾递归循环)并将其转化为迭代——从 C 到 C,这使得在更高级别上做同样的事情看起来像无关的工作。
  • Steve:当然,每个 Scheme 编译器都需要发现尾递归。

标签: compiler-construction haskell lisp


【解决方案1】:

鉴于您使用 Haskell 标记了此问题,我将给出 Haskell 答案。 JHC 是一个 Haskell 编译器,它产生相当惯用的 ansi-C。它是一个优化的全程序编译器,可以生成非常快的二进制文件。我不确定它目前有多稳定,而且它可以处理的大型程序似乎是有限的。但不要相信我的话,自己去看看。

【讨论】:

  • 我指出了 Lisp-to-C,因为这个项目是专门为我的问题设计的,但不幸的是它不再可用。我真的在考虑给你点,因为 JHC 似乎按照你的建议生成了非常友好的代码。如果我能给出多分就好了。无论如何,感谢您将我指向 JHC,这是一个非常好的项目。我生成了一个只有 16K 的简单可执行文件!
【解决方案2】:

对于 Common Lisp,目前只有一种广泛使用的编译器可以编译为 C:ECL。您需要查看输出是否足够可读。

几年前,一家公司专门为此目的出售了 Common Lisp 编译器:将 Lisp 编译为“可维护”的 C。编译器非常昂贵。它不再可用,但似乎仍然在一两家公司使用:Lisp to C

【讨论】:

    【解决方案3】:

    我只找到了C->C++ converter。我不确定您是否可以将大多数功能语言转换为 LISP。结构和语法不太匹配。我相信你可以找到很多 C++ 转换器。

    【讨论】:

      【解决方案4】:

      内置的 haskell 编译器编译为 C。虽然 IIRC 看起来并不漂亮。
      (检查,162 行 main = putStrLn "Hello, World!"

      编辑:当然是 GHC。

      【讨论】:

      • 有多种 Haskell 编译器,而且不止一种可以编译为 C,因此如果您说明您在谈论哪一种,将会很有帮助。如果您指的是 GHC,那么是的,它生成的 C 并不漂亮,而且与惯用语相去甚远。 JHC在这方面要好得多。不过,GHC 这些天正在努力摆脱通过 C 进行编译。他们正在开发一个新的花哨的后端,它将能够完成他们以前使用 C 编译器进行的所有低级优化。
      • 我不明白为什么我应该投反对票,因为我的答案没有错?
      • 我没有对你投反对票,但是很抱歉,它错了。我特别要求使用“惯用的 C”,而您的回答是生成“看起来不那么漂亮”的 C,这与我要求的相反。 (不过还是谢谢!)
      • 我的错,我根本没在那儿看到那个词。
      【解决方案5】:

      有一个名为 Stalin 的 Scheme 编译器可以生成高度优化的 C 源代码。

      【讨论】:

        猜你喜欢
        • 2012-06-07
        • 2019-06-11
        • 1970-01-01
        • 2015-08-18
        • 2012-06-17
        • 2012-07-24
        • 2020-09-22
        • 2015-01-13
        • 1970-01-01
        相关资源
        最近更新 更多