使用什么工具将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代码的某些部分需要手动纠正,那就没关系了。
答案 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)
答案 4 :(得分:1)
据我所知,这样的工具还不存在。因此,您必须手动将C代码转换为Go。
我不知道你要转换的C代码有多复杂,但你可能想要记住Go有一种“特殊”的做事方式。与使用interfaces和channels一样。
答案 5 :(得分:1)
看看SWIG,http://www.swig.org/Doc2.0/Go.html它将翻译C / C ++标题并将它们换成起点。然后你可以一点一点地移植部件。