¿Cuáles son las principales diferencias entre 'gc' y 'gccgo'?

85

¿Cuáles son las principales diferencias entre los dos compiladores Go populares, 'gc' y 'gccgo'? ¿Desarrollar rendimiento? ¿Rendimiento en tiempo de ejecución? ¿Opciones de línea de comando? ¿Licencia?

No busco opiniones sobre cuál es mejor, solo una descripción básica de sus diferencias, para poder decidir cuál es mejor para mis necesidades.

Flimzy
fuente
3
¿Cómo ha cambiado esto con el tiempo? Ahora en 2019
Leo Gallucci

Respuestas:

108

Puede ver más en " Configuración y uso de gccgo ":

gccgo, un compilador para el lenguaje Go. El compilador gccgo es una nueva interfaz para GCC.
Tenga en cuenta que gccgo no es el compilador de gc

Como se explica en " Gccgo en GCC 4.7.1 " (julio de 2012)

El lenguaje Go siempre se ha definido mediante una especificación, no una implementación. El equipo de Go ha escrito dos compiladores diferentes que implementan esa especificación: gc y gccgo.

  • Gc es el compilador original y la herramienta go lo usa por defecto.
  • Gccgo es una implementación diferente con un enfoque diferente

En comparación con gc, gccgo es más lento para compilar código pero admite optimizaciones más potentes, por lo que un programa vinculado a la CPU creado por gccgo generalmente se ejecutará más rápido.

También:

  • El compilador gc solo admite los procesadores más populares: x86 (32 bits y 64 bits) y ARM.
  • Gccgo, sin embargo, admite todos los procesadores que admite GCC.
    No todos esos procesadores se han probado a fondo para gccgo, pero muchos sí, incluidos x86 (32 bits y 64 bits), SPARC, MIPS, PowerPC e incluso Alpha.
    Gccgo también se ha probado en sistemas operativos que no son compatibles con el compilador gc, especialmente Solaris.

si instala el comando go de una versión estándar de Go, que ya soporta gccgo a través de la -compileropción: go build -compiler gccgo myprog.


En resumen: gccgo: más optimización, más procesadores .


Sin embargo, como se ha comentado por OneOfOne ( fuente ), a menudo hay una desincronización entre ir apoyada por gccgo, y la última versión Go:

gccgo solo admite hasta la versión go v1.2 , por lo que si necesita algo nuevo en 1.3 / 1.4 (sugerencia), gccgo no se puede utilizar. -

La versión 4.9 de GCC contendrá la versión Go 1.2 (no 1.3) de gccgo .
Los cronogramas de lanzamiento para los proyectos GCC y Go no coinciden, lo que significa que 1.3 estará disponible en la rama de desarrollo, pero que el próximo lanzamiento de GCC, 4.10, probablemente tendrá la versión Go 1.4 de gccgo.


twotwotwo menciona en los comentarios la diapositiva de la presentación de Brad Fitzpatrick

gccgo genera muy buen código
... pero carece de análisis de escape: mata el rendimiento con muchas asignaciones pequeñas + basura
... GC no es precisa. Malo para 32 bits.

twotwotwo agrega:

Otra diapositiva menciona que la generación de código ARM que no es de gccgo es inestable.
Suponiendo que sea una opción interesante para su proyecto, probablemente compare los binarios para su caso de uso en su arquitectura de destino.


Como comenta peterSO , Go 1.5 ahora (Q3 / Q4 2015) significa:

El compilador y el tiempo de ejecución ahora están escritos completamente en Go (con un pequeño ensamblador).
C ya no participa en la implementación, por lo que el compilador de C que alguna vez fue necesario para construir la distribución se ha ido .

La diapositiva "Ir en Ir" menciona:

C se ha ido.
Nota al margen: gccgo sigue siendo fuerte.


Berkant pregunta en los comentarios si gccgoes de lo que gcse arrancó.

Jörg W Mittag responde:

No, gccgoapareció después gc.

gcfue escrito originalmente en C. Se basa en el compilador C de Ken Thompson del sistema operativo Plan9 , el sucesor de Unix, diseñado por las mismas personas.gcfue refactorizado iterativamente para tener más y más de sí mismo escrito en Go.

gccgofue iniciado por Ian Lance Taylor , un hacker de GCC no afiliado al proyecto Go.

Tenga en cuenta que el primer compilador de Go totalmente autohospedado era en realidad una implementación comercial de código cerrado patentado para Windows cuyo nombre parece haber desaparecido de mi cerebro de la misma manera que lo hizo en Internet. Afirmaron tener un compilador autohospedado escrito en Go, dirigido a Windows en un momento en el gccgoque aún no existía y gcera extremadamente doloroso configurarlo en Windows. (Básicamente, tenía que configurar un entorno Cygwin completo, parchear el código fuente y compilar desde la fuente). Sin embargo, la compañía parece haberse plegado antes de que pudieran comercializar el producto.

Héctor Chu lanzó una versión de Go para Windows en noviembre de 2009.
Y la go-lang.cat-v.org/os-portspágina también menciona el trabajo inicial de Joe / Joseph Poirier . En esta pagina :

¿Alguna posibilidad de que alguien que conozca pueda solicitar que uno de los chicos ( Alex Brainman - Hector Chu - Joseph Poirier) involucrados en la producción del puerto de Windows pueda hacer una entrada wiki detallando su entorno de construcción?

¡Agregue a eso (en Escribir aplicaciones web en Go ) ! 光 京 (Wei Guangjing) .

VonC
fuente
4
golang.org/doc/go1.3#gccgo Y lo que es más importante, gccgo solo admite hasta la versión go v1.2, por lo que si necesita algo nuevo en 1.3 / 1.4 (consejo), gccgo no se puede utilizar.
OneOfOne
1
@OneOfOne Un buen punto, he incluido su comentario en la respuesta para una mayor visibilidad.
VonC
1
@twotwotwo buen hallazgo. Lo he incluido en la respuesta para mayor visibilidad.
VonC
3
Leí que gccgo implementa goroutines dando a cada goroutine un hilo dedicado (en lugar de multiplexar muchas goroutines en un hilo). Si esto sigue siendo cierto, entonces puede ser una gran diferencia para algunas personas.
DragonFax
2
@LeoGallucci La idea general en esta respuesta se basa en Go 1.11 ("gccgo: más optimización, más procesadores"). Puede ver una ilustración más reciente en stackoverflow.com/a/46970176/6309 .
VonC