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は、cベースのGoコンパイラをGoに変換するためにgithub.com/rsc/c2goを作成しました。

外部の例として、akavelはそれを使用してGoベースのluaを作成しようとしているようです:github.com/akavel/goluago/

github.com/xyproto/c2goは別のプロジェクトですが、しばらくの間触れられていません。

于 2012-10-07T17:52:21.510 に答える
4

今日、そのような(C to Goソースコード変換)ツールは存在しないと思います。独自のコンバーターを作成することを検討してください。問題は次のようになります:それは価値があるのか​​、そしてそれをどのように行うのか?

GoとCはどういうわけか相互運用可能である可能性があるため、おそらく努力する価値はないかもしれません。たとえば、GCC 4.6(またはリリースされる4.7、つまり最新のスナップショット)を使用する場合は、注意してC&Goコードをリンクできます。

もちろん、いつものように、悪は細部にあります。

コンバーターが必要な場合は、取得したGoコードを読み取りおよび編集可能にしますか(コードの構造を保持し、コメントも保持するため、タスクはより困難になります)?その場合、おそらく独自のCパーサーが必要になります(これは難しい作業です)。

生成されたGoコードの可読性を気にしない場合は、たとえば、既存のコンパイラーを拡張して作業を行うことができます。たとえば、GCCはプラグインまたはMELT拡張機能を介して拡張可能であり、GCCを(MELTまたはGCC用の独自のCプラグインを使用して)カスタマイズして、Gimple表現(GCC内の命令の主要な内部表現)を読み取り不可能なGoコードに変換できます。これはどういうわけか簡単です(ただし、それでも1週間以上の作業が必要です)。

もちろん、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

そのようなツールはないとほぼ確信していますが、IMHOはすべての言語で、独自の「コーディングスタイル」で書くのが良いでしょう。

私たち全員がCプリプロセッサのトリックとポインタを使った本当に芸術的な作業をどれほど愛していたか覚えていますか?malloc / freeまたはスレッドを処理するのにどれだけの注意が必要だったか覚えていますか?囲碁は違います。プリプロセッサはありませんが、クロージャ、メソッドを持つオブジェクト、インターフェイス、ガベージコレクタ、スライス、ゴルーチン、その他多くの優れた機能があります。

では、コードをより適切でクリーンな方法で書き直すのではなく、なぜ変換するのでしょうか。

もちろん、Goに移植する必要のあるCのコードが1000K行ないことを願っています:)

于 2012-01-09T22:44:15.567 に答える
2

SWIGを見てください。http: //www.swig.org/Doc2.0/Go.html C / C ++ヘッダーを変換して、開始点としてラップします。次に、パーツを少しずつ移植できます。

于 2014-03-22T16:11:31.683 に答える
1

私の知る限り、そのようなツールは(まだ)存在しません。したがって、Cコードを手動でGoに変換する必要があります。

変換したいCコードがどれほど複雑かはわかりませんが、Goには「特別な」方法があることを覚えておいてください。インターフェイスチャネルの使用法のように。

于 2012-01-09T13:13:02.543 に答える