1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/mirrors-c2go

Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

Статус сборки Версия GitHub Отчет Go Report Card codecov GitHub license Присоединиться к чату Twitter GoDoc

Инструмент для конвертации C в Go.

Цели этого проекта:

  1. Создание универсального инструмента для конвертации C в Go.
  2. Поддержка кросс-платформенной работы (Linux и Mac) и работа с максимальным количеством версий Clang (API AST Clang нестабилен).
  3. Предоставление повторяемого и предсказуемого инструмента (вместо того, чтобы выполнять большую часть работы и требовать чистки выходных данных для достижения работоспособности).
  4. Доставка быстрых и небольших версионных обновлений.
  5. Конечная цель — возможность сборки исходного кода SQLite3 без изменений. Это будет версией Yöntem 1.0.0.

Установка

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
}

Как это работает

Это процесс:

  1. Код на C предварительно обрабатывается с помощью clang. Это генерирует более крупный файл (pp.c), но удаляет все директивы и макросы, специфические для платформы.2. pp.c парсится с помощью AST clang и выводится в виде цветного текста, который выглядит так. Вместо простого парсинга C и вывода AST, AST содержит всю информацию, которую компилятору нужно для компиляции (например, типы данных). Это означает, что код должен успешно компилироваться под clang для того, чтобы AST также был используемым.

  2. Поскольку у нас есть все типы в AST, это просто вопрос обхода дерева способным образом и производству Go. Просто, правда!?

Тестирование

По умолчанию выполняются только unit-тесты с помощью go test. Вы также можете включить интеграционные тесты:

go test -tags=integration ./...

Интеграционные тесты в виде полных программ на C, которые можно найти в папке тестов.

Интеграционные тесты работают следующим образом:

  1. Clang компилирует C в бинарник как обычно.
  2. c2go преобразует C-файл в Go.
  3. Go собирается для получения другого бинарника.
  4. Оба бинарника выполняются, и их вывод сравнивается. Все C-файлы будут содержать какой-то вывод, поэтому результаты можно проверить.

Внесение вклада

Внесение вклада осуществляется с помощью pull requests. Нет помощи, которая была бы слишком мала! :)

Если вы ищете, с чего начать, я могу предложить найти простую программу на C (как другие примеры), которая не переводится успешно на Go.Или, если вы не хотите этого делать, вы можете представить это в виде задачи, чтобы другой человек мог взяться за её решение.

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

c2go — это инструмент для преобразования кода на C в код на Go. Развернуть Свернуть
MIT
Отмена

Обновления

Пока нет обновлений

Участники

все

Язык

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/mirrors-c2go.git
git@api.gitlife.ru:oschina-mirror/mirrors-c2go.git
oschina-mirror
mirrors-c2go
mirrors-c2go
master