TECNOLÓGICO NACIONAL DE
MÉXICO
INSTITUTO TECNOLÓGICO DE
SAN LUIS POTOSÍ
SISTEMAS Y COMPUTACION
GUERRERO VAZQUEZ JOSE ANTONIO
HERNANDEZ LUGO ALDAIR AZAEL
“Representación de
código intermedio”
Lenguajes y Autómatas II.
12 -1 Hrs.
30 enero 2024
Actividad 2.
Existen códigos intermedios de diversos tipos que varían en cuanto a su sencillez, lo
próximos que están a las máquinas reales y lo fácil que es trabajar con ellos.
Existen otros tipos de código intermedio que representan los programas como árboles
o grafos. También existen representaciones mixtas que combinan grafos o árboles y
representaciones lineales.
El código intermedio en un lenguaje de programación puede generarse de diversas
maneras, dependiendo del diseño del compilador o del intérprete.
Árbol de sintaxis abstracta (AST): este enfoque analiza el código original y crea un
árbol de sintaxis abstracta para representar la estructura del programa. Luego, este
árbol se utiliza como base para la generación de código intermedio. Los nodos del árbol
representan operaciones y expresiones, mientras que los bordes representan las
relaciones entre ellas.
Código de tres direcciones: este es un formato de código intermedio que utiliza solo
instrucciones que operan en hasta tres operandos. Por ejemplo, una instrucción en un
código de tres direcciones podría ser "a = b c", donde "a", "b" y "c" son los operandos.
Este formato generalmente es fácil de entender y manipular para el compilador.
Código de máquina virtual: algunos lenguajes de programación, especialmente los
lenguajes interpretados, utilizan una máquina virtual para ejecutar su código. En este
caso, el código intermedio puede ser un conjunto de instrucciones para una máquina
virtual específica, similar al ensamblador, pero en un nivel superior de abstracción.
Representación intermedia del gráfico de flujo de control (CFG): en este enfoque, el
flujo de control de un programa se representa mediante un gráfico dirigido, donde los
nodos representan bloques de código de programa y los bordes representan posibles
transferencias de control entre ellos. Este tipo de representación es útil para la
optimización de código y el análisis estático.
Forma de programación normal (NPF): en este enfoque, el código del programa se
transforma en un paradigma específico que puede manipularse y optimizarse más
fácilmente. Por ejemplo, la forma normal de programación (PNF) es una forma de
código intermedio que simplifica expresiones complejas en el código original.
Características.
1. Independencia de la plataforma: El código intermedio suele ser independiente de
la plataforma.
2. Abstracción de alto nivel: El código intermedio suele ser una representación más
abstracta del código fuente original.
3. Facilidad de análisis y optimización: El código intermedio está diseñado para ser
fácil de analizar y optimizar.
4. Compacto y eficiente: Aunque el código intermedio es una representación
intermedia, suele ser más compacto y eficiente que el código fuente original.
5. Soporte para características del lenguaje: El código intermedio debe ser capaz
de representar todas las características del lenguaje de programación original.
6. Legibilidad y mantenibilidad: Aunque el código intermedio está diseñado para ser
procesado por herramientas de compilación y optimización, también es
importante que sea legible y comprensible para los desarrolladores.
Ventajas.
• Portabilidad: el código intermedio permite que los programas compilados o
interpretados se ejecuten en diferentes plataformas sin necesidad de volver a
compilarlos.
• Optimizaciones globales: al procesar código intermedio, el compilador tiene la
opción de aplicar optimizaciones que afectan a todo el programa, en lugar de
optimizaciones que se limitan a una sola pieza de código.
• Facilidad de mantenimiento: el código intermedio proporciona una
representación simplificada del programa original, lo que facilita su comprensión
y mantenimiento.
• Análisis estático: el uso de código intermedio facilita la realización de análisis
estáticos en su programa, como detección de errores, verificación de tipos y
reglas de estilo de aplicación.
• Separación de fases de compilación: El uso de códigos intermedios permite una
clara separación entre las fases de análisis y síntesis del compilador.
Desventajas.
Gastos generales de compilación o tiempo de ejecución: generar y procesar código
intermedio puede agregar gastos generales cuando se compila o ejecuta un programa.
Complejidad adicional: la implementación de código intermedio aumenta la complejidad
del compilador o intérprete, lo que puede dificultar su implementación y mantenimiento.
Pérdidas potenciales de optimización: si bien el código intermedio brinda la capacidad
de aplicar optimizaciones globales, también puede crear obstáculos para
optimizaciones específicas que son más eficientes en el código fuente original.
Se requiere almacenamiento adicional: el código intermedio debe almacenarse en la
memoria o en el disco durante la compilación o ejecución, lo que puede requerir
recursos de almacenamiento adicionales.