Uma ferramenta para converter C para ir.
Os objetivos deste projeto são:
c2go requer ir 1,9 ou mais recente.
go get -u github.com/elliotchance/c2goc2go transpile myfile.c O programa c2go processa um único arquivo C e produz o código traduzido em Go. Vamos usar um exemplo incluído, 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 parece:
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
}Este é o processo:
O código C é pré -processado com Clang. Isso gera um arquivo maior ( pp.c ), mas remove todas as diretivas e macros específicas da plataforma.
pp.c é analisado com o clang ast e o despeja em um formato de texto colorido que se parece com isso. Além de analisar o C e despejar um AST, o AST contém todas as informações resolvidas de que um compilador precisaria (como tipos de dados). Isso significa que o código deve compilar com sucesso em Clang para que o AST também seja utilizável.
Como temos todos os tipos no AST, é apenas uma questão de atravessar a árvore de maneira semi-inteligente e produzir. Fácil, certo!?
Por padrão, apenas os testes de unidade são executados com go test . Você também pode incluir os testes de integração:
go test -tags=integration ./...Testes de integração na forma de programas C completos que podem ser encontrados no diretório de testes.
Testes de integração funcionam assim:
A contribuição é feita com solicitações de tração. Não há ajuda que seja muito pequena! :)
Se você está procurando por onde começar, posso sugerir encontrar um programa C simples (como os outros exemplos) que não se traduz em Go.
Ou, se você não quiser fazer isso, pode enviá -lo como um problema para que ele possa ser escolhido por outra pessoa.