Инструмент для преобразования 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 и сбрасывает его в красочный текстовый формат, который выглядит так. Помимо простого анализа C и сброса AST, AST содержит всю разрешенную информацию, которая понадобится компилятору (например, типы данных). Это означает, что код должен успешно компилировать под Clang, чтобы AST также использовался.
Поскольку у нас есть все типы в AST, это всего лишь вопрос прохождения дерева в полуэтмале и производить Go. Легко, верно!?
По умолчанию только модульные тесты запускаются с go test . Вы также можете включить интеграционные тесты:
go test -tags=integration ./...Интеграционные тесты в виде полных программ C, которые можно найти в каталоге тестов.
Интеграционные тесты работают так:
Внесение вклад выполняется с помощью запросов. Там нет никакой помощи, которая слишком маленькая! :)
Если вы ищете с чего начать, я могу предложить найти простую программу C (например, другие примеры), которая не успешно переводится в Go.
Или, если вы не хотите этого делать, вы можете отправить его в качестве проблемы, чтобы кто -то другой мог привлечь его к себе.