Compilación de un programa C: – Detrás de escena

C es un lenguaje de nivel medio y necesita un compilador para convertirlo en un código ejecutable para que el programa pueda ejecutarse en nuestra máquina. 

¿Cómo compilamos y ejecutamos un programa en C?
A continuación se muestran los pasos que usamos en una máquina Ubuntu con el compilador gcc.  

compilation

  • Primero creamos un programa en C usando un editor y guardamos el archivo como filename.c
 $ vi filename.c
  • El diagrama de la derecha muestra un programa simple para sumar dos números.

compil31

  • Luego compílelo usando el siguiente comando.
 $ gcc -Wall filename.c –o filename
  • La opción -Wall habilita todos los mensajes de advertencia del compilador. Se recomienda esta opción para generar mejor código. 
    La opción -o se usa para especificar el nombre del archivo de salida. Si no usamos esta opción, se genera un archivo de salida con el nombre a.out.

compil21

  • Después de que se genera el ejecutable de compilación y ejecutamos el ejecutable generado usando el siguiente comando.
 $ ./filename 

¿Qué va dentro del proceso de compilación?
El compilador convierte un programa C en un ejecutable. Hay cuatro fases para que un programa en C se convierta en un ejecutable: 

  1. Preprocesamiento
  2. Compilacion
  3. Asamblea
  4. Enlace

Al ejecutar el siguiente comando, obtenemos todos los archivos intermedios en el directorio actual junto con el ejecutable.

 $gcc -Wall -save-temps filename.c –o filename 

La siguiente captura de pantalla muestra todos los archivos intermedios generados. 

compil4

Veamos uno por uno qué contienen estos archivos intermedios. 

Preprocesamiento

Esta es la primera fase por la que se pasa el código fuente. Esta fase incluye:  

  • Eliminación de comentarios
  • Expansión de Macros
  • Ampliación de los archivos incluidos.
  • compilación condicional

La salida preprocesada se almacena en filename.i . Veamos qué hay dentro de filename.i: usando $vi filename.i  
En el resultado anterior, el archivo fuente está lleno de mucha, mucha información, pero al final nuestro código se conserva. 
Análisis: 

  • printf contiene ahora a + b en lugar de agregar (a, b) porque las macros se han expandido.
  • Se eliminan los comentarios.
  • Falta #include<stdio.h> en su lugar, vemos mucho código. Por lo tanto, los archivos de encabezado se han ampliado e incluido en nuestro archivo fuente.

Compilando

El siguiente paso es compilar filename.i y producir un; archivo de salida compilado intermedio filename.s . Este archivo está en instrucciones de nivel de ensamblado. Veamos a través de este archivo usando $vi filename.s  

image

La instantánea muestra que está en lenguaje ensamblador, que el ensamblador puede entender. 

Ensamblaje
En esta fase, el nombre de archivo.s se toma como entrada y el ensamblador lo convierte en nombre de archivo.o. Este archivo contiene instrucciones a nivel de máquina. En esta fase, solo el código existente se convierte en lenguaje de máquina, las llamadas a funciones como printf() no se resuelven. Veamos este archivo usando $vi filename.o 

compil7

Enlace

Esta es la fase final en la que se realiza toda la vinculación de las llamadas a funciones con sus definiciones. Linker sabe dónde se implementan todas estas funciones. Linker también hace un trabajo adicional, agrega un código adicional a nuestro programa que se requiere cuando el programa comienza y finaliza. Por ejemplo, hay un código que se requiere para configurar el entorno, como pasar argumentos de línea de comandos. Esta tarea se puede verificar fácilmente usando $size filename.o y $size filename . A través de estos comandos, sabemos cómo el archivo de salida aumenta de un archivo de objeto a un archivo ejecutable. Esto se debe al código extra que agrega el enlazador con nuestro programa. 
 

compil8

Tenga en cuenta que GCC realiza enlaces dinámicos de forma predeterminada, por lo que printf() está vinculado dinámicamente en el programa anterior. Consulte this , this y this para obtener más detalles sobre los enlaces estáticos y dinámicos. 
Este artículo es una contribución de Vikash Kumar . Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *