Una herramienta para convertir C para ir.
Los objetivos de este proyecto son:
c2go requiere Go 1.9 o más nuevo.
go get -u github.com/elliotchance/c2goc2go transpile myfile.c El programa c2go procesa un solo archivo C y genera el código traducido en GO. Usemos un ejemplo incluido, 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 es el proceso:
El código C está preprocesado con Clang. Esto genera un archivo más grande ( pp.c ), pero elimina todas las directivas y macros específicas de la plataforma.
pp.c se analiza con el clang Ast y lo descarga en un colorido formato de texto que se ve así. Además de solo analizar la C y descargar un AST, el AST contiene toda la información resuelta que necesitaría un compilador (como los tipos de datos). Esto significa que el código debe compilarse con éxito bajo Clang para que el AST sea utilizable también.
Dado que tenemos todos los tipos en el AST, es solo cuestión de atravesar el árbol de una manera semiinteligente y producir Go. Fácil, ¿verdad?
Por defecto, solo las pruebas unitarias se ejecutan con go test . También puede incluir las pruebas de integración:
go test -tags=integration ./...Pruebas de integración en forma de programas C completos que se pueden encontrar en el directorio de pruebas.
Las pruebas de integración funcionan así:
La contribución se realiza con solicitudes de extracción. ¡No hay ayuda que sea demasiado pequeña! :)
Si está buscando dónde comenzar, puedo sugerir encontrar un programa C simple (como los otros ejemplos) que no se traduce con éxito en GO.
O, si no desea hacerlo, puede enviarlo como un problema para que otra persona pueda recogerlo.