C를 변환하는 도구.
이 프로젝트의 목표는 다음과 같습니다.
c2go Go 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 는 Clang AST와 구문 분석되어 다음과 같은 화려한 텍스트 형식으로 버립니다. AST에는 C를 구문 분석하고 AST를 버리는 것 외에도 컴파일러가 필요로하는 모든 해결 된 정보 (예 : 데이터 유형)가 포함되어 있습니다. 이는 AST도 사용할 수 있도록 코드가 Clang에서 성공적으로 컴파일해야 함을 의미합니다.
우리는 AST의 모든 유형을 가지고 있기 때문에 그것은 단지 반지 시간으로 나무를 가로 지르고 GO를 생산하는 문제 일뿐입니다. 쉽게!?
기본적으로 go test 와 함께 단위 테스트 만 실행됩니다. 통합 테스트를 포함시킬 수도 있습니다.
go test -tags=integration ./...테스트 디렉토리에서 찾을 수있는 전체 C 프로그램 형태의 통합 테스트.
통합 테스트는 다음과 같이 작동합니다.
기여는 풀 요청으로 수행됩니다. 너무 작은 도움은 없습니다! :)
어디서부터 시작 해야하는지 찾고 있다면 성공적으로 이동하지 않는 간단한 C 프로그램 (다른 예와 같이)을 찾는 것이 좋습니다.
또는 그렇게하고 싶지 않다면 다른 사람이 픽업 할 수 있도록 문제로 제출할 수 있습니다.