Sei sulla pagina 1di 16

S. E. P.

D. G. t. n. m.

INSTITUTO TECNOLGICO
DEL ISTMO

ING. SISTEMAS COMPUTACIONALES.

MATERIA:
LENGUAJES Y AUTOMATAS II

TEMA:
Anlisis de tipo.
DOCENTE:
Lic. Posada

ALUMNO:
Lpez Bortolotti Jesus Arturo.

Semestre: 7 Grupo: O

HEROICA CIUDAD DE JUCHITN DE ZARAGOZA, OAXACA


.A 3 DE NOVIEMBRE 2016

NDICE

Introduccin.....3
Anlisis de tipo....4
1.1 Definiciones de tipo...4
1.2 Beneficios de tipo......5
1.3 Sistemas de tipo.....5
1.4 Comprobacin esttica y dinmica de tipos......6
1.5 Declaracin y comprobacin de tipos.......8
1.6 Equivalencia de tipos...10
1.7 Conversiones de tipos...12
1.8 Sobrecarga de funciones y operadores..12
1.9 Funciones polimrficas.13
Conclusin...14
Recomendacin,..15
Bibliografa..16

INTRODUCCIN.
pg. 2

En esta investigacin se pretende mostrar el anlisis de tipos de un compilador,


con el cual se tiene que verificar el anlisis sintctico y semntico del programa fuente y
posteriormente poder generar el codigo.
Un lenguaje de programacin est asociado a varias reglas semnticas el cual
proporciona el significado a una sentencia o instruccin y estn varan dependiendo de
los atributos que componen dicha regla, para ello llevan a cabo un conjunto de anlisis
de tipos las cuales ayudan al compilador a ver de que coincida el tipo de construccin de
dicho programa con el previsto en su contexto.
Existen dos tipos de anlisis esttica y dinmica, la dinmica se realiza durante la
ejecucin del programa objeto y la esttica garantiza la deteccin y comunicacin de
algunas clases de errores de programacin.

ANLISIS DE TIPO.
pg. 3

Un comprobador de tipos o anlisis de tipo se asegura de que el tipo de una


construccin coincida con el previsto en su contexto.

1.1 DEFINICIN DE TIPO.


Existen tres modos de definir el concepto de tipo, en funcin de distintos puntos de
vista, todos ellos compatibles entre s:
Denotacional: Desde este punto de vista, un tipo es un conjunto de valores.
Un valor es de un tipo determinado si pertenece al conjunto denotado por dicho tipo.
Una variable u objeto es de un tipo dado si puede garantizarse que sus posibles valores
estn siempre dentro del conjunto descrito por su tipo.
Este punto de vista del concepto de tipo es definido por uno de los mtodos ms
comunes de especificar la semntica de un lenguaje: la semntica denotacional ( 1.1),
en la que un conjunto de valores suele definirse como un dominio.
Los tipos de un lenguaje de programacin son dominios en la formalizacin
denotacional. Este concepto de tipo est enfocado a la representacin de sus posibles
valores, es decir, a su significado o valor. De este modo, la definicin denotacional de
tipo est muy ligada a la fase de generacin de cdigo, ya que en esta fase se genera un
programa de salida con igual semntica que el programa de entrada, pero expresada en
otro lenguaje de programacin.
Basado en la abstraccin: Desde este punto de vista, un tipo es una interfaz consistente
en un conjunto de operaciones que se pueden realizar sobre ste. Estas operaciones
sern aplicables a una variable u objeto de dicho tipo, y poseern una semntica bien
definida.
Este modo de ver los tipos est especialmente dirigido a la fase de anlisis semntico de
un procesador de lenguaje. Esta fase ha de comprobar, a partir del tipo de una expresin,
que las operaciones aplicadas sobre sta sean correctas.
La semntica de cada una de las operaciones, est relacionada con la fase de generacin
de cdigo.
Constructivo: Un tipo es definido como un conjunto de tipos simples53 (tambin
llamados predefinidos, bsicos o primitivos), o bien un tipo compuesto o construido
formado a partir de otros tipos. Un tipo simple es un tipo atmico cuya estructura
interna no puede ser modificada por el programador (integer, float, boolean...). Un tipo
construido o compuesto es un tipo construido por el programador a partir de un
constructor de tipos (record, array, set...) aplicado a otros tipos bsicos o construidos.

