c2go
v0.26.11
Cを移動するためのツール。
このプロジェクトの目標は次のとおりです。
c2goには1.9以降GOが必要です。
go get -u github.com/elliotchance/c2goc2go transpile myfile.c c2goプログラムは、単一のCファイルを処理し、GOで翻訳されたコードを出力します。含まれている例を使用してみましょうprime.c:
#include <stdio.h>
int main ()
{
int n , c ;
printf ( "Enter a numbern" );
scanf ( "%d" , & n );
if ( n == 2 )
printf ( "Prime number.n" );
else
{
for ( c = 2 ; c <= n - 1 ; c ++ )
{
if ( n % c == 0 )
break ;
}
if ( c != n )
printf ( "Not prime.n" );
else
printf ( "Prime number.n" );
}
return 0 ;
}c2go transpile prime.c
go run prime.go Enter a number
23
Prime number.
prime.go次のように見えます:
package main
import "unsafe"
import "github.com/elliotchance/c2go/noarch"
// ... lots of system types in Go removed for brevity.
var stdin * noarch. File
var stdout * noarch. File
var stderr * noarch. File
func main () {
__init ()
var n int
var c int
noarch . Printf ([] byte ( "Enter a number n x00 " ))
noarch . Scanf ([] byte ( "%d x00 " ), ( * [ 1 ] int )( unsafe . Pointer ( & n ))[:])
if n == 2 {
noarch . Printf ([] byte ( "Prime number. n x00 " ))
} else {
for c = 2 ; c <= n - 1 ; func () int {
c += 1
return c
}() {
if n % c == 0 {
break
}
}
if c != n {
noarch . Printf ([] byte ( "Not prime. n x00 " ))
} else {
noarch . Printf ([] byte ( "Prime number. n x00 " ))
}
}
return
}
func __init () {
stdin = noarch . Stdin
stdout = noarch . Stdout
stderr = noarch . Stderr
}これがプロセスです:
CコードはClangで前処理されます。これにより、より大きなファイル( pp.c )が生成されますが、すべてのプラットフォーム固有のディレクティブとマクロを削除します。
pp.cはClang ASTに解析され、このように見えるカラフルなテキスト形式でダンプします。 Cを解析してASTをダンプすることとは別に、ASTには、コンパイラが必要とする解決されたすべての情報(データ型など)が含まれています。これは、ASTが使用可能になるために、Clangの下でコードを正常にコンパイルする必要があることを意味します。
ASTにはすべてのタイプがあるため、半intell的な方法でツリーを横断してGoを生産するだけの問題です。簡単、そうです!?
デフォルトでは、 go testで実行されるユニットテストのみが実行されます。統合テストを含めることもできます。
go test -tags=integration ./...テストディレクトリにある完全なCプログラムの形での統合テスト。
統合テストは次のように機能します:
貢献は、プルリクエストで行われます。小さすぎる助けはありません! :)
あなたがどこから始めればいいのかを探しているなら、私はGOに正常に変換されない簡単なCプログラム(他の例のように)を見つけることを提案できます。
または、それをやりたくない場合は、他の誰かが拾うことができるように、問題としてそれを提出することができます。