Ищу компилятор Go to C для Linux

Может ли кто-нибудь указать мне компилятор Go to C, или его действительно не существует? Долгие поиски в сети мне ничего не дали.

В частности, я ищу компилятор Go-to-C с открытым исходным кодом, который можно собрать для Linux.

Какова ваша цель? Почему вы хотите скомпилировать в c? Чего вам не хватает по умолчанию?
@guettli: я хочу скомпилировать в C, потому что таким образом я получаю лучшую кроссплатформенную поддержку. Однако не уверен, что означает ваш последний вопрос. Кроме того, это не имеет значения, поскольку этот сайт SE предназначен для рекомендаций по программному обеспечению. Иначе я бы разместил его в StackOverflow :)
какая платформа является вашей целью?
@guettli: Linux, как упоминается в теме. Или вы имеете в виду конечные цели, для которых я хочу скомпилировать полученный код C? К ним относятся Solaris, AIX, несколько BSD на таких архитектурах, как x86_32, x86_64, PPC, SPARC и MIPS.
Я посмотрел на эту страницу: golang.org/doc/install/source есть бэкэнд gcc для go. Я думаю, что все ваши платформы поддерживаются gcc. Почему бы не скомпилировать go для этих платформ?

Ответы (1)

Если вам нужна наилучшая межплатформенная поддержка с наименьшими усилиями, Go — отличный выбор.

Хотя могут быть некоторые компиляторы C для нескольких платформ, которые Go не поддерживает, C на самом деле не так совместим с кросс-платформой, как вы могли бы подумать (или изначально был изменен).

В частности, стандартная библиотека Go построена таким образом, чтобы поддерживать платформы, поддерживаемые Go, путем включения и автоматического переключения между реализациями для конкретных платформ. Эти альтернативные реализации автоматически выбираются компилятором Go во время сборки.

C не имеет эквивалентного механизма. Это подчеркивает, почему это была важная функция для многоплатформенной поддержки Go и кросс-компиляции.

Например, рассмотрим path/filepathпакет в Go. Он автоматически переключается между обратной или прямой косой чертой ("\","/") при работе с путями в зависимости от того, является ли целью компиляции Windows или нет.

Этот механизм теряется, если вы сначала скомпилируете Go to C, а затем скомпилируете на целевой платформе, потому что во время компиляции Go to C целевая платформа все еще неизвестна. Это означает, что, вопреки вашим ожиданиям, кросс-компиляция в C уменьшит кроссплатформенную поддержку Go, а не улучшит ее.


При всем при этом вы можете проверить проект bblfsh:

https://github.com/bblfsh/bblfshd

https://doc.bblf.sh

Bblfsh по сути является кросс-компилятором абстрактного синтаксического дерева. Существуют драйверы C++ и Go для Bblfsh, но я не вижу ни одного для C. Можно скомпилировать непосредственно из языка AST или даже написать исходный код, который будет генерировать AST.

Так как Go можно скомпилировать в WebAssembly, вероятно, его можно скомпилировать в C с помощью wasm2c .