Инструмент для конвертации C в Go.
Цели этого проекта:
c2go
требует Go 1.9 или новее.```bash
go install github.com/elliotchance/c2go@latest
# Использование
```bash
c2go transpile myfile.c
Программа c2go
обрабатывает один файл C и выводит переведенный код на Go. Давайте воспользуемся включенным примером, prime.c.
#include <stdio.h>
int main()
{
int n, c;
printf("Введите число\n");
scanf("%d", &n);
if ( n == 2 )
printf("Простое число.\n");
else
{
for ( c = 2 ; c <= n - 1 ; c++ )
{
if ( n % c == 0 )
break;
}
if ( c != n )
printf("Не простое число.\n");
else
printf("Простое число.\n");
}
return 0;
}
c2go transpile prime.c
go run prime.go
Введите число
23
Простое число.
Файл prime.go
выглядит следующим образом:
package main
import "unsafe"
import "github.com/elliotchance/c2go/noarch"
// ... много системных типов в Go удалены для краткости.
var stdin *noarch.File
var stdout *noarch.File
var stderr *noarch.File
func main() {
__init()
var n int
var c int
noarch.Printf([]byte("Введите число\n\x00"))
noarch.Scanf([]byte("%d\x00"), (*[1]int)(unsafe.Pointer(&n))[:])
if n == 2 {
noarch.Printf([]byte("Простое число.\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("Не простое число.\n\x00"))
} else {
noarch.Printf([]byte("Простое число.\n\x00"))
}
}
return
}
func __init() {
stdin = noarch.Stdin
stdout = noarch.Stdout
stderr = noarch.Stderr
}
Это процесс:
Код на C предварительно обрабатывается с помощью clang. Это генерирует
более крупный файл (pp.c
), но удаляет все директивы и макросы,
специфические для платформы.2. pp.c
парсится с помощью AST clang и выводится в виде цветного текста,
который
выглядит так.
Вместо простого парсинга C и вывода AST, AST содержит всю информацию, которую
компилятору нужно для компиляции (например, типы данных). Это означает, что
код должен успешно компилироваться под clang для того, чтобы AST также был
используемым.
Поскольку у нас есть все типы в AST, это просто вопрос обхода дерева способным образом и производству Go. Просто, правда!?
По умолчанию выполняются только unit-тесты с помощью go test
. Вы также можете
включить интеграционные тесты:
go test -tags=integration ./...
Интеграционные тесты в виде полных программ на C, которые можно найти в папке тестов.
Интеграционные тесты работают следующим образом:
Внесение вклада осуществляется с помощью pull requests. Нет помощи, которая была бы слишком мала! :)
Если вы ищете, с чего начать, я могу предложить найти простую программу на C (как другие примеры), которая не переводится успешно на Go.Или, если вы не хотите этого делать, вы можете представить это в виде задачи, чтобы другой человек мог взяться за её решение.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )