18

使用什么工具将 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 代码的某些部分需要手动更正,也可以。

4

6 回答 6

16

rsc created github.com/rsc/c2go to convert the c based Go compiler into Go.

As an external example, akavel seems to be trying to use it to create a Go based lua: github.com/akavel/goluago/

github.com/xyproto/c2go is another project, but it hasn't been touched in a little while.

于 2012-10-07T17:52:21.510 回答
4

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

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

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

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

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

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

于 2012-01-09T13:27:58.737 回答
4

看看这个项目

https://github.com/elliotchance/c2go

详细描述在这篇文章中

更新:2021 年 8 月 6 日

还要检查这个

https://github.com/gotranspile/cxgo

于 2017-03-30T14:58:47.930 回答
2

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

于 2014-03-22T16:11:31.683 回答
2

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

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

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

当然,我希望你没有必须移植到 Go 的 1000K 行 C 代码:)

于 2012-01-09T22:44:15.567 回答
1

据我所知,这样的工具不存在(还)。因此,您必须手动将 C 代码转换为 Go。

我不知道你想要转换的 C 代码有多复杂,但你可能要记住 Go 有一种“特殊”的做事方式。喜欢接口通道的使用。

于 2012-01-09T13:13:02.543 回答