3

我尝试从方案函数开始生成 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应该与某个目标文件链接。

编辑:

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

4

2 回答 2

3

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

如果你想使用它:

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

如果您想做任何重要的事情,例如在 C 库中链接或从 C 与 Scheme 代码交谈,则需要阅读一本内容丰富的手册。


在不知道你在追求什么的情况下,这闻起来好像是XY 问题。尤其:

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

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

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

于 2020-01-31T15:31:46.777 回答
3

基本上没有任何 C 翻译方案可以满足您的需求。他们创建了不应该被阅读的可怕代码,并且他们依赖底层的 C 编译器来进行大部分优化。当我有斯大林时,Chicken 和 Gambit 使用头文件,但它不是基于 R4RS 而不是 R5RS 及更高版本。

您最好阅读 Abdulaziz Ghuloum 的论文An Incremental Approach to Compiler Construction (PDF)Matt Mights关于解析、延续和编译的文章。再往下看,他实际上有一个Scheme 到 CScheme 到 Java,它们有不同的闭包约定方法。最后,没有什么比自己动手做的更好了,所以试试吧!

于 2020-02-01T00:25:16.237 回答