Які основні відмінності між 'gc' та 'gccgo'?


85

Які основні відмінності між двома популярними компіляторами Go, 'gc' та 'gccgo'? Побудувати продуктивність? Продуктивність під час роботи? Параметри командного рядка? Ліцензування?

Я не шукаю думок щодо того, що найкраще, це лише базовий огляд їх відмінностей, щоб я міг вирішити, який найкращий для моїх потреб.


3
Як це змінюється з часом? Зараз у 2019 році
Лео

Відповіді:


108

Ви можете побачити більше в " Налаштування та використання gccgo ":

gccgo, компілятор для мови Go. Компілятор gccgo - це новий інтерфейс для GCC.
Зверніть увагу, що gccgo не є компілятором gc

Як пояснюється в " Gccgo in 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, швидше за все матиме версію gccgo Go 1.4.


twotwotwo згадує в коментарях до слайд презентації Бреда Фітцпатріку

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

twotwotwo додає:

Інший слайд згадує, що генерація ARM-коду, що не є gccgo, є хиткою.
Припускаючи, що це цікавий варіант для вашого проекту, можливо порівняйте двійкові файли для вашого випадку використання для вашої цільової архітектури.


Як коментує peterSO , Go 1.5 зараз (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, виправити вихідний код та скомпілювати з джерела.) Однак компанія, здається, згорнулася, ще до того, як їм вдалося продати товар на ринок.

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

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

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


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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.