| INSTITUTO POLITÉCNICO NACIONAL ESCUELA SUPERIOR DE CÓMPUTO |

Introducción | Contenido | Bibliografía

Introducción
Contenido
UNIDAD I
UNIDAD II
UNIDAD III
UNIDAD IV
UNIDAD V
UNIDAD VI
UNIDAD VII Introducción 7.1 Diseño, implementación y administración de la tabla de símbolos 7.2 Implantación de bloques y tipos de datos 7.3 Especificación de alcance de variables

7.4 Funciones y procedimientos

7.5 Registros de activación

7.6 Paso de parámetros

7.7 Llamada por valor

7.8 Llamada por referencia

UNIDAD VIII
UNIDAD IX
PROBLEMARIO
Bibliografía

7.3 Especificación de alcance de Variables

> Un compilador debe comprobar si el programa fuente sigue tanto las convenciones sintácticas como las semánticas del lenguaje fuente. Esta comprobación, llamada comprobación estática (para distinguirla de la comprobación dinámica que se realiza durante la ejecución del programa objeto), garantiza la detección y comunicación de algunas clases de errores de programación. Los ejemplos de comprobación estática incluyen:

> Comprobación de tipos. Un compilador debe informar de un error si se aplica un operador a un operando incompatible; por ejemplo, si se suman una variable tipo matriz y una variable de función.

> Comprobación del flujo del control. Las proposiciones que hacen que el flujo del control abandone una construcción deben tener algún lugar a dónde transferir el flujo de control. Por ejemplo, una proposición break en C hace que el control abandone la proposición que la engloba, while, for o switch más cercana; si dicha proposición englobadora no existe, ocurre un error.

> Comprobación de unicidad. Hay situaciones en que se debe definir un objeto una vez exactamente. Por ejemplo, en Pascal, un identificador debe declararse de forma única, las etiquetas en una proposición case deben ser diferentes y no se pueden repetir los elementos en un tipo escalar.

> Comprobaciones relacionadas con nombres. En ocasiones, el mismo nombre debe aparecer dos o más veces. Por ejemplo, en Ada, un lazo o bloque puede tener un nombre que aparezca al principio y al final de la construcción. El compilador debe comprobar que se utilice el mismo nombre en ambos sitios.

> Las variables que representan expresiones de tipos permiten considerar tipos desconocidos. Se utilizarán las letras griegas α, β, … para variables de tipo en las expresiones de tipos.
> Una aplicación importante de las variables de tipo es la comprobación del uso consistente de identificadores en un lenguaje que no exija que los identificadores se declaren antes de ser utilizados. Una variable representa el tipo de un identificador no declarado. Por ejemplo, observando el programa se puede saber si el identificador no declarado se utiliza como un entero en una proposición y como una matriz en otra. Dicho uso inconsistente puede considerarse como un error. Por otra parte, si la variable siempre se utiliza como entero, entonces no sólo se ha garantizado un uso consistente: a partir del proceso se ha llegado a la conclusión de cuál debe ser su tipo.

> La inferencia de tipos es el problema de determinar el tipo de una construcción de lenguaje a partir del modo en que se usa. Este término se aplica a menudo al problema de inferir el tipo de una función a partir de su cuerpo.

> Ejemplo 1. Las técnicas para inferencia de tipos pueden aplicarse a programas en lenguajes como C y Pascal para completar la información sobre los tipos que falta en el momento de la compilación. El siguiente fragmento de código siguiente describe el procedimiento mlista, que tiene un parámetro p que es en si un procedimiento. Todo lo que sabe al observar la primera línea del procedimiento mlista es que p es un procedimiento: en concreto, no se conocen el número ni los tipos de los argumentos que toma p. En los manuales de referencia de C y Pascal admiten dichas especificaciones incompletas del tipo de p.

> type enlace = ↑nodo;
> procedure mlista(aplista: enlace; procedure p);
> begin
> while aplista <> nil do begin
> p(aplista);
> aplista := aplista↑.siguiente
> end
> end;

> El procedimiento mlista aplica el parámetro p a todos los nodos de una lista enlazada. Por ejemplo, se puede utilizar p para inicializar o imprimir el entero contenido en un nodo. A pesar de que no se especifican los tipos de los argumentos de p, se puede inferir del uso de p en la expresión p(aplista) que el el tipo de p debe ser:

> enlace → vacio

> Cualquier llamada de mlista con un parámetro de procedimiento que no tenga este tipo es un error. Se puede considerar un procedimiento como una función que no devuelve un valor, de modo que su tipo resultante es vacio.

> Las técnicas para la inferencia de tipos y para la comprobación de tipos tienen mucho en común. En ambos casos, se trata de expresiones de tipos que contienen variables.

> Ejemplo 2. En el siguiente pseudoprograma se puede inferir un tipo para la función polimórfica desref. La función desref tiene el mismo efecto que el operador de Pascal ↑ para des referenciar apuntadores.

> funion desref(p);
> begin
> return p↑
> end;

> Cuando se observa la primera línea:

> función desref(p);

> No se sabe nada del tipo de p, de modo que se representa mediante la variable de tipo β. Por definición, el operador posfijo ↑ toma un apuntador a un objeto, y devuelve el objeto. Como el operador ↑ se aplica a p en la expresión p↑, lógicamente p debe ser un apuntador a un objeto de tipo desconocido α, así que:

> β = pinter(α)

> donde α es otra variable de tipo. Además, la expresión p↑ tiene tipo α, de modo que se puede escribir la expresión de tipo:

> para cualquier tipo α, pointer(α) → α
> para el tipo de la función desref.

> Atrás Siguiente

##### Introducción / Contenido / Unidad I / Unidad II / Unidad III / Unidad IV / Unidad V / Unidad VI / Unidad VII / Unidad VIII / Unidad IX / Problemario / Bibliografía

##### Inicio

##### Créditos

José Sánchez Juárez, Andrés Ortigoza Campos, Fabiola Ocampo Botello