b'\n_START_ARTICLE_\nGNU Compiler Collection\n_START_SECTION_\nObjetivo\n_START_PARAGRAPH_\nGCC es parte del proyecto GNU, y tiene como objetivo mejorar el compilador usado en todos los sistemas GNU, incluyendo la variante GNU/Linux. El desarrollo de GCC usa un entorno de desarrollo abierto y soporta muchas plataformas con el fin de fomentar el uso de un compilador-optimizador de clase global, que pueda atraer muchos equipos de desarrollo, y asegure que GCC y los sistemas GNU funcionen en diferentes arquitecturas y diferentes entornos, y m\xc3\xa1s a\xc3\xban, para extender y mejorar las caracter\xc3\xadsticas de GCC.\n_START_SECTION_\nHistoria\n_START_PARAGRAPH_\nRichard Stallman comenz\xc3\xb3 a escribir GCC en 1985. A\xc3\xb1adi\xc3\xb3 elementos extendiendo un compilador preexistente de C. El compilador originalmente compilaba Pastel, un dialecto extendido, no portable de Pascal, y estaba escrito en el propio Pastel. Fue reescrito en C por Len Tower y Stallman,\xe2\x80\x8b y publicado en 1987\xe2\x80\x8b como el compilador del Proyecto GNU, para tener un compilador disponible que fuera software libre. Su desarrollo fue supervisado por la Free Software Foundation (FSF).\xe2\x80\x8b_NEWLINE_En 1991, GCC 1.x hab\xc3\xada logrado un punto de estabilidad, pero limitaciones en la arquitectura imped\xc3\xadan muchas mejoras deseadas, as\xc3\xad que la FSF empez\xc3\xb3 a trabajar en GCC 2.x._NEWLINE_Como GCC era software libre, hab\xc3\xada programadores que quer\xc3\xadan trabajar en otras direcciones, por ejemplo, escribiendo interfaces para otros lenguajes distintos de C, \xc3\xa9stos fueron libres de desarrollar sus propios forks del compilador. M\xc3\xbaltiples bifurcaciones trajeron ineficiencia e inmanejabilidad, sin embargo, la dificultad de producir c\xc3\xb3digo que fuera aceptado por el proyecto oficial de GCC era altamente frustrante para muchos puesto que la FSF guardaba un f\xc3\xa9rreo control en qu\xc3\xa9 era a\xc3\xb1adido a la versi\xc3\xb3n oficial de GCC 2.x. Esto hizo que GCC fuera citado como ejemplo del modelo de desarrollo "catedral" de software mencionado en el ensayo de Eric S. Raymond titulado La catedral y el bazar._NEWLINE_Desde la publicaci\xc3\xb3n de la versi\xc3\xb3n 4.4. de BSD en 1994, GCC se convirti\xc3\xb3 en el compilador por defecto de los sistemas BSD.\n_START_SECTION_\nLenguajes\n_START_PARAGRAPH_\nEn su versi\xc3\xb3n 4.6 incluye front ends para C (gcc), C++ (g++), Java (gcj), Ada (GNAT), Objective-C (gobjc), Objective-C++ (gobjc++) y Fortran (gfortran).\xe2\x80\x8b Tambi\xc3\xa9n esta disponible, aunque no de forma est\xc3\xa1ndar, soporte para Go (gccgo), Modula-2, Modula-3, Pascal (gpc), PL/I, D (gdc), Mercury, y VHDL (ghdl).\xe2\x80\x8b\n_START_SECTION_\nEstructura\n_START_PARAGRAPH_\nLa interfaz exterior de GCC es generalmente est\xc3\xa1ndar para un sistema UNIX. Los usuarios llaman un programa controlador llamado gcc, que interpreta los argumentos dados, decide qu\xc3\xa9 compilador usar para cada archivo y ejecuta el ensamblador con el c\xc3\xb3digo resultante, despu\xc3\xa9s posiblemente ejecuta el enlazador para producir un programa completo._NEWLINE_Cada uno de los compiladores es un programa independiente que toma como entrada c\xc3\xb3digo fuente y produce c\xc3\xb3digo en ensamblador. Todos ellos tienen una estructura interna com\xc3\xban: un front end por lenguaje que procesa el lenguaje y produce un \xc3\xa1rbol de sintaxis y un back end, que convierte esos \xc3\xa1rboles al lenguaje RTL (lenguaje de transferencia de registros) de GCC, luego realiza varias optimizaciones y produce el ensamblador utilizando un reconocimiento de patrones espec\xc3\xadfico para la arquitectura, originalmente basado en un algoritmo de Jack Davidson y Chris Fraser._NEWLINE_Casi todo GCC est\xc3\xa1 escrito en C, aunque gran parte del front end de Ada est\xc3\xa1 escrito en Ada. El 30 de mayo de 2010 se anunci\xc3\xb3 que se comenzar\xc3\xa1 a utilizar C++ en el desarrollo de GCC.\xe2\x80\x8b\n_START_SECTION_\nFront ends\n_START_PARAGRAPH_\nLos front ends var\xc3\xadan internamente, teniendo que producir \xc3\xa1rboles que puedan ser manejados por el back end. Todos los analizadores son analizadores recursivos descendentes y fueron escritos manualmente, no generados autom\xc3\xa1ticamente._NEWLINE_Hasta hace poco, el \xc3\xa1rbol de representaci\xc3\xb3n de programa no era totalmente independiente del procesador para el que se quer\xc3\xada generar el c\xc3\xb3digo._NEWLINE_Recientemente se han incluido dos nuevas formas de \xc3\xa1rbol independientes del lenguaje. Estos nuevos formatos son llamados GENERIC y GIMPLE. El an\xc3\xa1lisis ahora es realizado creando \xc3\xa1rboles temporales dependientes del lenguaje y convirti\xc3\xa9ndolos a GENERIC. El gimplifier convierte esto a GIMPLE, que es el lenguaje com\xc3\xban para un gran n\xc3\xbamero de optimizaciones independientes de la arquitectura y del lenguaje._NEWLINE_La optimizaci\xc3\xb3n en \xc3\xa1rboles no entra en lo que la mayor\xc3\xada de los desarrolladores de compiladores consideran trabajo del front end, ya que no es dependiente del lenguaje y no involucra el an\xc3\xa1lisis. Los desarrolladores de GCC han dado a esta parte del compilador el nombre de middle end. Las optimizaciones incluyen eliminaci\xc3\xb3n de c\xc3\xb3digo que nunca se ejecuta, eliminaci\xc3\xb3n parcial de redundancia, redundancia a la hora de evaluar expresiones... Actualmente se est\xc3\xa1 trabajando en optimizaciones basadas en dependencia de arreglos.\n_START_SECTION_\nBack end\n_START_PARAGRAPH_\nEl comportamiento del backend est\xc3\xa1 parcialmente especificado por el preprocesador de macros espec\xc3\xadficas a la arquitectura objetivo, por ejemplo para definir la posici\xc3\xb3n de los bits m\xc3\xa1s significativos, tama\xc3\xb1o de palabra, convenci\xc3\xb3n para llamadas, etc. El back end utiliza estas para la generaci\xc3\xb3n de RTL, aunque en GCC este es independiente del procesador y la secuencia inicial de instrucciones abstractas es adaptada a la arquitectura objetivo.'