¿Qué es un compilador?
Un compilador es un programa que traduce el código fuente escrito en lenguajes como C++, C, Java, Python, entre otros, a código máquina, el lenguaje que la computadora entiende y puede ejecutar.
Sus ojetivos principales son:
- Convertir el código fuente en un programa equivalente en lenguaje máquina o en lenguaje intermedio.
- Comprobar que el código fuente cumple las reglas del lenguaje (sintaxis y semántica).
- Detectar y reportar errores en el código fuente para que el programador pueda corregirlos.
En la figura1 se muestra la estructura del compilador que recibe un programa escrito por el programador, lo traduce y genera una salida ejecutable, y si hay errores, informa al programador para que los solucione.
En la imagen anterior se muestra como el compilador procesa la informacion en pequeñas partes:
Una función importante del compilador es reportar cualquier error en el programa fuente que detecte durante el proceso de traducción. Por ello, el compilador se divide en dos partes importantes: análisis y síntesis.
La parte de análisis divide el programa fuente en componentes pequeños e impone una estructura gramatical sobre ellos. Luego, utiliza esta estructura para crear una representación intermedia del programa fuente. Si el análisis detecta que el programa fuente está mal formado en cuanto a la sintaxis o que no tiene una semántica consistente, debe proporcionar mensajes informativos para que el usuario pueda corregirlos.
La síntesis se encarga de construir el código de salida a partir de la representación procesada y validada en la etapa de análisis. Su objetivo es traducir correctamente y optimizar el programa para que sea eficiente y compatible con la máquina o arquitectura de destino.
En la Figura 2 se muestra un esquema donde se representan las fases del compilador, cada una de las cuales transforma el programa fuente de una representación a otra. Cada fase toma como entrada el resultado de la etapa anterior y envía su salida a la siguiente fase del compilador, estructurándose de la siguiente manera:
Se describe detalladamente la imagen anterior:
Análisis léxico:
El análisis léxico es la primera fase, en la que el compilador escanea el código fuente. Este proceso se realiza de izquierda a derecha, carácter por carácter, agrupando estos caracteres en unidades llamadas tokens.Análisis sintáctico:
Se basa en las reglas específicas del lenguaje de programación, construyendo un árbol de análisis (parse tree) con la ayuda de los tokens. Además, determina la estructura del programa y valida la gramática o sintaxis del lenguaje.Análisis semántico:
Comprueba la coherencia semántica del código. Utiliza el árbol de sintaxis generado en la fase anterior junto con la tabla de símbolos para verificar que el código fuente sea semánticamente consistente.Generación de código intermedio:
Representa el programa en una forma abstracta que se encuentra entre el lenguaje de alto nivel y el lenguaje máquina. Este código intermedio se genera de manera que facilite su traducción al código máquina de destino.Optimización de código independiente de la máquina:
Mejora el código intermedio para hacerlo más eficiente en términos de tiempo de ejecución o uso de memoria, sin alterar su funcionalidad.Generación de código:
Traduce el código intermedio a código máquina específico para la arquitectura del sistema objetivo.Optimización de código dependiente de la máquina:
Realiza ajustes adicionales al código máquina generado, aprovechando al máximo las características específicas de la arquitectura del sisteman,Esta informacion se detallo con la ayuda de Guru99. (n.d.). Fases del diseño del compilador. Guru99. Recuperado el 18 de noviembre de 2024, de https://www.guru99.com/es/compiler-design-phases-of-compiler.html
También puedes ver este video que explica detalladamente qué es un compilador y cómo ha evolucionado a lo largo de los años.
Profe Ángel. (2023, noviembre 25). Introducción a los compiladores [Video]. YouTube. https://youtu.be/TnsebcR_dTg
Referencias:
Secretaria, & Secretaria. (2023, 1 noviembre). Los lenguajes de programación más utilizados en desarrollo web. Escuela ESDIMA. https://esdima.com/cuales-son-los-lenguajes-de-programacion-mas-utilizados-en-desarrollo-web/
Aho, A. V. (2007). Compilers: Principles, Techniques, & Tools. Pearson.
Definiciones:
Lenguaje fuente: El código escrito en un lenguaje fuente no puede ser entendido directamente por la computadora, ya que esta solo comprende código de máquina, que consiste en instrucciones en formato binario.
Lenguaje destino: Es el lenguaje de programación que los humanos pueden leer y escribir, como C, Java o Python. Está diseñado para ser comprensible por los programadores, facilitando la creación de programas.
Código de máquina: Es el conjunto de instrucciones que una computadora puede entender y ejecutar directamente, generalmente en formato binario, específico para la arquitectura de la máquina.