Tabla de contenido
El entorno de traducción y el entorno de ejecución del programa.
El entorno de traducción se divide en dos partes, compilar + enlace
El primer paso: precompilar (preprocesamiento)
Hay cuatro puntos sobre el entorno operativo:
Acerca de las bibliotecas de enlaces
El entorno de traducción y el entorno de ejecución del programa.
En cualquier implementación de ANSI C (Estándar C) , hay dos entornos distintos.*El primer tipo es el entorno de traducción. En este entorno, el código fuente se convierte en instrucciones de máquina ejecutables.En el compilador (tome VS2019 como ejemplo), el código de lenguaje C que escribimos es toda la información de texto (varias cadenas, datos, estructuras, etc.), desde un punto de vista humano, podemos entenderlo, pero las computadoras no pueden , el código debe traducirse en instrucciones que la computadora pueda reconocer: instrucciones binarias
*El segundo tipo es el entorno de ejecución. Se utiliza para ejecutar realmente el código.El código de instrucción binario generado después de que el código pasa por el entorno de traducción es ejecutado y generado por el entorno de ejecución.
Pasos para generar un programa ejecutable cuando se compila el código:
1. Cada archivo fuente que conforma un programa se convierte en código objeto ( object code ) a través del proceso de compilación.2. Un enlazador agrupa cada archivo de objeto para formar un programa ejecutable único y completo.3. El enlazador también importará cualquier función utilizada por el programa en la biblioteca de funciones C estándar, y puede buscar en la biblioteca de programas personales del programador y vincular las funciones que necesita en el programa.En breve:El compilador compila por separado cada archivo fuente (.c) para generar un archivo objeto (.obj), y el vinculador procesa el archivo objeto y la biblioteca de vínculos (este proceso se denomina vinculación) para generar un programa ejecutable (. exe).Como se muestra abajo
El entorno de traducción se divide en dos partes, compilar + enlace
La compilación en sí también se divide en varias etapas: preprocesamiento, compilación, ensamblaje.
A continuación, usamos un código simple, el nombre del archivo fuente (test.c), y usamos el editor gcc para demostrar todo el proceso;
El primer paso: precompilar (preprocesamiento)
Las instrucciones precompiladas son: archivo fuente gcc.c -E - nombre del archivo fuente + .i
1. Opción de preprocesamiento gcc - E test.c - o test.iDeténgase después de que se complete el preprocesamiento y los resultados generados después del preprocesamiento se colocarán en el archivo test.i. El contenido específico se puede ver en la siguiente figura.
Como el siguiente código:
源文件文件名 :test.c #include<stdio.h> //定义全局变量,赋值2023 int year = 2023; #define M 100 int main() { int a = M; printf("%d\n", M); return 0; }
1. Introduzca el comando gcc test.c -E -test i
Salida terminal:
2. Observe el contenido de test.c y test.i
3. Ver en el archivo test.i
Descubrimos que al final de todo el código de test.i está el contenido de nuestro código fuente, entonces, ¿cuáles son los cientos de líneas de código que se encuentran delante de él? Se incluye todo el contenido del archivo de encabezado <stdio.h> . Al mismo tiempo, los estudiantes cuidadosos encontraron que no hay comentarios en test.i, y no hay un símbolo M definido por la macro, por lo que la función de preprocesamiento es:
- Eliminación de comentarios
- #include<stddio.h>La inclusión del archivo de cabecera
- Reemplazo de símbolos #define
- manipulación de texto
- Todas las instrucciones de preprocesamiento se procesan en la etapa de preprocesamiento
El segundo paso, compilar
Instrucción de compilación: gcc -S archivo fuente.c / gcc -S nombre del archivo fuente + .i
opción de compilación gcc -S test.cOpción de compilación gcc -S test.i (al compilar, ambos archivos se pueden ingresar en el comando y se generará el archivo test.s)Deténgase después de que se complete la compilación y el resultado se guarde en test.s.Ingresemos gcc - S test.c como ejemplo1. Ingrese el comando gcc -S prueba.c / gcc -S prueba.i
Salida terminal:
2. Genere el contenido del archivo test.s y muestre el contenido del archivo test.s
3. Resumen:
La parte del círculo amarillo de arriba es el contenido de test.s, que es la instrucción de montaje. La función de la compilación es traducir el código del lenguaje C en instrucciones de ensamblaje. El método de compilación es a través de: análisis sintáctico, análisis léxico, análisis semántico, resumen de símbolos, etc. En general, la compilación es la acción de desensamblar y analizar nuestro código en lenguaje c, y luego traducirlo en instrucciones de ensamblado para el siguiente ensamblado.
Paso 3: Compilar
Instrucciones de ensamblaje: gcc -c archivo fuente.c / gcc -c nombre del archivo fuente + .s
ensamblar gcc -c prueba.cUna vez completada la compilación, se detiene y el resultado se guarda en test.o.1. Ingrese el comando gcc -c prueba.c / gcc-c prueba.s
Salida terminal:
2. Se genera el archivo de destino de test.o
Pero encontrará que este es el archivo binario almacenado en el archivo de objeto test.o, y el compilador no admite mostrarlo.Si aún desea abrirlo, como se muestra a continuación;
3. Resumen:1. Las instrucciones binarias se almacenan en el archivo de objeto
2. El ensamblaje es la traducción de las instrucciones de ensamblaje a instrucciones binarias.
Por cierto: el archivo de destino test.o generado por la compilación gcc en Linux, y la prueba del programa ejecutable se almacenan en este formato de archivo de ELF
Finalmente, el proceso anterior completa la compilación y luego el proceso de vinculación
Instrucción de enlace: gcc source filename.o -o new filename
Vincular archivos de objetos. puede generar un archivo ejecutable
1. Ingrese el comando: gcc test.o -o vskkk
Terminal de salida:
2, verifique el contenido de vskkk
Sin embargo, el archivo sigue siendo binario y no se puede ver.
3. Resumen:
El papel del enlace es:
1. Combinar segmentos de línea
2. Fusión y reubicación de la tabla de símbolos
Hay cuatro puntos sobre el entorno operativo:
En comparación con el entorno de traducción, el entorno operativo es mucho más fácil de entender. La comprensión popular tiene los siguientes puntos:
Acerca de las bibliotecas de enlaces
Sabemos que al escribir código en lenguaje C, podemos usar directamente funciones de biblioteca como scanf() y printf() siempre que agreguemos el archivo de encabezado #include<stdio.h>, entonces, ¿por qué podemos usarlas directamente? La razón es que hemos compilado estas funciones de biblioteca con anticipación, las hemos empaquetado en una biblioteca estática y podemos proporcionárnoslas directamente, como la función scanf con la que estamos familiarizados, como se muestra en el círculo rojo en la figura a continuación, y el sufijo de la parte marcada termina con LIB.Es la biblioteca estática (.LIB), la biblioteca estática de la función de biblioteca y el archivo de objeto están vinculados en el enlazador para generar un programa ejecutable. El programa puede ejecutarse.
Lo anterior es todo el contenido, espero que pueda ayudarlo, si puede, espero que pueda darle un pulgar hacia arriba y apoyo al blogger, gracias. Si hay errores, espero que todos puedan criticar y señalar en el área de comentarios, y haré las correcciones.