Инструмент для преобразования (перевести) C to Go?
Какой инструмент можно использовать для преобразования исходного кода в исходный код Go?
Например, если код C содержит:
struct Node {
struct Node *left, *right;
void *data;
};
char charAt(char *s, int i) {
return s[i];
}
соответствующий код Go, сгенерированный инструментом, должен быть:
type Node struct {
left, right *Node
data interface{}
}
func charAt(s string, i int) byte {
return s[i]
}
Инструмент не должен быть идеальным. Это нормально, если некоторые части сгенерированного кода Go должны быть исправлены вручную.
Ответы
Ответ 1
Я думаю, что нет такого (C-Go преобразования исходного кода). Вы можете подумать о создании своего собственного конвертера. Вопрос становится: стоит ли это и как это сделать?
Возможно, это не стоило усилий, потому что Go и C могут быть как-то совместимы. Например, если вы используете GCC 4.6 (или будет выпущен 4.7, т.е. Последний моментальный снимок), вы, вероятно, можете связать код C и Go вместе с некоторой осторожностью.
Конечно, как обычно, зло находится в деталях.
Если вам нужен конвертер, вы хотите, чтобы полученный код Go был доступен для чтения и редактирования (тогда задача сложнее, поскольку вы хотите сохранить структуру кода, а также хотите сохранить комментарии)? В этом случае вам, вероятно, нужен собственный C-анализатор (и это сложная задача).
Если вам не нужна читаемость сгенерированного кода Go, вы можете, например, расширить существующий компилятор для выполнения этой работы. Например, GCC расширяется через плагины или через MELT расширения, и вы можете настроить GCC (с MELT или ваш собственный C-плагин для GCC), чтобы преобразовать представление Gimple (основное внутреннее представление для команд внутри GCC) в нечитаемый код Go. Это как-то проще (но для этого требуется больше недели работы).
Конечно, интерфейсы Go, каналы и даже управление памятью (сборщик мусора) не имеют стандартной копии C.
Ответ 2
rsc создал github.com/rsc/c2go, чтобы преобразовать компилятор Go на основе c в Go.
Как внешний пример, akavel, похоже, пытается использовать его для создания Lua на основе Go: github.com/akavel/goluago/
github.com/xyproto/c2go - еще один проект, но он не был затронут через некоторое время.
Ответ 3
Я почти уверен, что такого инструмента нет, но IMHO на каждом языке, который хорошо писать в своем "стиле кодирования".
Помните, насколько мы все любили трюки препроцессора C и действительно художественную работу с указателями? Помните, сколько внимания было уделено делу malloc/free или с потоками?
Go отличается. У вас нет препроцессора, но у вас есть закрытие, объекты со способами, интерфейсами, сборщиком мусора, срезами, goroutines и многими другими приятными функциями.
Итак, зачем конвертировать код вместо того, чтобы переписывать его гораздо лучше и чище?
Конечно, я надеюсь, что у вас нет 1000K строк кода на C, которые вы должны порт для Go:)
Ответ 4
Насколько я знаю, такого инструмента еще нет (пока). Таким образом, вы обязаны конвертировать свой C-код в Go вручную.
Я не знаю, насколько сложным является код C, который вы хотите преобразовать, но вы можете иметь в виду, что Go имеет "особый" способ делать вещи. Подобно использованию interfaces и channels.
Ответ 5
Взгляните на SWIG, http://www.swig.org/Doc2.0/Go.html, он переведет заголовки C/С++, чтобы перейти и обернуть их для начальной точки. Затем вы можете портировать части пополам.
Ответ 6
Проверьте этот проект
https://github.com/elliotchance/c2go
Подробное описание приведено в статье