Parcial 1: Proceso de compilación y Memory Layout en C. Flashcards
Menciona los pasos de generación de un ejecutable (de archivo .c a archivo .exe).
- Pre-processor -> Expande las macros en sentencias del lenguaje fuente.
- Compiler -> Produce un programa en lenguaje ensamblador, éste es más fácil de depurar.
- Assembler -> Reubica el código máquina.
- Linker -> Encargado de combinar diferentes librerías con los archivos tipo objeto en un único archivo ejecutable de output.
¿Qué es un compilador?
Programa que es capaz de leer un programa en un código y traducirlo en un programa equivalente pero en otro lenguaje (en el caso de c, en código máquina).
Describe los pasos de compilación.
- Análisis -> Se parte en pedazos el código fuente, y se crean estructuras para crear una representación intermedia de ese código.
- Síntesis -> Se crea el programa en el lenguaje deseado con la representación intermedia obtenida en el análisis.
Cuando hablamos de conceptos como frontend y backend, ¿a qué etapa de compilación nos referimos?
Etapa de análisis.
En la etapa de análisis, esta sección o “sub-etapa” incluye el análisis léxico, sintaxis y semántica del código.
Frontend
¿A qué se refiere la sección o “sub-etapa” de backend?
Se refiere a la generación y optimización del código.
¿Qué es un lexema?
Secuencia significativa, creada durante la etapa de análisis léxico. Tienen esta sintáxis:
< token-name, attribute-value >
Procesos que engloba el front end.
- Análisis léxico
- Análisis sintáctico
- Análisis semántico
Procesos que engloba el back end.
- Code optimizer.
2. Code generator.
¿Qué es la tabla de símbolos?
Estructura de datos donde se guarda información del código fuente, generalmente la info. son los identificadores, su valor, etc.
En esta proceso del front end, el output del análisis léxico para identificar posibles errores.
Análisis sintáctico.
En este proceso del front end, se verifica que el código fuente tenga consistencia semántica con la definición del lenguaje. Aquí también ser revisa el tipo de dato y se verifica que cada operador corresponda a los operandos.
Análisis semántico.
Podemos decir que la etapa de análisis, se divide en estos procesos.
- Front End
- Código intermedio
- Back End
El código intermedio debe de contar con 2 características:
- Fácil de producir
- Fácil de ser traducido al lenguaje deseado.
Definición de “build”.
Se refiere a todo el proceso de transformación de código fuente a un ejecutable.
¿Qué contiene el Zero-Initialized Data (.bss)?
Las variables globales y estáticas que NO se inicializan.
¿Qué contiene el .data?
Initialized Data, las variable globales y estáticas que SÍ están inicializadas.
¿Qué contiene el Stack?
Las variables locales que están siendo utilizadas por el programa y que NO están en el .bss ni en el .data
¿Qué contiene el Heap?
Se utiliza para obtener espacio durante la ejecución de programa (memoria dinámica).
En este código:
int a, b;
int e = 0x07;
int main(void) { float c = 72.5f; char d[32]; char *str; c = 9.81; str = (char *) malloc(4); }
¿Que variables estarán en .bss, .data, stack y heap?
En el .bss estarán a y b, ya que son variables globales sin inicializar.
En el .data estará e, porque es una variable global inicializada.
En el stack estarán c, d y str, cuando sean llamadas en la ejecución del programa.
En el heap estará la asignación que se le hace a str (la línea con la función de malloc).