Jakie są podstawowe różnice między „gc” a „gccgo”?

85

Jakie są podstawowe różnice między dwoma popularnymi kompilatorami Go, „gc” i „gccgo”? Zbudować wydajność? Wydajność w czasie wykonywania? Opcje wiersza poleceń? Koncesjonowanie?

Nie szukam opinii na temat tego, która jest najlepsza, tylko podstawowego przeglądu ich różnic, aby móc zdecydować, która jest najlepsza dla moich potrzeb.

Flimzy
źródło
3
Jak to się zmienia w czasie? Teraz w 2019
Leo Gallucci

Odpowiedzi:

108

Więcej informacji można znaleźć w sekcjiKonfigurowanie i używanie gccgo ”:

gccgo, kompilator języka Go. Kompilator gccgo to nowa nakładka na GCC.
Zauważ, że gccgo nie jest kompilatorem gc

Jak wyjaśniono w „ Gccgo in GCC 4.7.1 ” (lipiec 2012)

Język Go zawsze był definiowany przez specyfikację, a nie implementację. Zespół Go napisał dwa różne kompilatory, które implementują tę specyfikację: gc i gccgo.

  • Gc jest oryginalnym kompilatorem i narzędzie go używa go domyślnie.
  • Gccgo to inna implementacja z innym celem

W porównaniu z gc, gccgo wolniej kompiluje kod, ale obsługuje bardziej zaawansowane optymalizacje, więc program związany z procesorem zbudowany przez gccgo będzie zwykle działał szybciej.

Również:

  • Kompilator gc obsługuje tylko najpopularniejsze procesory: x86 (32-bitowy i 64-bitowy) oraz ARM.
  • Gccgo obsługuje jednak wszystkie procesory obsługiwane przez GCC.
    Nie wszystkie te procesory zostały dokładnie przetestowane pod kątem gccgo, ale wiele z nich, w tym x86 (32-bit i 64-bit), SPARC, MIPS, PowerPC, a nawet Alpha.
    Gccgo zostało również przetestowane na systemach operacyjnych, których kompilator gc nie obsługuje, w szczególności na Solarisie.

Jeśli zainstalować polecenia Go od standardowego wydania Go, to już podpory gccgo za pomocą -compileropcji: go build -compiler gccgo myprog.


W skrócie: gccgo: większa optymalizacja, więcej procesorów .


Jednakże, jak zauważył przez OneOfOne ( źródłowym ), często istnieje desynchronizacja między ruchu obsługiwanego przez gccgo i najnowszej wersji GO:

gccgo obsługuje tylko do wersji go v1.2 , więc jeśli potrzebujesz czegoś nowego w 1.3 / 1.4 (wskazówka), gccgo nie może być używane. -

Wersja 4.9 GCC będzie zawierać wersję Go 1.2 (nie 1.3) gccgo .
Harmonogramy wydawania projektów GCC i Go nie pokrywają się, co oznacza, że ​​1.3 będzie dostępne w gałęzi programistycznej, ale następne wydanie GCC, 4.10, prawdopodobnie będzie miało wersję Go 1.4 gccgo.


twotwotwo wspomina w komentarzach na slajd prezentacji Brad Fitzpatrick

gccgo generuje bardzo dobry kod
... ale brakuje mu analizy ucieczki: zabija wydajność wieloma małymi alokacjami + śmieciami
... GC nie jest precyzyjne. Zły dla wersji 32-bitowej.

twotwotwo dodaje:

Inny slajd wspomina, że ​​generowanie kodu ARM innego niż gccgo jest niewygodne.
Zakładając, że jest to interesująca opcja dla twojego projektu, prawdopodobnie porównaj pliki binarne dla swojego przypadku użycia na docelowej architekturze.


Jak komentuje peterSO , Go 1.5 now (Q3 / Q4 2015) oznacza:

Kompilator i środowisko uruchomieniowe są teraz w całości napisane w Go (z małym asemblerem).
C nie jest już zaangażowany w implementację, więc kompilator C, który był kiedyś potrzebny do zbudowania dystrybucji, zniknął .

Slajd „Go in Go” wspomina:

C zniknęło.
Uwaga dodatkowa: gccgo wciąż się rozwija.


Berkant pyta w komentarzach, czy gccgojest to, z czego gczostał załadowany.

Jörg W Mittag odpowiada:

Nie, gccgopojawił się później gc.

gczostał pierwotnie napisany w C. Opiera się na kompilatorze C Kena Thompsona z systemu operacyjnego Plan9 , następcy Uniksa, zaprojektowanym przez tych samych ludzi. gczostał iteracyjnie refaktoryzowany, aby coraz więcej pisać o sobie w Go.

gccgozostała założona przez Iana Lance'a Taylora , hakera GCC niezwiązanego z projektem Go.

Zauważ, że pierwszy w pełni samodzielnie hostowany kompilator Go był w rzeczywistości zastrzeżoną komercyjną implementacją o zamkniętym kodzie źródłowym dla systemu Windows, której nazwa najwyraźniej zniknęła z mojego mózgu tak samo, jak z Internetu. Twierdzili, że mają własny kompilator napisany w Go, przeznaczony dla systemu Windows w czasach, gdy gccgojeszcze nie istniał i gcbył niezwykle bolesny w konfiguracji w systemie Windows. (Zasadniczo musiałeś założyć pełne środowisko Cygwin, załatać kod źródłowy i skompilować go ze źródeł). Wydaje się, że firma upadła, zanim zdążyła wprowadzić produkt na rynek.

Hector Chu miał zwolnić port systemu Windows z Go w listopadzie 2009.
A go-lang.cat-v.org/os-portsstrona wspomina Joe / Joseph Poirier wstępną pracę, jak również. Na tej stronie :

Czy jest jakaś szansa, że ​​ktoś wtajemniczony poprosi jednego z facetów ( Alex Brainman - Hector Chu - Joseph Poirier) zaangażowanych w tworzenie portu Windows, mógłby stworzyć wpis wiki opisujący ich środowisko kompilacji?

Dodaj do tego (w pisaniu aplikacji internetowych w Go ) ! 光 京 (Wei Guangjing) .

VonC
źródło
4
golang.org/doc/go1.3#gccgo A co ważniejsze, gccgo obsługuje tylko do wersji go v1.2, więc jeśli potrzebujesz czegoś nowego w 1.3 / 1.4 (wskazówka), gccgo nie może być używane.
OneOfOne
1
@OneOfOne dobra uwaga, dołączyłem Twój komentarz do odpowiedzi, aby uzyskać lepszą widoczność.
VonC
1
@twotwotwo good find. Zawarłem to w odpowiedzi dla większej widoczności.
VonC,
3
Czytałem, że gccgo implementuje gorutyny, nadając każdemu z nich dedykowany wątek (w przeciwieństwie do multipleksowania wielu gorutyn w jeden wątek). Jeśli to nadal prawda, może to być poważna różnica dla niektórych osób.
DragonFax
2
@LeoGallucci Ogólna idea w tej odpowiedzi dotyczy Go 1.11 („gccgo: więcej optymalizacji, więcej procesorów.”). Nowszą ilustrację można zobaczyć pod adresem stackoverflow.com/a/46970176/6309 .
VonC,