No todas las proposiciones pueden coordinarse aunque tengan el mismo sujeto y el mismo verbo; para que la coordinación sea posible es necesario que las proposiciones:
- Sean compatibles, esto es, que no se excluyan: no podemos decir "Manolo duerme mucho y padece insomnio"
- Sean coherentes, esto es, puedan responder a la misma pregunta; "Luis es rubio y concejal" es incoherente porque responden a preguntas diferentes.
- En el caso de las preposiciones disyuntivas, que exista alternativa entre ellas: no podemos decir "¿Cumples los años en agosto o durante el verano?"
Sistemas de tipos
Sistema de tipos: conjunto de reglas que determinan el criterio para asignar expresiones de tipo a las diferentes partes del código fuente.
Tipo básico: entero, carácter, real, lógico
Nombres de tipo
Constructores de tipo: estructuras, uniones, objetos
Apuntadores: referencias a tipos
Funciones a=suma();
Expresiones de tipos
El tipo de una construcción de un lenguaje se denotará mediante una “expresión de tipo”. De manera informal, una expresión de tipo es, o bien un tipo básico o se forma aplicando un operador llamado constructor de tipos a otras expresiones de tipos. Los conjuntos de tipos y constructores básicos dependen del lenguaje que deba comprobarse.
Cada lenguaje de programación requerirá unas expresiones de tipos adecuadas a sus características. A continuación, a modo de ejemplo, se definen las expresiones de tipos más comunes:
· Tipos simples: Son expresiones de tipos los tipos simples del lenguaje, y algunos tipos especiales:
Ø integer
Ø real
Ø char
Ø boolean
Ø void
Ø error
· Constructores de tipos
Permiten formar tipos complejos a partir de otros más simples. La semántica de cada lenguaje tiene asociada unos constructores de tipos propios. En general, en los lenguajes de programación se definen los siguientes constructores:
ü Matrices: Si T es una expresión de tipos, entonces array(R,T) es también una expresión de tipos que representa a una matriz de rango R de elementos de tipo T.
Ejemplos: Sea el segmento de código C :
char a[10] ü Productos: Sea T1 y T2 expresiones de tipos, T1 x T2 es una expresión 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 expresión de tipos asociada al conjunto es:
record ( (u1:T1) x (u2:T2) x ... x (uN:TN) ) ü Punteros: Si T es una expresión de tipos, entonces pointer(T) es una expresión de tipos que representa a un puntero a una posición de memoria ocupada por un dato de tipo T.
ü Funciones: Sean T1,T2 ... TN, las expresiones de tipos asociadas a los segmentos de código correspondientes a los argumentos de una función, y sea T el tipo devuelto por la función. Entonces, la expresión de tipos asociada a la función es:
((T1xT2 x... xTN) -> T ) Ø Las expresiones de tipo pueden contener variables cuyos valores son expresiones de tipos.
Sistemas de tipos
Un sistema de tipos es una serie de reglas para asignar expresiones de tipos a las distintas partes de un programa y verificar su corrección. En concreto, formarán el sistema de tipos las definiciones y reglas que permiten comprobar cuál es el dominio asignado a una variable, y en qué contextos puede ser usada.
Conversiones de tipos
Considérense expresiones como x + i donde x es de tipo real e i es de tipo entero. Como pa representación de enteros y reales es distinta dentro de un computador, y se utilizan instrucciones de máquina 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.
La definición del lenguaje especifica las conversiones necesarias. Cuando un entero se asigna a un real, o viceversa, la conversión es al tipo del lado izquierdo de la asignación. En expresiones, la transformación más común es la de convertir el entero en un número real y después realizar una operación real con el par de operandos reales obtenidos. Se puede utilizar el comprobador de tipos en un compilador para insertar estas operaciones de conversión en la representación intermedia del programa fuente.
La conversión de tipos surge con frecuencia en otro contexto. Se dice que un símbolo que tienen distintos significados dependiendo de su contexto está sobrecargado. Las conversiones de tipo a menudo acompañan a la sobrecarga.