【问题标题】:Scheme to C translatorScheme 到 C 的翻译器
【发布时间】:2020-01-31 11:34:57
【问题描述】:

我试图从一个方案函数开始生成 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 等标准方案库中的函数应与某个目标文件链接。

编辑:

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

【问题讨论】:

  • f 看起来像是阶乘函数的实现。手动实现 C 版本应该很容易,可以递归或迭代实现。但除非您只处理阶乘适合 64 位的小数,否则您可能需要使用 bignum 库,例如 GNU MP。
  • @alinsoar 在 C 中实现尾调用递归很简单——使用goto
  • 阅读 Queinnec 的书Lisp in Small Pieces christian.queinnec.org ;几百页来解释你的要求
  • 不,但Programming Language PragmaticsDragon book 也值得一读。然后,一本关于Denotational Semantics,当然还有R5RS的书
  • 还可以查看s48.org

标签: c scheme r6rs


【解决方案1】:

有很多这样的翻译,至少可以追溯到 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 系统,那么您可能需要一个可以创建本地可执行文件的 Scheme 系统,而不是编译为 C 的系统。

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

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

【讨论】:

  • 谢谢。您能否提供一些鸡肉内部的链接,以了解用于进行转换的算法?我希望我能阅读一些文章,教我如何实现自己的转换算法。
  • @alinsoar:不是真的。它会像我怀疑的任何其他编译器一样多毛:它恰好以 C 为目标。C 被称为“便携式汇编器”:以 C 为目标的 Scheme 编译器就是一个例子。
  • Christian Queinnec 的书中描述了这些解释器和编译器的内部结构,但有趣的是,在这本书中同时查看一些具体的实现。
  • @alinsoar: 否:一些用于编译和解释 Scheme 的特定示例技术在那本书中有所描述:绝对根本没有理由为什么编译器需要遵循这些示例。例如,通过调用 djinn 来编译或解释 Scheme 程序是完全合法的。这当然是我一直这样做的方式。
  • @alinsoar:GR 是一个很好的例子:该理论早期历史中的一些技术可能仍然有用(虽然我不确定),但是人们今天用来在 GR 中进行计算的技术从爱因斯坦所知道的任何事物中都得到了广泛的变化和巨大的发展。无论如何,我已经完成了。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2011-02-27
    • 1970-01-01
    • 1970-01-01
    • 2019-07-21
    • 1970-01-01
    • 1970-01-01
    • 2013-09-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多