¿Cómo se ejecuta el programa en lenguaje C que escribes?

Tabla de contenido

 entorno de traducción

compilar

Precompilado

 compilar

Compilacion 

Enlace

entorno operativo


Todos sabemos que las computadoras solo pueden reconocer instrucciones binarias, entonces, ¿cómo reconocen las computadoras el código que escribimos?

En cualquier implementación de ANSI C (estándar C), existen dos entornos distintos.
El primero es el entorno de traducción, donde el código fuente se convierte en instrucciones de máquina ejecutables.
El segundo es el entorno de ejecución, que se utiliza para ejecutar el código.

 entorno de traducción

  •  Cada archivo fuente que compone un programa se convierte individualmente en un archivo objeto correspondiente mediante un proceso de compilación .
  • El vinculador agrupa cada archivo objeto para formar un programa ejecutable único y completo .
  • El vinculador también importará cualquier función utilizada por el programa en la biblioteca de funciones estándar de C, y puede buscar en la biblioteca de programas personales del programador y vincular las funciones que necesita al programa.

El entorno de traducción se puede dividir en:

compilar

  • Precompilado
  • compilar
  • Compilacion

Enlace



compilar

Precompilado

La precompilación generará un archivo con el sufijo .i. La imagen de la izquierda es el programa fuente y la imagen de la derecha es el programa precompilado (las pocas líneas superiores son referencias al archivo de encabezado).

Todo lo que el programa necesita hacer en la fase de precompilación son algunas operaciones de texto:

  1. Eliminar todos los comentarios en el código;
  2. Reemplace todas las macros e identificadores definidos por #define;
  3. Incluya todos los archivos de encabezado;
  4. Se procesan todas las directivas de preprocesamiento.

 compilar

Después de que el código se procesa en la etapa de precompilación, ingresa a la etapa de compilación, en esta etapa el código se traducirá a código ensamblador y se colocará en un archivo con el sufijo .s.

 Este es el código ensamblador en el archivo .s generado por el código anterior después de la etapa de compilación.

Durante la fase de compilación el programa realiza las siguientes operaciones:

  • análisis de gramática
  • análisis léxico
  • Análisis semántico
  • Resumen de símbolos

Compilacion 

El código se convierte a código binario durante la etapa de ensamblaje.

Los archivos de destino y los programas ejecutables generados por la compilación de gcc en Linux se almacenan en formato ELF. Y este formato se puede reconocer mediante el siguiente comando en gcc (readelf test.o -a):

 Durante la fase de montaje el programa realiza las siguientes operaciones:

  • Forme una tabla de símbolos;
  • Convierte código ensamblador a código binario.

 Qué significan los símbolos?

En la etapa de compilación, hay un resumen de símbolos. El siguiente código generará una tabla de símbolos después del resumen de símbolos, como se muestra en la figura:

Enlace

En la etapa de vinculación, el programa se convertirá del archivo .o a un programa ejecutable.

 Durante la fase de vinculación el programa hace lo siguiente:

  • Fusionar tabla de segmentos;
  • Síntesis y reubicación de tablas de símbolos.

 Dado que cada archivo fuente generará una tabla de símbolos por separado pero solo hay un programa ejecutable, la tabla de símbolos se fusionará para fusionar los símbolos con el mismo nombre y reemplazar la dirección no válida. Si la distancia del programa anterior está en el archivo impgame.c Si la función AGREGAR no está definida, el programa informará un error en este momento. Es decir, la función se encuentra en la fase de vinculación y la función llamada no está definida.



entorno operativo

El proceso de ejecución del programa:

  1. El programa debe cargarse en la memoria. En un entorno con sistema operativo: Generalmente esto lo hace el sistema operativo. En un entorno independiente, la carga del programa se debe organizar manualmente, posiblemente colocando el código ejecutable en la memoria de solo lectura.
  2. Comienza la ejecución del programa. Luego llame a la función principal.
  3. Comience a ejecutar el código del programa. En este momento, el programa utilizará una pila de tiempo de ejecución (pila) para almacenar las variables locales y la dirección de retorno de la función. Los programas también pueden utilizar memoria estática. Las variables almacenadas en la memoria estática conservan sus valores durante la ejecución del programa.
  4. Terminar el programa. Terminación normal de la función principal; también es posible una terminación inesperada.
     

Supongo que te gusta

Origin blog.csdn.net/2302_76339343/article/details/131816300
Recomendado
Clasificación