Ein Werkzeug zum Konvertieren von C zum Umgang.
Die Ziele dieses Projekts sind:
c2go erfordert GO 1,9 oder neuer.
go get -u github.com/elliotchance/c2goc2go transpile myfile.c Das c2go -Programm verarbeitet eine einzelne C -Datei und gibt den übersetzten Code in GO aus. Verwenden wir ein inklusives Beispiel, 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 sieht aus:
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
}Dies ist der Prozess:
Der C -Code ist mit Klang vorverarbeitet. Dies generiert eine größere Datei ( pp.c ), entfernt jedoch alle plattformspezifischen Richtlinien und Makros.
pp.c wird mit dem Clang AST analysiert und steckt es in ein farbenfrohes Textformat, das so aussieht. Abgesehen davon, dass das C nur das C analysiert und ein AST abgelegt hat, enthält der AST alle aufgelösten Informationen, die ein Compiler benötigt (z. B. Datentypen). Dies bedeutet, dass der Code erfolgreich unter Clang kompiliert werden muss, damit der AST ebenfalls verwendbar ist.
Da wir alle Typen im AST haben, geht es nur darum, den Baum auf halbbetriebige Weise zu durchqueren und GO zu produzieren. Einfach, richtig !?
Standardmäßig werden nur Unit -Tests mit go test durchgeführt. Sie können auch die Integrationstests einfügen:
go test -tags=integration ./...Integrationstests in Form von vollständigen C -Programmen, die im Testverzeichnis zu finden sind.
Integrationstests funktionieren wie folgt:
Der Beitrag erfolgt mit Pull -Anfragen. Es gibt keine Hilfe, die zu klein ist! :)
Wenn Sie suchen, wo ich anfangen soll, kann ich vorschlagen, ein einfaches C -Programm (wie die anderen Beispiele) zu finden, das sich nicht erfolgreich in Go übersetzt.
Oder wenn Sie dies nicht tun möchten, können Sie es als Problem einreichen, damit es von jemand anderem abgeholt werden kann.