Está en la página 1de 11

DIRECCIÓN ACADÉMICA

Formato de entrega de evidencias


FO-205P11000-14

División: (1) Ingeniería en sistemas computacionales Grupo: (2) 361-M

Asignatura: (3) Lenguajes y Autómatas II Docente: (4) M. en T.I Brian Antonio Mejía Díaz
Nombre y número de control: (5) Martínez del Razo Areli 213107177
Fecha de entrega: (6) 18/04/2024
Competencia No.: (7) 2 Descripción: (8) Diseña las reglas para traducir el código fuente a un
código intermedio
Indicador de alcance: (9) A. Se adapta a situaciones y contextos complejos.
B. Hace aportaciones a las actividades académicas desarrolladas.
Evidencia de aprendizaje: (10) reporte de investigación
Generación
de código
Intermedio
INTRODUCCIÓN

Generar código intermedio es un paso importante en el proceso de compilación


del programa. Actúa como puente entre el código fuente escrito por el
programador y el código ejecutable de la máquina. Esta fase se encuentra entre
el análisis sintáctico y semántico del programa y la generación de código de
destino específico para la arquitectura de la computadora de destino.
El objetivo principal de la generación de código intermedio es simplificar y
estructurar el código fuente original para facilitar el análisis, optimización y
transformación posteriores. Esta fase crea estructuras de datos intermedias que
representan operaciones y datos del programa en una forma más abstracta que
el compilador puede manipular fácilmente.
Las notaciones son formas de representar expresiones matemáticas o lógicas.
Las expresiones se representan mediante diferentes símbolos en el contexto en
el que se genera el barniz y luego se transforma en barniz. Estos símbolos
incluyen prefijo, infijo y sufijo, cada uno de los cuales tiene sus propias
características y usos en la generación de código intermedio.
Una representación de código intermedio es una forma en que se puede
estructurar y representar el código intermedio generado a partir del código
fuente. Estas representaciones incluyen notaciones polacas, triplos y
cuádruplos, cada una con su propia notación y métodos para manipular
códigos intermedios. En resumen, la generación de código intermedio y los
símbolos y representaciones asociados son aspectos críticos del proceso de
compilación de programas, y comprender cómo funcionan es esencial para
desarrollar compiladores eficientes y eficaces.
1.1 Notaciones:

1.1 PREFIJAS:
La notación prefija, también conocida como notación de prefijo o notación de
prefija, es una notación en lógica, aritmética y álgebra. Su rasgo característico
es que el operador se coloca en el lado izquierdo del operando. Si la paridad del
operador (el número de argumentos necesarios para que dicho operador o
función evalúe) es fija, el resultado es una sintaxis que carece de paréntesis u
otros símbolos de agrupación y aún se puede analizar sin ambigüedades.
La notación infija es una representación común de fórmulas aritméticas y
lógicas en las que los operadores se escriben entre los operandos en los que
operan (p. ej. 2 +2) Utilice el estilo infijo.

Una computadora no puede analizarlo tan fácilmente como la notación prefija


(por ejemplo, 2 2) o la notación de sufijo (por ejemplo, 2 2) (Esta es la parte del
compilador que transforma su entrada en un árbol de derivación). 2 2), aunque
muchos lenguajes de programación lo utilizan debido a su familiaridad.
La notación infija, a diferencia de la notación de prefijo o postfijo, los operandos
y grupos de operandos deben estar entre paréntesis para indicar el orden en
que se realizan las operaciones. Sin paréntesis, las reglas de precedencia
determinan el orden de las operaciones.
La expresión o notación de prefija indica que el operador precede al operando.
- No requiere paréntesis para indicar precedencia de operadores porque es una
operación.
1.1 Notaciones:

1.2 INFIJA:
Una designación común. El orden es primer operando, operador, segundo
operando.
El problema con la notación infija es que el orden de evaluación es ambiguo en
una expresión con múltiples operadores. Por ejemplo, la expresión 8/4/2 se
puede interpretar como (8/4) /2 u 8/ (4/2). Otros símbolos no sufren este
problema.
Para resolver estas ambigüedades, se agregó una nueva regla llamada
precedencia de operadores. Cuando dos operadores compiten por el mismo
operando, gana el operador con mayor precedencia y gana el operador con la
misma precedencia.

Las reglas de precedencia habituales son que los operadores de división y


producto tienen igual precedencia y precedencia sobre los demás operadores,
y los operadores de suma y resta tienen igual precedencia y precedencia sobre
el operador de igualdad. Por lo tanto, 8/4/2 se evalúa como (8/4) /2 y 2 3*4 se
evalúa como 2 (3*4).
Si queremos cambiar el orden de evaluación, podemos usar paréntesis para
agrupar las partes de la expresión.
No es necesario utilizar paréntesis en las otras notaciones porque siempre
podemos especificar el orden exacto de evaluación sin ambigüedad.
1.1 Notaciones:

