2011-06-30 19 views
6

El compilador oficial actual de Go (http://code.google.com/p/go/) utiliza actualmente un generador de código artesanal, posiblemente arcano, que incluye la inyección de secciones personalizadas en el Binario ELF.¿Por qué Go usa su propio generador de código?

Este enfoque ha engendrado bastantes errores relacionados con las utilidades que leen o escriben directamente información ELF, como , objdump o strip.

creo que esto podría haberse evitado mediante el uso de un generador de código multiplataforma welltested, como LLVM, y luego sólo tiene que utilizar las instalaciones de enlace suministrados con el sistema operativo, como ld en Unix/Linux (o ld.exe en las ventanas w/MinGW) o link.exe en Windows con Visual Studio.

Entonces, ¿por qué Go usa su propio generador de código? ¿Realmente es solo reinventar la rueda? ¿O hay razones más importantes detrás de esto?

+0

Tendría que preguntarle a alguien sobre ese proyecto por qué hicieron esa elección. – dmckee

+1

Para tener control completo de lo que hacen. – OscarRyz

+2

@dmckee: O podría leer su respuesta a esta pregunta. – peterSO

Respuesta

7

Para obtener información sobre cómo usar gccgo, un compilador más tradicional que utiliza el back-end GCC, consulte Setting up and using gccgo.

El Go Language Specification es compilador agnóstico. Puede elegir entre los compiladores disponibles, escribir uno usted mismo o contribuir al proyecto LLVM Go frontend.

Para una perspectiva histórica sobre la tecnología de compilación Go, lee la respuesta a esta pregunta: ¿What compiler technology is used to build the compilers?

4

El compilador de referencia (5 g, 6 g, y 8g, denominados colectivamente como GC) fue escrito por Ken Thompson basa en el compilador de C que escribió para el sistema operativo Plan 9. Hay un par de razones por las que hizo esto:

  • Él ya estaba familiarizado con el funcionamiento de su compilador de C, por lo que le resultó más fácil adaptar su trabajo existente en lugar de aprender un marco completamente nuevo.
  • Uno de los objetivos de Go es compilar rápidamente. El compilador de gc es probablemente más rápido que un compilador basado en LLVM porque simplemente no hace tanto trabajo. Por otra parte, tampoco se está optimizando.

Como mencionó Peter, también está gccgo, que usa gcc como back-end. Sospecho que eventualmente habrá otras opciones para los compiladores de Go, especialmente dado que las bibliotecas de Go incluyen un analizador de Go completo y un corrector de tipo (parcialmente completo).