Want to make creations as awesome as this one?

Transcript

Comprobaciones de tipos en expresiones.

Indice

Conclusión

Introduccion

Comprovacion estatica

Código de tres direcciones

Comprobación de tipos

L-value y R-value

A través de este presentacion se mencionaran conceptos sobre los distintos tipos de analizadores dentro de la programación, ya que son muy importantes en cuanto al tema de la COMPILACION (compilador). Más que nada se trata sobre la fase del análisis de un compilador ya que este se descompone en piezas o componentes y produce una representación interna, la cual es conocida como código intermedio.

Introducción

Comprobación estática

Las comprobaciones estáticas son comprobaciones de consistencia que se realizan durante la compilación. No solo aseguran que un programa pueda compilarse con éxito, sino que también tienen el potencial para atrapar los errores de programación en forma anticipada, antes de ejecutar un programa. La comprobación estática incluye lo siguiente:

  • Comprobación sintáctica. Hay más en la sintaxis que las gramáticas. Por ejemplo, las restricciones como la de que un identificador se declare cuando menos una vez en un alcance.
  • Comprobación de tipos. Las reglas sobre los tipos de un lenguaje aseguran que un operador o función se aplique al número y tipo de operandos correctos. Si es necesaria la conversión entre tipos, por ejemplo, cuando se suma un entero a un número de punto flotante, entonces el comprobador de tipos puede insertar un operador en el árbol sintáctico para representar esa conversión.

L-value y R-value

consideraremos algunas comprobaciones estáticas simples que pueden realizarse durante la construcción de un árbol sintáctico para un programa fuente. En general, tal vez haya que realizar comprobaciones estáticas complejas, para lo cual primero hay que construir una representación intermedia y después analizarla.

Hay una diferencia entre el significado de los identificadores a la izquierda y el lado derecho de una asignación. En cada una de las siguientes asignaciones: i = 5; i = i + 1; el lado derecho especifica un valor entero, mientras que el lado izquierdo especifica en dónde se va a almacenar el valor. Los términos l-value y r-value se refieren a los valores que son apropiados en los lados izquierdo y derecho de una asignación, respectivamente. Es decir, los r-value son lo que generalmente consideramos como "valores", mientras que los l-value son las ubicaciones.

Comprobación de tipos

La comprobación de tipos asegura que el tipo de una construcción coincida con lo que espera su contexto. Por ejemplo, en la siguiente instrucción if: if (expr) instr se espera que la expresión expr tenga el tipo boolean. Utilizando el atributo tipo para el tipo de una expresión, dejemos que E consista de rel aplicado a E1 y E2. El tipo de E puede comprobarse al momento de construir su nodo, mediante la ejecución de código como el siguiente: if (E1.tipo == E2.tipo) E.tipo = boolean;else error;

La idea de relacionar los tipos actuales con los esperados se sigue aplicando, aún en las siguientes situaciones:

• Coerciones. Una coerción ocurre cuando el tipo de un operando se convierte en forma automática al tipo esperado por el operador. La definición del lenguaje especifica las coerciones disponibles. Por ejemplo, la regla actual para rel que vimos antes podría ser que E.tipo y E2.tipo puedan convertirse al mismo tipo. En tal caso, sería legal comparar, por decir, un entero con un valor de punto flotante.

• Sobrecarga. El operador + en Java representa la suma cuando se aplica a enteros; significa concatenación cuando se aplica a cadenas.Por ende, + está sobrecargado en Java para determinar el significado de un operador sobrecargado, hay que considerar los tipos conocidos de sus operandos y resultados. Por ejemplo, sabemos que el + en z = x + y es concatenación si sabemos que cualquiera de las variables x, y oz es de tipo cadena.

Código de tres direcciones

Una vez que se construyen los árboles de sintaxis, se puede realizar un proceso más detallado de análisis y síntesis mediante la evaluación de los atributos, y la ejecución de fragmentos de código en los nodos del árbol. Para ilustrar las posibilidades, vamos a recorrer árboles sin- tácticos para generar código de tres direcciones. En específico, le mostraremos cómo escribir funciones para procesar el árbol sintáctico y, como efecto colateral, emitir el código de tres direcciones necesario.

Instrucciones de tres direcciones

El código de tres direcciones es una secuencia de instrucciones de la forma x = y op z en donde x, y y z son nombres, constantes o valores temporales generados por el compilador; y op representa a un operador. Manejaremos los arreglos usando las siguientes dos variantes de instrucciones: x [y]=z x = y [z]

El tema de la compilación en la programación es muy atractivo, ya que simplemente todo esto son pruebas muy importantes para un programador por que no es muy fácil de realizar estos tipos de analizadores; cada uno de ellos conlleva su grado de dificultad y es una buena prueba para poder sobresalir. En particular la programación no es tan complicada como se ve, si no que de uno mismo debe salir las ganas para poder entenderla y así ser buenos profesionistas.

Conclusión