Un outil pour convertir C pour aller.
Les objectifs de ce projet sont:
c2go nécessite GO 1.9 ou plus récent.
go get -u github.com/elliotchance/c2goc2go transpile myfile.c Le programme c2go traite un seul fichier C et publie le code traduit dans GO. Utilisons un exemple inclus, 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 ressemble à:
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'est le processus:
Le code C est prétraité avec Clang. Cela génère un fichier plus grand ( pp.c ), mais supprime toutes les directives et macros spécifiques à la plate-forme.
pp.c est analysé avec le clang ast et le jette dans un format de texte coloré qui ressemble à ceci. En plus d'analyser simplement le C et de vider un AST, l'AST contient toutes les informations résolues dont un compilateur aurait besoin (comme les types de données). Cela signifie que le code doit compiler avec succès sous Clang pour que l'AST soit également utilisable.
Puisque nous avons tous les types dans l'AST, c'est juste une question de traverser l'arbre d'une manière semi-intelligente et de produire du go. Facile, juste !?
Par défaut, seuls les tests unitaires sont exécutés avec go test . Vous pouvez également inclure les tests d'intégration:
go test -tags=integration ./...Tests d'intégration sous forme de programmes C complets qui peuvent être trouvés dans le répertoire des tests.
Les tests d'intégration fonctionnent comme ceci:
La contribution se fait avec les demandes de traction. Il n'y a pas d'aide trop petite! :)
Si vous cherchez par où commencer, je peux suggérer de trouver un programme C simple (comme les autres exemples) qui ne se traduit pas avec succès en Go.
Ou, si vous ne voulez pas le faire, vous pouvez le soumettre en tant que problème afin qu'il puisse être récupéré par quelqu'un d'autre.