En el modelo de análisis-síntesis de un compilador, el front-end de un compilador traduce un programa fuente en un código intermedio independiente, luego el back-end del compilador usa este código intermedio para generar el código de destino (que puede ser entendido por la máquina). ). Los beneficios de usar código intermedio independiente de la máquina son:
- Debido al código intermedio independiente de la máquina, se mejorará la portabilidad. Por ejemplo, supongamos que si un compilador traduce el lenguaje de origen a su lenguaje de máquina de destino sin tener la opción de generar código intermedio, entonces para cada nueva máquina se requiere un compilador nativo completo. Porque, obviamente, hubo algunas modificaciones en el propio compilador según las especificaciones de la máquina.
- Se facilita la reorientación.
- Es más fácil aplicar la modificación del código fuente para mejorar el rendimiento del código fuente mediante la optimización del código intermedio.
If we generate machine code directly from source code then for n target machine we will have optimizers and n code generator but if we will have a machine-independent intermediate code, we will have only one optimizer. Intermediate code can be either language-specific (e.g., Bytecode for Java) or language. independent (three-address code). The following are commonly used intermediate code representations:
- Notación de sufijo: también conocida como notación polaca inversa o notación de sufijo. La forma ordinaria (infijo) de escribir la suma de a y b es con un operador en el medio: a + b. La notación de posfijo para la misma expresión coloca al operador en el extremo derecho como ab +. En general, si e1 y e2 son expresiones posfijas y + es cualquier operador binario, el resultado de aplicar + a los valores denotados por e1 y e2 es una notación posfija por e1e2 +. No se necesitan paréntesis en la notación de sufijo porque la posición y la aridad (número de argumentos) de los operadores permiten solo una forma de decodificar una expresión de sufijo. En la notación sufijo, el operador sigue al operando.
Ejemplo 1: La representación de posfijo de la expresión (a + b) * c es: ab + c *
Ejemplo 2:La representación de postfijo de la expresión (a – b) * (c + d) + (a – b) es: ab – cd + *ab -+
Leer más: Infijo a Postfijo
- Código de tres direcciones: una declaración que involucra no más de tres referencias (dos para operandos y una para resultado) se conoce como declaración de tres direcciones. Una secuencia de tres instrucciones de dirección se conoce como código de tres direcciones. La declaración de tres direcciones tiene la forma x = y op z, donde x, y y z tendrán dirección (ubicación de memoria). A veces, una declaración puede contener menos de tres referencias, pero todavía se denomina declaración de tres direcciones.
Ejemplo: Los tres códigos de dirección para la expresión a + b * c + d : T 1 = b * c T 2 = a + T 1 T 3 = T 2 + d T 1 , T 2 , T 3 son variables temporales.Hay 3 formas de representar un Código de tres direcciones en el diseño del compilador:
i) Cuádruples
ii) Triples
iii) Triples indirectos
Leer más: Código de tres direcciones
- Árbol de sintaxis: un árbol de sintaxis no es más que una forma condensada de un árbol de análisis. Los Nodes de operador y palabra clave del árbol de análisis se mueven a sus padres y una string de producciones únicas se reemplaza por el enlace único en el árbol de sintaxis. Los Nodes internos son operadores y los Nodes secundarios son operandos. Para formar un árbol de sintaxis, coloque paréntesis en la expresión, de esta manera es fácil reconocer qué operando debe ir primero.
Ejemplo: x = (a + b * c) / (a – b * c)
Publicación traducida automáticamente
Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA