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

15 c go code-translation

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

例如,如果C代码包含:

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

char charAt(char *s, int i) {
    return s[i];
}
Run Code Online (Sandbox Code Playgroud)

该工具生成的相应Go代码应为:

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

func charAt(s string, i int) byte {
    return s[i]
}
Run Code Online (Sandbox Code Playgroud)

该工具不需要完美.如果生成的Go代码的某些部分需要手动纠正,则可以.

Jos*_*hua 15

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

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

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


Bas*_*tch 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 对应项。