pg. 4

Este modo de ver los tipos posee principalmente un carcter interno al compilador,
indicando un modo de representarlos para implementar las distintas fases del procesador
de lenguaje. Como veremos en breve, el punto de vista constructivo de los tipos es
representado por las expresiones de tipo de un compilador.
1.2 BENEFICIOS DEL EMPLEO DE TIPOS.
Incluso antes introducir las distintas definiciones de tipo de un lenguaje de
programacin, ser interesante preguntarnos por qu existen los tipos y qu tiene de
positivo su empleo:
Fiabilidad. La comprobacin esttica de tipos reduce el nmero de errores que un
programa puede generar en tiempo de ejecucin. ste es el beneficio ms obvio ya
que, gracias a la deteccin temprana de los errores, el programador podr reparar
stos de un modo casi inmediato y no cuando se est ejecutando la aplicacin,
pudiendo incluso haber sido implantada.
Abstraccin: Otra ventaja de emplear tipos en los lenguajes de programacin es que
su uso fuerza al programador a dividir el problema en diversos tipos de mdulos, de
un modo disciplinado. Los tipos identifican la interfaz de los mdulos (funciones,
clases, paquetes o componentes) proporcionando una simplificacin de los servicios
que ofrece cada mdulo; un tipo de contrato parcial entre los desarrolladores del
mdulo y sus clientes.
El estructurar sistemas complejos en distintos mdulos con interfaces claras hace
que los diseos puedan poseer una mayor abstraccin, de modo que las interfaces
puedan ser diseados y debatidos de un modo independiente a su posterior
implementacin.
Legibilidad: Un tipo de una entidad (variable, objeto o funcin) transmite
informacin acerca de lo que se intenta hacer con ella, constituyendo as un modo de
documentacin del cdigo.
Eficiencia: Como hemos comentado en la propiedad anterior, una entidad de un
programa declarada con un tipo especfico indica informacin relativa a lo que se
intenta hacer con ella. De este modo, al conocer el tipo de las construcciones del
lenguaje, se podr generar cdigo de carcter ms especfico y eficiente que si no
tuvisemos esa informacin. En el caso de no poseer tipos en tiempo de
compilacin, debera descubrirse la ejecucin especfica dinmicamente con la
consecuente prdida de eficiencia.
1.3 SISTEMAS DE TIPOS.
Un sistema de tipos es un conjunto de reglas para asignar expresiones de tipos a las
distintas construcciones de un lenguaje. Para ello, un sistema de tipos deber definir sus
expresiones de tipos, asignar stas a las distintas construcciones sintcticas del lenguaje,
y comprobar que las reglas semnticas de los tipos del lenguaje se cumplan ante
cualquier programa de entrada. Si no fuere as, generar un error de tipo (type clash),
continuando el procesamiento del programa o finalizando, en funcin del tipo del
mecanismo de manejo de errores que implemente.

pg. 5

Un comprobador de tipos de un lenguaje de programacin deber implementar un


sistema de tipos. En las reglas definidas por un sistema de tipos se deber tener en
cuenta conceptos como equivalencia, compatibilidad, conversin e inferencia de tipos.

