Introducción a los Compiladores
¿Qué es un compilador?
Un compilador es un programa que traduce un programa escrito en un lenguaje de programación (usualmente de los llamados de alto nivel) a otro lenguaje de programación, generando un programa equivalente que la máquina será capaz de interpretar. El segundo lenguaje puede ser código máquina, pero también puede ser simplemente texto. Este proceso de traducción se conoce como compilación.
Usualmente este proceso de traducción está dividido en tres estratos, conocidos como Front-End, Middle-End y Back-End.
Contexto del proceso de compilación
¿Qué es un compilador cruzado?
Un compilador cruzado (cross-compiler) es un compilador capaz de generar código para otra plataforma diferente de aquella en la cual está corriendo.
Tiempo de Compilación - Tiempo de Ejecución
Los términos compile-time y run-time son usualmente referidos en la jerga de la programación. Compile-time se utiliza para todas aquellas acciones relacionadas al programa que pueden ser definidas en esta etapa, es decir previo a que esté corriendo en la plataforma de destino. Por lo contrario, cuando se habla de definiciones en run-time se refiere a aquello parámetros que solo se pueden determinar al momento en que el programa esta corriendo en su plataforma.
GCC el compilador para lenguaje C de GNU
El GNU Compiler Collection (usualmente referido por sus siglas como GCC) es un sistema de compilación producido por el proyecto GNU capaz de soportar varios lenguajes de programación. GCC es uno de los componentes claves de la cadena de herramientas (toolchain) de programación de GNU.
A la vez de ser el compilador oficial del sistema GNU, GCC ha sido adoptado como compilador estándar por muchos otros sistemas operativos tipo-Unix, incluyendo GNU/Linux, la familia BSD y Mac OS X.
GCC ha sido portado a una amplia variedad de arquitectura de procesadors, y es ampliamente distribuido como herramienta comercial, propietaria y en ambientes de desarrollo de software de fuentes cerradas. GCC también está disponible para varias plataformas embebidas como Symbian, AMCC, Freescale Power Architecture-based chips. Muchas compañías hacen, hoy en día, de su negocio la provisión y el soporte de portaciones de gcc a varias plataformas; los fabricantes de chips consideran la portación de gcc casi escencial para el éxito de una arquitectura.
Si bien el compilador inicialmente sólo manejaba lenguaje C, ya en 1997 incorporó C++ y con el tiempo se desarrollaron otros Front-End para lenguajes como Fortran, Pascal, Objective C, Java y Ada entre otros.
El crosscompiler GNUARM
Obtener un compilador cruzado para una determinada arquitectura requiere básicamente que la arquitectura esté soportada, esto es:
- Que exista un back-end de gcc capaz de generar el código assembler para esa arquitectura.
- Que el paquete binutils incluya un programa ensamblador para esa arquitectura.
- Que una porción del de las librerías estándar de C del la plataforma "target" esté disponible en la plataforma "host"
"GCC ARM Embedded" es el nombre de un proyecto mantenido por desarrolladores de la propia empresa ARM que provee una distribución de binarios precompilados del GNU toolchain ARM/Newlib o de los propios fuentes para poder ser compilado por el propio usuario.
https://launchpad.net/gcc-arm-embedded
El toolchain consiste de GNU binutils, el conjunto de compiladore de GCC y el debugger GDB. Se utilizan las Newlib como librerías estándar de C.
Del conjunto de programas de binutils serán de interés para este curso:
- arm-none-eabi-as, es el programa ensamblador.
- arm-none-eabi-ld, es el programa que permite enlazar los archivos objeto y las librerías.
arm-none-eabi-objcopy, es el programa que convierte el archivo objeto del programa completo al formato binario que será descargado al target.
- arm-none-eabi-objdump, este programa nos permite obtener información de los archivos objeto.
Del conjunto de programas de compilación se utilizará:
- arm-none-eabi-gcc, este programa compila el código escrito en C pudiendo producir como salida código asembler o generar el ensamblado y dar como resultado el archivo objeto.
Finalmente utilizaremos para debugging:
- arm-none-eabi-gbd.