Quais são as principais diferenças entre 'gc' e 'gccgo'?

85

Quais são as principais diferenças entre os dois compiladores Go populares, 'gc' e 'gccgo'? Construir desempenho? Desempenho em tempo de execução? Opções de linha de comando? Licenciamento?

Não procuro opiniões sobre o que é melhor, apenas uma visão geral básica de suas diferenças, para poder decidir o que é melhor para minhas necessidades.

Flimzy
fonte
3
Como isso mudou com o tempo? Agora em 2019
Leo Gallucci

Respostas:

108

Você pode ver mais em " Configurando e usando o gccgo ":

gccgo, um compilador para a linguagem Go. O compilador gccgo é um novo frontend para o GCC.
Observe que gccgo não é o compilador gc

Conforme explicado em " Gccgo no GCC 4.7.1 " (julho de 2012)

A linguagem Go sempre foi definida por uma especificação, não por uma implementação. A equipe Go escreveu dois compiladores diferentes que implementam essa especificação: gc e gccgo.

  • Gc é o compilador original e a ferramenta go o usa por padrão.
  • Gccgo é uma implementação diferente com um foco diferente

Comparado ao gc, o gccgo é mais lento para compilar o código, mas oferece suporte a otimizações mais poderosas, portanto, um programa vinculado à CPU criado pelo gccgo geralmente será executado mais rápido.

Além disso:

  • O compilador gc suporta apenas os processadores mais populares: x86 (32 bits e 64 bits) e ARM.
  • O Gccgo, entretanto, suporta todos os processadores que o GCC suporta.
    Nem todos esses processadores foram totalmente testados para gccgo, mas muitos foram, incluindo x86 (32 bits e 64 bits), SPARC, MIPS, PowerPC e até Alpha.
    O Gccgo também foi testado em sistemas operacionais não compatíveis com o compilador gc, principalmente Solaris.

se você instalar o comando go de uma versão padrão Go, que já suporta gccgo através da -compileropção: go build -compiler gccgo myprog.


Resumindo: gccgo: mais otimização, mais processadores .


No entanto, conforme comentado por OneOfOne ( fonte ), geralmente há uma dessincronização entre o go suportado pelo gccgo e a versão mais recente do go:

gccgo só suporta até a versão go v1.2 , então se você precisar de algo novo em 1.3 / 1.4 (dica) gccgo não pode ser usado. -

GCC release 4.9 conterá a versão Go 1.2 (não 1.3) do gccgo .
Os cronogramas de lançamento para os projetos GCC e Go não coincidem, o que significa que 1.3 estará disponível no ramo de desenvolvimento, mas que o próximo lançamento do GCC, 4.10, provavelmente terá a versão Go 1.4 do gccgo.


duas e duas mencionam nos comentários o slide da apresentação de Brad Fitzpatrick

gccgo gera um código muito bom
... mas carece de análise de escape: mata o desempenho com muitas pequenas alocações + lixo
... GC não é preciso. Ruim para 32 bits.

twotwotwo adiciona:

Outro slide menciona que a geração de código ARM não-gccgo é instável.
Supondo que seja uma opção interessante para o seu projeto, provavelmente compare os binários para o seu caso de uso na arquitetura de destino.


Conforme comentários de PeterSO , Go 1.5 agora (Q3 / Q4 2015) significa:

O compilador e o tempo de execução agora são escritos inteiramente em Go (com um pequeno montador).
C não está mais envolvido na implementação e, portanto, o compilador C que antes era necessário para construir a distribuição se foi .

O slide "Go in Go" menciona:

C se foi.
Observação lateral: o gccgo ainda está forte.


Berkant pergunta nos comentários se gccgoé o que gcfoi inicializado.

Jörg W Mittag responde:

Não, gccgoapareceu depois gc.

gcfoi originalmente escrito em C. É baseado no compilador C de Ken Thompson do sistema operacional Plan9 , o sucessor do Unix, projetado pelas mesmas pessoas. gcfoi refeito iterativamente para ter mais e mais de si mesmo escrito em Go.

gccgofoi iniciado por Ian Lance Taylor , um hacker do GCC não afiliado ao projeto Go.

Observe que o primeiro compilador Go totalmente auto-hospedado era, na verdade, uma implementação comercial proprietária de código fechado para Windows, cujo nome parece ter desaparecido de meu cérebro da mesma forma que desapareceu da Internet. Eles alegaram ter um compilador auto-hospedado escrito em Go, voltado para o Windows em uma época onde gccgoainda não existia e gcera extremamente difícil de configurar no Windows. (Você basicamente tinha que configurar um ambiente Cygwin completo, corrigir o código-fonte e compilar a partir do código-fonte.) A empresa parece ter falido, entretanto, antes mesmo de conseguir comercializar o produto.

Hector Chu lançou uma versão do Go para Windows em novembro de 2009.
E a go-lang.cat-v.org/os-portspágina menciona o trabalho inicial de Joe / Joseph Poirier também. Em desta página :

Há alguma chance de que alguém por dentro possa solicitar que um dos caras ( Alex Brainman - Hector Chu - Joseph Poirier) envolvido na produção do porte do Windows possa fazer uma entrada no wiki detalhando seu ambiente de construção?

Adicione a isso (em Writing Web Apps in Go ) ! 光 京 (Wei Guangjing) .

VonC
fonte
4
golang.org/doc/go1.3#gccgo E o mais importante, o gccgo só suporta até a versão go v1.2, portanto, se você precisar de algo novo em 1.3 / 1.4 (dica), o gccgo não pode ser usado.
OneOfOne
1
@OneOfOne bom ponto, incluí seu comentário na resposta para obter mais visibilidade.
VonC
1
@twotwotwo good find. Eu incluí na resposta para mais visibilidade.
VonC
3
Eu li que o gccgo implementa goroutines dando a cada goroutine um thread dedicado (em vez de multiplexar muitos goroutines em um thread). Se isso ainda for verdade, isso pode ser uma grande diferença para algumas pessoas.
DragonFax
2
@LeoGallucci A ideia geral nesta resposta está no Go 1.11 ("gccgo: mais otimização, mais processadores."). Você pode ver uma ilustração mais recente em stackoverflow.com/a/46970176/6309 .
VonC de