方案到 C 翻译器

Scheme to C translator

我试图从一个方案函数开始生成 C 代码,但我没能找到任何从方案到 C 的翻译器。我试图将这个函数转换为 C。

(define f
  (lambda(n)
     (if (= n 0) 1
         (* n (f (- n 1))))))

(display (f 10))
(newline)

我尝试使用 gambit (gsc),它生成了一个 C 文件,看起来只是一个要在某些解释器中加载的文件,而不是包含 main 可以执行的功能。

有没有生成可以直接执行的C代码的应用程序?来自标准方案库的函数,如 display 应该与一些目标文件链接。

编辑:

我的目的是了解专业翻译人员使用的算法。

有很多这样的翻译器,至少可以追溯到 1980 年代,我认为 CHICKEN 是当前的一个很好的翻译器。

如果你想使用它:

  1. 吃鸡;
  2. 使用适当的 make 咒语构建和安装它(这对我来说在 OSX 上很轻松,在 Linux 上确实应该非常轻松,因此,尽管它可能更难在 Windows);
  3. 将您的代码存储在我将调用的文件中 f.scm
  4. 如果你想看C代码,用chicken f.scm编译,会产生几百行难以理解的C;
  5. 如果您只需要可执行文件,请使用 csc 创建它。

如果您想做任何重要的事情,例如在 C 库中链接或与 C 中的 Scheme 代码对话,则需要阅读大量 manual


不知道你在找什么,这闻起来好像是 XY problem。特别是:

  • 如果您想要一个允许您与用 C 编写的代码对话的 Scheme 系统,那么您可能想要一个带有 FFI 的系统,而不是编译为 C 的系统;
  • 如果您想要一个将创建本机可执行文件的 Scheme 系统,那么您可能想要一个将创建本机可执行文件而不是编译为 C 的 Scheme 系统。

每一个都有很多例子。其中一些系统可能 编译为 C 或通过 C 编译,但一个不依赖于另一个。

最后,如果您想了解以 C 为目标的 Scheme 编译器如何工作(或者以任何语言(包括汇编程序)为目标的 Scheme 编译器如何工作),那么传统的方法可能仍然是最好的:找一个写得很好的源代码可用,阅读并修改其源代码。

基本上没有C编译器的方案会如你所愿。他们创建了不适合阅读的可怕代码,并且他们依赖底层 C 编译器来进行大部分优化。当我有 Stalin 时,Chicken 和 Gambit 使用头文件,而 Stalin 没有,但它基于 R4RS 而不是 R5RS 和更高版本。

您最好阅读 Abdulaziz Ghuloum 的论文 An Incremental Approach to Compiler Construction (PDF) or perhaps Matt Mights articles on parsing, continuations and compilations. Longer down he actually has a Scheme to C and Scheme to Java,了解不同的闭包约定方法。最后,没有什么比自己动手更好的了,所以去吧!