Каковы основные различия между gc и gccgo?

88

Каковы основные различия между двумя популярными компиляторами Go, gc и gccgo? Построить производительность? Производительность во время выполнения? Параметры командной строки? Лицензирование?

Я не ищу мнения о том, что лучше, а просто краткий обзор их различий, чтобы я мог решить, что лучше всего подходит для моих нужд.

Flimzy
источник
3
Как это меняется со временем? Сейчас в 2019 году
Лео Галуччи

Ответы:

110

Вы можете узнать больше в разделе « Настройка и использование gccgo »:

gccgo, компилятор для языка Go. Компилятор gccgo - это новый интерфейс для GCC.
Обратите внимание, что gccgo не является компилятором gc

Как объясняется в « Gccgo в GCC 4.7.1 » (июль 2012 г.)

Язык Go всегда определялся спецификацией, а не реализацией. Команда Go написала два разных компилятора, реализующих эту спецификацию: gc и gccgo.

  • Gc - исходный компилятор, и инструмент go использует его по умолчанию.
  • Gccgo - это другая реализация с другим фокусом

По сравнению с gc, gccgo медленнее компилирует код, но поддерживает более мощные оптимизации, поэтому программа с привязкой к ЦП, созданная gccgo, обычно будет работать быстрее.

Также:

  • Компилятор gc поддерживает только самые популярные процессоры: x86 (32-битные и 64-битные) и ARM.
  • Однако Gccgo поддерживает все процессоры, которые поддерживает GCC.
    Не все эти процессоры были тщательно протестированы на gccgo, но многие прошли, включая x86 (32-битные и 64-битные), SPARC, MIPS, PowerPC и даже Alpha.
    Gccgo также был протестирован в операционных системах, которые компилятор gc не поддерживает, особенно в Solaris.

если вы установите команду перейти от стандартного выпуска Go, он уже поддерживает gccgo через -compilerопцию: go build -compiler gccgo myprog.


Короче: gccgo: больше оптимизации, больше процессоров .


Однако, как отметил на OneOfOne ( источник ), часто возникает десинхронизация между ходом поддерживается gccgo и последней версией идет:

gccgo поддерживает только до версии go v1.2 , поэтому, если вам нужно что-то новое в 1.3 / 1.4 (совет), gccgo нельзя использовать. -

Выпуск 4.9 GCC будет содержать версию gccgo Go 1.2 (а не 1.3) .
Графики выпуска проектов GCC и Go не совпадают, что означает, что 1.3 будет доступна в ветке разработки, но что следующий выпуск GCC, 4.10, скорее всего, будет иметь версию Go 1.4 gccgo.


twotwotwo упоминает в комментариях к слайд презентации Брэда Фитцпатрику

gccgo генерирует очень хороший код
... но ему не хватает анализа выхода: убивает производительность множеством мелких аллоков + мусор
... GC неточен . Плохо для 32-битных.

twotwotwo добавляет:

На другом слайде упоминается, что генерация кода ARM без использования gccgo - нестабильная задача.
Предполагая, что это интересный вариант для вашего проекта, возможно, сравните двоичные файлы для вашего варианта использования в целевой архитектуре.


Как комментирует peterSO , Go 1.5 now (Q3 / Q4 2015) означает:

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

На слайде «Go in Go» упоминается:

C ушел.
Примечание: gccgo все еще набирает обороты.


Беркант спрашивает в комментариях, было ли gccgoэто то, что gcбыло начато.

Йорг В. Миттаг отвечает:

Нет, gccgoпоявилось позже gc.

gcизначально был написан на C. Он основан на компиляторе C Кена Томпсона из операционной системы Plan9 , преемницы Unix, разработанной теми же людьми. gcбыл итеративно переработан, чтобы все больше и больше самого себя было написано на Go.

gccgoбыл основан Иэном Лэнсом Тейлором , хакером GCC, не связанным с проектом Go.

Обратите внимание, что первый полностью автономный компилятор Go на самом деле был проприетарной коммерческой реализацией с закрытым исходным кодом для Windows, имя которой, похоже, исчезло из моего мозга так же, как и из Интернета. Они утверждали, что у них есть собственный компилятор, написанный на Go, нацеленный на Windows в то время, когда gccgoеще не существовало и gcбыло чрезвычайно болезненно настраивать на Windows. (По сути, вам нужно было настроить полную среду Cygwin, исправить исходный код и скомпилировать из исходных кодов.) Однако компания, похоже, свернулась, прежде чем им удалось продать продукт.

Гектор Чу действительно выпустил порт Go для Windows в ноябре 2009 года.
На go-lang.cat-v.org/os-portsстранице также упоминается начальная работа Джо / Джозефа Пуарье . На этой странице :

Есть ли шанс, что кто-то осведомленный может попросить кого-нибудь из парней ( Алекс Брейнман - Гектор Чу - Джозеф Пуарье), участвующих в создании порта Windows, сделать вики-запись с подробным описанием среды сборки?

Добавьте к этому (в написании веб-приложений на Go ) ! 光 京 (Вэй Гуанцзин) .

VonC
источник
4
golang.org/doc/go1.3#gccgo И, что более важно, gccgo поддерживает только до версии go v1.2, поэтому, если вам нужно что-то новое в 1.3 / 1.4 (совет), gccgo использовать нельзя.
OneOfOne
1
@OneOfOne хороший момент, я включил ваш комментарий в ответ для большей наглядности.
VonC
1
@twotwotwo хорошая находка. Я включил его в ответ для большей наглядности.
VonC
3
Я читал, что gccgo реализует горутины, предоставляя каждой горутине выделенный поток (в отличие от мультиплексирования множества горутин в один поток). Если это все еще правда, то для некоторых это может иметь большое значение.
DragonFax
2
@LeoGallucci Общая идея в этом ответе соответствует Go 1.11 («gccgo: больше оптимизации, больше процессоров»). Вы можете увидеть более свежую иллюстрацию на stackoverflow.com/a/46970176/6309 .
VonC