1.3 POSFIJA:
En notación Posfija, el operador sigue al operando. Por ejemplo, "2 3"
significa "2 3". Esta notación es particularmente útil para la generación
de código intermedio porque elimina la necesidad de paréntesis y
reglas de precedencia, simplificando así el análisis y la traducción de
expresiones.
La notación postfija pone el operador al final de los dos operandos, por
lo que la expresión queda:
El sufijo ab 5 utiliza una estructura apilada LIFO (ab 5-último-primero
en salir), que es la estructura más utilizada en la implementación.
También conocido como pulido inverso, se utiliza para expresar
expresiones que no requieren paréntesis.
Como sugiere el nombre, se refiere a la posición que ocupa el operador
después del operando.
- La operación de sufijo no es la inversa directa de la operación de
prefijo correspondiente: (A B) *C AB C*
Representaci
ones de
Código
Intermedio
1.1 Notaciones:

1.1 POLACA:
Aritmética Una expresión que suma los números uno y dos se escribe en
notación de prefijo como "1 2" en lugar de "1 2". En expresiones más complejas,
el operador aún precede a su operando, pero el operando en sí puede ser una
expresión no trivial que contenga su propio operador. Por ejemplo, la expresión
está escrita en notación infija tradicional.
(5 - 6) * 7
puede ser escrito en prefijo como
* (- 5 6) 7
o simplemente
*-567
Dado que todos los operadores aritméticos simples son binarios (al menos en
un contexto aritmético), cualquier representación de sus prefijos es inequívoca
y no requiere que se inserten símbolos de agrupación en las expresiones de
prefijo. En el ejemplo anterior, se requieren los corchetes de la versión infija. Si
los movemos:
5 - (6 * 7)
o simplemente los quitamos:
5-6*7
El proceso de resta se retrasa hasta que se hayan leído ambos operandos de
resta (es decir, el producto de 5, 6 y 7). Como ocurre con cualquier notación, la
expresión más interna se evalúa primero, pero en una notación de prefijo este
"interior" se puede expresar mediante secuenciación en lugar de agrupación.
1.2 Notaciones:

1.2 TRIPLOS:
Se han utilizado varias representaciones intermedias a lo largo de la historia de
los compiladores, como la siguiente representación de código intermedio de 3
árboles de direcciones, 2 para los operandos y uno para la ubicación del
resultado.
Esta clase incluye una gran cantidad de representaciones diferentes, entre las
que podemos encontrar cuádruples y triples.
La principal diferencia entre estas notaciones y la notación postfija es que
contienen referencias precisas a los resultados de cálculos intermedios,
mientras que en la notación postfija los resultados están implícitos cuando se
expresan en la pila.
La diferencia entre triples y cuádruples es que para triples el valor intermedio se
refiere al número de tripletas que lo crearon, mientras que para cuádruples
requiere que tengan nombres implícitos. Los triples tienen la ventaja obvia de
ser más consistentes, pero dependen de su ubicación y hacen que los cambios
en el código de optimización sean más complicados.
Ejemplo:
W * X + (Y + Z) 1.
*, W, X 2. +, Y, Z 3. +, (1), (2)
Control de flujo:
IF X>Y THEN
Z=X ELSE
Z=Y+1 1. >, X, Y
1.1 Notaciones:

1.2 CUADRUPLOS:
Es una estructura tipo registro con cuatros campos que se llaman: Operador
Operando1 Operando2 Resultado Donde operando1, operando2 y resultado
pueden ser constantes, identificadores y variables temporales definidos por el
compilador mientras que operador representa una operación arbitraria.
Los Cuadruplos ayudan en muchas aplicaciones optimizadas, pero necesita un
algoritmo para reutilizar variables temporales (reutilizar registros del
procesador).
Ejemplo:
(A+B)
*(C+D)-E
+, A, B, T1 +
, C, D, T2
*, T1, T2, T3 -,
T3, E, T4
Un cuádruplo es una extensión de la representación triplete que agrega un
campo adicional al resultado de una operación. La forma general de un quad es
(arriba, arg1, arg2, resultado). Esta notación es común en la generación de
código intermedio y es útil para la asignación del bloc de notas y la gestión de
memoria.
CONCLUCION:
Generating intermediate code, symbols and associated
representations is a critical aspect of the program compilation
process. Intermediate code generation involves the creation of
code that is easier to resolve than the original source code, but still
retains the semantics of the program. Symbols (including prefixes,
infixes and suffixes) provide different ways of representing
mathematical or logical expressions, and each has its own
application for generating intermediate code. On the other hand,
intermediate code representations, such as Polish notation, triples
and quadruples, provide structures for representing and
manipulating intermediate code from the original code. In
summary, understanding these concepts is critical to developing
efficient and effective compilers.

In summary, intermediate code generation is an essential part of


program compilation that can transform the original source code
into a simpler, more structured form, making it easier to process
and optimize. By using appropriate intermediate code generation
and manipulation techniques, compilers can produce more
efficient and optimized programs, thus contributing to the
development of high-quality, high-performance software.

Actividad 2 - Lenguajes Y Autómatas II (no date) Studocu. Available at:


https://www.studocu.com/es-mx/document/instituto-tecnologico-superior-de-
huauchinango/lenguajes-y-automatas-ii/actividad-2/18675080 (Accessed: 18 April 2024).

También podría gustarte