EXPRESIONES DE TIPOS.
El tipo de una construccin de un lenguaje se denotar mediante una expresin de
tipo. De manera informal, una expresin de tipo es, o bien un tipo bsico o se forma
aplicando un operador llamado constructor de tipos a otras expresiones de tipos. Los
conjuntos de tipos y constructores bsicos dependen del lenguaje que deba
comprobarse. Cada lenguaje de programacin requerir unas expresiones de tipos
adecuadas a sus caractersticas. A continuacin, a modo de ejemplo, se definen las
expresiones de tipos ms comunes:
Tipos simples:
Real.
Char.
Boolean.
Integer.
Tipos especiales:
Void: Indica que no se puede asociar una expresin de tipo correcta.
Error: Indica que una construccin del lenguaje es correcta, pero no tiene ningn
tipo asociado. til en comprobacin de sentencias.
CONSTRUCTORES DE TIPO.
Permiten formar tipos complejos a partir de otros ms simples. La semntica de cada
lenguaje tiene asociada unos constructores de tipos propios. En general, en los lenguajes
de programacin se definen los siguientes constructores.
Matrices: Si T es una expresin de tipos, entonces array(R, T) es tambin una expresin
de tipos que representa a una matriz de rango R de elementos de tipo T. Ejemplo: Sea
el segmento de cdigo C: Char a [10]
Productos: Sea T1 y T2 expresiones de tipos, T1 x T2 es una expresin de tipos que
representa al producto cartesiano de los tipos T1 y T2. A fin de simplificar
consideraremos que el constructor u operador de tipos x es asociativo por la izquierda.
Registros: Sea un registro formado por los campos u1, u2... uN, siendo cada uno de
ellos de los tipos T1, T2... TN, entonces, la expresin de tipos asociada al conjunto es:
record ( (u1:T1) x (u2:T2) x ... x (uN:TN) )
Punteros: Si T es una expresin de tipos, entonces pointer (T) es una expresin de tipos
que representa a un puntero a una posicin de memoria ocupada por un dato de tipo T.
Funciones: Sean T1, T2... TN, las expresiones de tipos asociadas a los segmentos de
cdigo correspondientes a los argumentos de una funcin, y sea T el tipo devuelto por la
funcin. Entonces, la expresin de tipos asociada a la funcin es: ((T1xT2 x... xTN)
-> T).
1.4 COMPROBACIN ESTTICA Y DINMICA DE TIPOS
Se dice que la comprobacin realizada por un compilador es esttica, mientras que la
pg. 6

comprobacin hecha al ejecutar el programa objeto se denomina dinmica. En principio,


cualquier verificacin se puede realizar dinmicamente, si el cdigo objeto carga el tipo
de un elemento con el valor de dicho elemento.

RECUPERACIN DE ERRORES.
Como la comprobacin de tipos tiene la capacidad de descubrir errores en los
programas, es importante que un comprobador de tipos haga algo razonable cuando se
descubre un error. Como mnimo, el compilador debe informar de la naturaleza y la
posicin del error. Es mejor que el comprobador de tipos se recupere de los errores, para
que pueda comprobar el resto de la entrada. Como el manejo de errores afecta a las
reglas de comprobacin de tipos, tiene que disearse como parte del sistema de tipos
desde el principio; las reglas tienen que servir para tratar los errores.
Un programa puede tener los siguientes tipos de errores en las distintas etapas:
Lxico: nombre de una incorrecta identificacin.
Sintctico: falta un punto y coma o desequilibrada entre parntesis.
Semntica: incompatible asignacin de valor.
Lgico: cdigo no accesible, bucle infinito.
Hay cuatro errores comunes de las estrategias de recuperacin que se pueden
implementar en el analizador para lidiar con los errores en el cdigo.
Modo de emergencia
Cuando el analizador encuentra un error en la declaracin, se ignora el resto de la
declaracin no procesando entrada de entrada errnea de delimitador, como punto y
coma. Esta es la manera ms sencilla de recuperacin de errores y, adems, impide que
el analizador de los bucles infinitos.
Modo Declaracin
Cuando el analizador encuentra un error, trata de tomar las medidas correctivas
necesarias para que el resto de los insumos de la declaracin que el analizador para
analizar. Por ejemplo, insertar la falta de un punto y coma, coma con una sustitucin
punto y coma, etc. Analizador los diseadores tienen que tener cuidado porque una
correccin inadecuada puede llevar a un bucle infinito.
pg. 7

Producciones Error
Alguno de los errores ms frecuentes se sabe que el compilador los diseadores que
pueden ocurrir en el cdigo. Adems, los diseadores pueden crear gramtica
aumentada que se va a utilizar, puesto que las producciones que generan
construcciones errneas cuando estos se encuentran errores.
Correccin Global
El analizador considera que el programa de la mano como un todo y trata de averiguar
en qu consiste el programa est destinado a hacer e intenta encontrar una coincidencia
ms cercana para que est libre de errores. Cuando una entrada errnea (declaracin) X
se alimenta, se crea un rbol de anlisis sintctico ms cercano algunos libres de error
declaracin Y. Esto puede permitir que el analizador para hacer cambios mnimos en el
cdigo fuente, pero debido a la complejidad (tiempo y espacio) de esta estrategia, no se
ha aplicado en la prctica.
1.5 DECLARACION Y COMPROBACION DE TIPOS.
Veremos un ejemplo sencillo del manejo de declaraciones de tipo y de comprobacin de
tipos en expresiones, funciones y sentencias.
Se usara un lenguaje simplificado:
Char
4 tipos bsicos. Boolean
Integer
Real

3 constructores.

Matrices
Puntero
Funciones (con 1 argumento)

Gramtica simplificada (no til para A. Sintctico).


ATRIBUTOS: tipo: expr. De tipo asociada a un nombre/fragmento de codigo.
(a) Declaracin de tipos.
Decl Decl; Decl;
Decl
Decl id: Tipo
Tipo char
Tipo boolean
Tipo integer
Tipo real

{TDS insertar (id. Texto, Tipo. Tipo)}


{Tipo. tipo = char}
{Tipo. tipo = boolean}
{Tipo. tipo = int}
{Tipo. tipo = real}
pg. 8

Tipo Tipo
{Tipo0.tipo = pointer (Tipo1.tipo}
Tipo array [num] of Tipo
{Tipo0.tipo =array (1...num.valor,
Tipo1.tipo}
(b) comprobacin de tipos en expresiones.
Exp num int
{Exp.tipo = integer}
Exp num real
{Exp.tipo = real}
Exp literal
{Exp.tipo = char}
Exp id
{Exp.tipo = TDS_obtenerTipo (id.texto)}
Operadores aritmticos y lgicos.
Exp Exp mod Exp
{Exp0.tipo = if (Exp1.tipo=integer) and
(Exp2.tipo=integer)
then integer
else error}
Exp Exp == Exp {Exp0.tipo = if (Exp1.tipo=integer) and
(Exp2.tipo=integer)
then boolean
Else error}
Acceso a matrices y punteros.
Exp Exp [Exp] {Exp0.tipo = if (Exp2.tipo=integer) and
(Exp1.tipo=array(S, T))
then T
else error}
Exp Exp {Exp0.tipo = if (Exp1.tipo=pointer (T))
then T
else error}
(c) Comprobacin de tipos en llamadas a funcin.
Exp id (Exp)
{tipoID = TDS obtenerTipo (id.texto)
Exp0.tipo = if (tipoID=S T) and
(Exp1.tipo=S)
then T
else error}
Con funciones de ms de un argumentos se deberan usar productos.
(d) Comprobacin de tipos en sentencias.
A las sentencias se les asociara el tipo Void si los tipos de las expresiones que contienen
son correctos.
Consideraremos: asignaciones, if simple, bucle while y secuencias.
Sent id:= Exp

{tipoID = TDS obtenerTipo(id.texto)


Sent.tipo = if (tipoID=Exp.tipo)
then void
else error}

Sent if Exp then Sent

{Sent0.tipo = if (Exp.tipo=boolean)
then Sent1.tipo
pg. 9

else error }
Sent while Exp do Sent

{Sent0.tipo = if (Exp.tipo=boolean)
then Sent1.tipo
else error }

Sent Sent ; Sent ;

{Sent0.tipo = if (Sent1.tipo=void) and


(Sent2.tipo=void)
then void
else error }

1.6 EQUIVALENCIA DE TIPOS.


Determinar si dos expresiones de tipo se consideran equivalentes.
Dos modos de equivalencia de tipos:
Equivalencia estructural:
Dos expresiones de tipo son equivalentes estructuralmente si son el mismo tipo bsico,
o si estn formadas por la aplicacin del mismo constructor de tipos a 2 tipos
estructuralmente equivalentes.
Ejemplo: (Pascal)
type
t_vector: array [0...9] of integer;
t_matriz : array [0...9] of array [0..9] of integer;
var
uno: array [0..9] of integer;
dos: array [0..9, 0..9] of integer;
tres: t_matriz;
cuatro: array [0..9] of t_vector;
cinco: array [0..9] of t_vector;
Los tipos de {dos, tres, cuatro, cinco} son estructuralmente equivalentes, su expresin
de tipo es array (0., 9, array (0.,9, integer)).
El tipo de uno no es estructuralmente equivalente con ninguna de esas variables, pero si
con cuatro [4] (expr. tipo: array (0., 9, integer)).
Equivalencia nominal:
Dos expresiones de tipo son nominalmente equivalentes si son el mismo tipo bsico o si
a ambas se les ha asociado el mismo nombre.
Definicin de equivalente nominal depende de cmo implemente el lenguaje el manejo
de tipos.
Algunos lenguajes asignan nombre implcitos para cada aplicacin de un constructor de
tipo.
pg. 10

Ejemplo:
En el ejemplo anterior, slo cuatro y cinco son nominalmente equivalentes.
Su expresin de tipo es array (0.,9, t vector).
Los dos no son nominalmente equivalente con dos, su expresin de tipo es array(0.,9,
(array(0.,9, integer))
Otro ejemplo:
type
T0 : integer;

T1: record
a, b: integer;
c: T0;
end;

T2: record
x: integer;
y,z: T0;
end;

Con equivalente estructural: T1 y T2 son equivalentes.


Con equivalencia de nombres: No son equivalentes.

c, y, z son del mismo tipo.


a, c son de tipos distintos.

(a) Implementacin de la equivalencia estructural.


IDEA: Recorrido recursivo de las expresiones de tipo.
FUNCTION esEquivalente(S, T): boolean
begin
if S and T son el mismo tipo bsico
then return TRUE;
else if (S = array(S1, S2)) and (T = array(T1, T2))
then return [esEquivalente(S1,T1) and esEquivalente(S2,T2)];
else if (S = S1 S2) and (T = T1 T2)
then return [esEquivalente(S1,T1) and esEquivalente(S2,T2)];
else if (S = pointer(S1)) and (T = pointer(T1))
then return [esEquivalente(S1,T1)];
else if (S = S1 S2) and (T = T1 T2)
then return [esEquivalente(S1,T1) and esEquivalente(S2,T2)]
else return FALSE;
end
La equivalencia nominal es ms sencilla de implementar.
Basta comprobar que coinciden los nombres asociados las expresiones de tipo.
Es menos flexible para el programador.
(b) Representacin de expresiones de tipo.
Estructuras de datos internas usadas por el compilador para manejar las expresiones de
tipo.
Deseable representaciones manejables que permitan comprobacin de tipos eficiente.
pg. 11

Dependen del tipo de equivalencia de tipos considerada.


Dos posibilidades:
Codificacin binaria.
Estructuras arbreas.
1. Codificacin.
Usada para expresiones de tipo sencillas.
Se asigna un nmero binario a cada expresion de tipo posible.
Comparacin de tipos muy eficiente.
Uso de operaciones a nivel de bits (desplazamientos, AND, OR, uso mscaras, etc)
Ejemplo: array (pointer(char)) 101 100 001

2. Estructuras arbreas.
Expresiones de tipo representadas en forma de rboles.
hojas tipos bsicos.
nodos internos constructores de tipo.
Mtodo ms general.
Comparacin tipos supone recorrido sobre el rbol.
Ejemplo: (real (char char)) pointer (integer).
Otra posibilidad: Uso de DAG (grafos dirigidos acclicos)
Forma condensada de representar rboles.
Estructuras repetidas se representan implcitamente.
Representacin compacta.
Menos memoria.
Comparacin ms rpida.
Construccin ms compleja.

1.7 CONVERSIONES DE TIPOS.


Considrense expresiones como x + i donde x es de tipo real e i es de tipo entero. Como
representacin de enteros y reales es distinta dentro de un computador, y se utilizan
instrucciones de mquina distintas para las operaciones sobre enteros y reales, puede
que el compilador tenga que convertir primero uno de los operandos de + para
garantizar que ambos operandos sean del mismo tipo cuando tenga lugar la suma.

pg. 12

La definicin del lenguaje especifica las conversiones necesarias. Cuando un entero se


asigna a un real, o viceversa, la conversin es al tipo del lado izquierdo de la asignacin.
En expresiones, la transformacin ms comn es la de convertir el entero en un nmero
real y despus realizar una operacin real con el par de operandos reales obtenidos. Se
puede utilizar el comprobador de tipos en un compilador para insertar estas operaciones
de conversin en la representacin intermedia del programa fuente.
Hay dos tipos de conversin:
Implcita: realizada por el compilador automticamente.
Explicita: realizada por programador (cast).

1.8 SOBRECARGA DE FUNCIONES Y OPERADORES.


Un smbolo sobrecargado es aquel que tiene diferentes significados dependiendo del
contexto.
Ejemplo: el operador +
El significado es diferente cuando se suman enteros, o reales, o complejos, o matrices.
La sobrecarga se resuelve cuando se define un significado nico para una ocurrencia del
smbolo sobrecargado.
Si la sobrecarga no se resuelve, una expresin puede tener un conjunto de tipos posibles
Ejemplo: si para el operador + se tienen los siguientes tipos posibles:
entero x entero entero
entero x entero complejo
complejo x complejo complejo.
1.9 FUNCIONES POLIMORFICAS.
Una funcin polimrfica permite ser ejecutada con argumentos de tipos diferentes cada
vez (pero siempre ejecuta el mismo cuerpo de instrucciones).
Ejemplo: los operadores definidos por el lenguaje para indexar arreglos, llamar
funciones y manejar punteros.
Las funciones polimrficas facilitan la implementacin de algoritmos que manipulan
estructuras de datos, sin importar el tipo de dato de los elementos de la estructura.
Ejemplo: longitud de una lista, altura de un rbol.
Variables de Tipo.
Variables de Tipo: Permiten representar tipos desconocidos en una expresin de tipo.
Se usan para comprobacin de tipos de lenguajes que no exigen declarar los
identificadores antes de su uso.
Inferencia del Tipo: es el problema de determinar el tipo de una construccin del
lenguaje de acuerdo con la forma en que es usado.
pg. 13

Type list celda;


Procedure x (l: list; procedure p)

p es tipo a void

Begin ...... p(l); ..... End;

p es tipo list void

Variables de Tipo y Funciones Polimrficas.


La expresin de tipo de una funcin polimrfica se define usando el cuantificador
universal " (para todo).
Para la funcin que retorna la longitud de una lista:
La equivalencia de tipos se determina haciendo unificacin de tipos.

CONCLUSIN.

pg. 14

RECOMENDACIN.

pg. 15

BIBLIOGRAFA.

pg. 16

Potrebbero piacerti anche