【问题标题】:Tool to convert (translate) C to Go? [closed]将 C 转换(翻译)为 Go 的工具? [关闭]
【发布时间】:2012-02-06 00:20:24
【问题描述】:

用什么工具把C源代码转成Go源代码?

例如,如果 C 代码包含:

struct Node {
    struct Node *left, *right;
    void        *data;
};

char charAt(char *s, int i) {
    return s[i];
}

工具生成的对应Go代码应该是:

type Node struct {
    left, right *Node
    data        interface{}
}

func charAt(s string, i int) byte {
    return s[i]
}

工具不需要完美。如果生成的 Go 代码的某些部分需要手动更正也可以。

【问题讨论】:

  • 我还没有看到符合您要求的工具,这听起来更像是要求为您编写一个工具,可能与本网站不匹配。
  • @JoachimIsaksson 已经存在诸如“C to Java”或“C to Perl”之类的问题。这个问题也不例外。
  • 你为什么要问?混合 C 和 Go 代码不是更简单吗? (GCC 4.7 有一个 Go 前端 - 仍然不完美 - 所以有时这是可能的)
  • 本网站旨在以友好的方式互相帮助。我要求所有要求都被否决:)
  • wrote a translator可以将一些简单的C程序转换成Go,但这只是一个概念验证。

标签: c go code-translation


【解决方案1】:

rsc 创建了github.com/rsc/c2go 以将基于 c 的 Go 编译器转换为 Go。

作为一个外部示例,akavel 似乎正在尝试使用它来创建基于 Go 的 lua:github.com/akavel/goluago/

github.com/xyproto/c2go 是另一个项目,但有一段时间没有动。

【讨论】:

  • 但是如何使用 c2go 将 test.c 程序转换为 test.go 程序?
【解决方案2】:

我猜今天不存在这样的(C 到 Go 源代码转换)工具。您可以考虑制作自己的转换器。问题变成了:是否值得,以及如何做到这一点?

这可能不值得付出努力,因为 Go 和 C 可以以某种方式互操作。例如,如果您使用 GCC 4.6(或即将发布的 4.7,即最新快照),您可能可以将 C 和 Go 代码链接在一起,但要小心。

当然,像往常一样,邪恶在于细节。

如果你想要一个转换器,你想让得到的 Go 代码可读可编辑(那么任务就比较难了,因为你要保持代码的结构,还要保持 cmets)?在这种情况下,您可能需要自己的 C 解析器(这是一项艰巨的任务)。

如果您不关心生成的 Go 代码的可读性,例如,您可以扩展现有的编译器来完成这项工作。例如,GCC 可以通过插件或MELT 扩展进行扩展,并且您可以自定义 GCC(使用 MELT,或您自己的 GCC 的 C 插件)以将 Gimple 表示(GCC 内部指令的主要内部表示)转换为不可读的 Go 代码.这在某种程度上更简单(但仍需要一周以上的工作)。

当然,Go 接口、通道甚至内存管理(垃圾收集内存)都没有标准的 C 对应物。

【讨论】:

【解决方案3】:

看看这个项目

https://github.com/elliotchance/c2go

详细说明在这个article

更新:2021 年 8 月 6 日

也检查一下这个

https://github.com/gotranspile/cxgo

【讨论】:

    【解决方案4】:

    我几乎可以肯定没有这样的工具,但恕我直言,在每种语言中,最好以自己的“编码风格”编写。

    还记得我们都非常喜欢 C 预处理器技巧和真正的指针艺术作品吗?还记得处理 malloc/free 或线程需要多少注意吗? 围棋不一样。你没有预处理器,但你有闭包、带有方法的对象、接口、垃圾收集器、切片、goroutines 和许多其他不错的特性。

    那么,为什么要转换代码而不是用更好、更简洁的方式重写呢?

    当然,我希望你不必将 1000K 行的 C 代码移植到 Go 中:)

    【讨论】:

      【解决方案5】:

      看看 SWIG,http://www.swig.org/Doc2.0/Go.html 它将转换 C/C++ 标头并将它们包装为起点。然后你可以一点一点地移植零件。

      【讨论】:

        【解决方案6】:

        据我所知,这样的工具还不存在。所以你必须手动将你的 C 代码转换为 Go。

        我不知道您要转换的 C 代码有多复杂,但您可能要记住,Go 有一种“特殊”的做事方式。比如interfaceschannels的用法。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-04-17
          • 2010-10-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-06
          • 1970-01-01
          相关资源
          最近更新 更多