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。
或者,如果您不想这样做,则可以将其作为问题提交,以便其他人可以将其提交。