Mostrando entradas con la etiqueta gcc. Mostrar todas las entradas
Mostrando entradas con la etiqueta gcc. Mostrar todas las entradas

domingo, 22 de noviembre de 2020

PROCESO DE COMPILACION

Un lenguaje de programación es un tipo de lenguaje, que permiten generar un conjuntos de órdenes para el ordenador y que de este modo pueda realizar tareas. 

El primer lenguaje es el codigo maquina o binario que crean un grupo de instrucciones en base de 0's y 1's y es el lenguaje

Existen 2 grupos grandes de lenguajes.

Lenguajes de alto nivel:

Es el lenguaje mas compresible para el desarrollador pero en terminos de optimizacion no es lo mas adecuado al trabajar con hadware.

lenguajes de alto bajo nivel

Es el lenguaje as cercano al lenguaje maquina, en algunas ocaciones se suele utilizar directamente con el hardware, por ser el mas adecuado en terminos de rendimiento.

Ademas existen lenguajes que son considerados en un estado intermedio como es C, aunque otros los llaman de bajo nivel, su uso de punteros y rutinas en codigo ensamblador.

 

Sin importar como se considere un lenguaje de alto o bajo nivel, si es un lenguaje compilado necesitara forzosamente un compilador,que es una especie de traductor que transforma en este código en instrucciones binarias que la computadora pueda entender. Dependiendo de la arquitectura y el sistema operativo, los compiladores más usados son: gnu compiler collection para linux, clank para mac y Msvc para windows. En mi caso voy a utilizar OS linux asi que debo usar para compilar gcc.

Para convertir este código fuente en algo que nuestra computadora pueda interpretar y ejecutar tenemos que compilarlo en 4 pasos:

  •  Pre-procesamiento 

  • Compilación 

  • Ensamble 

  • Enlace 

En el pre procesamiento, el pre procesador identificando las directivas incluidas en el código fuente, haciendo que algunas como puede ser #define #include #ifdef, sean sustituidas, por el valor en donde han sido invocadas.

Con el comando: 

gcc -E edad.c > edad.pp 

Se vera un archivo con extencion .pp Durante este proceso se buscará el contenido del archivo que se indica como directivas y se reemplaza por completo de modo recursivo posiblemente haciendo llamado a otras dependencias. Asi es como un pequeño codigo de una pocas lineas termina con un poco mas de 700 lineas. 

La segunda etapa llamada compilación lo que hace es convertir esas 700 líneas en unas cuantas instrucciones en assembler.

Con el comando:

 gcc -S edad.c 

 Se obtendra un archivo con extension .s, si lo abre, obtendra algo similar a lo anterior, un archivo en codigo en lenguaje esamblador, aunque puede variar dependiendo la arquitectura es de x64 o x86. 

 

La tercera etapa en el proceso de compilación es el ensamblado,

independiente del sistema o la arquitectura, en este punto, el ensamblador tomara el archivo con el codigo assembler y lo conviete en codigo binario. 

Con el comando: 

gcc -c edad.c 

Se obtendra un archivo objeto, con extencion .o . Aunque no es tan frecuente hacer pasar por las etapas anteriores y tener un archivo en codigo assembler, se puede convertir a un archivo objeto con el comando:

 as -o edad.o edad.s 

Al abrir el archivo con extencion .o se puede aprenciar que es ilegible para los humanos. 

La última etapa es el enlazado, el compilador en cadena los archivos.o ademas creando los enlcaes de lsa distintas librerias que se invocan desde estos archivos. El enlazador se denomina ld, por motivos practicos no voy a ejemplificarlo, por tener que especificar las rutas de las librerias que seran consumidas por el programa.

En cambio, gcc con el siguiente comando, permite hacer este enlace con los archivo con extension .o:

gcc -o edad edad.o 

Para hacer los 4 pasos con un solo comando: 

gcc -o edad edad.c 

Por defecto cuando se crea un enlace dinamico, esto quiere decir que el ejecutable carga desde la memoria del equipo las liberias necesarias para funcionar correctamente, mientras que el enlace estatico hace que el ejecutable sea mas independiente por tener sus librerias incorporadas, pero esto hace que el archivo sea mas pesado. 

Para especificar el enlace estatico con el flag -static: 

gcc -static -o edad edad.c

 

ref: https://gcc.gnu.org/onlinedocs/ 

ref: man gcc