将C转换(翻译)到Go的工具?

时间:2012-01-09 13:06:08

标签: c go code-translation

使用什么工具将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代码的某些部分需要手动纠正,那就没关系了。

6 个答案:

答案 0 :(得分:14)

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

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

github.com/xyproto/c2go是另一个项目,但它在一段时间内没有被触及。

答案 1 :(得分:4)

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

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

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

如果你想要一个转换器,你想要获得的Go代码是可读的和可编辑的(那么任务就更难了,因为你想保留代码的结构,你还想保留注释)?在这种情况下,您可能需要自己的C语法分析器(这是一项艰巨的任务)。

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

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

答案 2 :(得分:2)

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

还记得我们多么喜欢C预处理器技巧和指针的艺术作品吗?还记得处理malloc / free或线程需要多少注意力吗? 去是不同的。你没有预处理器,但你有闭包,有方法的对象,接口,垃圾收集器,切片,goroutines和许多其他很好的功能。

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

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

答案 3 :(得分:2)

查看此项目

https://github.com/elliotchance/c2go

详细说明在此article

答案 4 :(得分:1)

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

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

答案 5 :(得分:1)

看看SWIG,http://www.swig.org/Doc2.0/Go.html它将翻译C / C ++标题并将它们换成起点。然后你可以一点一点地移植部件。