c2go
v0.26.11
用於轉換C的工具。
該項目的目標是:
c2go需要1.9或更新。
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用叮噹聲解析,並以看起來像這樣的五顏六色的文本格式傾倒。除了僅解析C並傾倒AST外,AST還包含編譯器需要的所有已解決信息(例如數據類型)。這意味著代碼必須在clang下成功編譯,以使AST也可用。
由於我們在AST中擁有所有類型,這只是以半智慧的方式穿越樹並產生GO的問題。容易,對!?
默認情況下,僅使用go test進行單位測試。您還可以包括集成測試:
go test -tags=integration ./...以完整C程序的形式進行集成測試,可以在測試目錄中找到。
類似的集成測試工作:
貢獻是通過拉動請求完成的。沒有太小的幫助! :)
如果您正在尋找從哪裡開始,我建議您找到一個簡單的C程序(例如其他示例),該程序無法成功地轉化為GO。
或者,如果您不想這樣做,則可以將其作為問題提交,以便其他人可以將其提交。