Ver Mensaje Individual
  #2 (permalink)  
Antiguo 23/07/2014, 00:45
Fw190
 
Fecha de Ingreso: junio-2010
Ubicación: Madrid
Mensajes: 620
Antigüedad: 13 años, 11 meses
Puntos: 73
Respuesta: Duda con compilador

El compilador no identifica la arquitectura del procesador; es un programa que correrá sobre un procesador (o familia de procesadores) y un sistema operativo determinados. Simplemente, está diseñado para que su salida sea código ejecutable en el procesador correspondiente. Así, por ejemplo, el compilador GNU C/C++ tiene versiones para Windows 32 y 64 bits, y para Linux 32 y 64 bits, pero las versiones del compilador para Windows no se podrán ejecutar en Linux, y viceversa. Partiendo del mismo código fuente, se obtendrá una versión distinta del ejecutable para cada caso, y, como en el caso del propio compilador, los programas creados para Windows no correrán en Linux y viceversa, incluso dentro del mismo sistema operativo los programas para 32 bits puede que no corran en 64 bits.

Ahora bien, también es posible hacer que un compilador genere código para otro procesador totalmente distinto. El caso más típico es el de los microcontroladores: Tienes compiladores (que corren en Windows) y te generan el código para microcontroladores de la familia PIC, o para la familia Arduino, etc.

En cuanto a lo que ocurre a mitad del proceso de compilación... Bien, básicamente hay tres etapas:

La primera es el preprocesador. Este toma el código fuente de entrada, y en función de las directivas (instrucciones especiales) que se indiquen, efectúa la inclusión de archivos, sustitución de macros, compilación condicional, etc. La salida de este preprocesador es un archivo de código fuente temporal, que es el que va a ser realmente compilado.

El compilador en sí, toma el archivo de salida del preprocesador y produce el código objeto. Aún no es un archivo ejecutable, y suele tener extensión .obj ó .o. En este código objeto ya están indicadas las llamadas a funciones, tanto internas como de librerías precompiladas, pero falta añadir ese código.

El último paso es el enlazador (linker). Este toma el código objeto generado por el compilador y busca en ese código objeto y en las librerías precompiladas las funciones a las que se llama. Si todo ha ido bien, genera el ejecutable final.

Lógicamente, este proceso tiene sus variantes. Por ejemplo, algunos lenguajes no necesitan la parte de preprocesado. En otras ocasiones, la fase de preprocesado y de compilado se hacen de una sola vez. Otras veces, la salida del compilador es un archivo de código fuente en lenguaje ensamblador, y necesitas un ensamblador para obtener el ejecutable final. En otras ocasiones el compilador parte de un lenguaje de alto nivel y te genera código en otro lenguaje de alto nivel (los más típicos son de PASCAL a C y de FORTRAN a C). Como puedes ver, hay múltiples variantes.

Espero que esto te resuelva alguna de tus dudas.

Saludos,