Compiladores: Expresiones, Tipos y Built-ins - (c)2014 LSUB 1/25/16, 2:49 PM Compiladores: Expresiones, Tipos y Built-ins Francisco J Ballesteros LSUB, URJC http://127.0.0.1:3999/s10.types.slide#1 Page 1 of 16 Compiladores: Expresiones, Tipos y Built-ins - (c)2014 LSUB 1/25/16, 2:49 PM Expresiones, Tipos y Built-ins Hay que evaluar expresiones pero para eso hay que comprobar que los tipos están bien lo que require un sistema de tipos! Los built-in evaluables en tiempo de compilación han de estar en el compilador han de estar en el run-time http://127.0.0.1:3999/s10.types.slide#1 Page 2 of 16 Compiladores: Expresiones, Tipos y Built-ins - (c)2014 LSUB 1/25/16, 2:49 PM Otras comprobaciones Hay muchas otras comprobaciones que es preciso hacer que las variables utilizadas están definidas que las expresiones constantes son constantes en general, todas las comprobaciones semánticas http://127.0.0.1:3999/s10.types.slide#1 Page 3 of 16 Compiladores: Expresiones, Tipos y Built-ins - (c)2014 LSUB 1/25/16, 2:49 PM Compilador partimos del compilador tal y como quedó en el tema anterior parser con nodos del AST (src/lang/lang8.y) tabla de símbolos (src/lang/dat5.go) AST (src/lang/nd.go) scanner (src/lang/lex2.go) salida con el AST (src/lang/f.out7) http://127.0.0.1:3999/s10.types.slide#1 Page 4 of 16 Compiladores: Expresiones, Tipos y Built-ins - (c)2014 LSUB 1/25/16, 2:49 PM Tipos de datos Un tipo de datos puede definirse como un conjunto de datos con unas operaciones Dicho eso hay tipos estáticos hay tipos dinámicos hay tipos polimórficos hay duck typing ... http://127.0.0.1:3999/s10.types.slide#1 Page 5 of 16 Compiladores: Expresiones, Tipos y Built-ins - (c)2014 LSUB 1/25/16, 2:49 PM Tipado estático El tipado estático asigna un tipo a cada objeto en el lenguaje puede realizarse en tiempo de compilación aunque habrá comprobaciones dinámicas (ej. rangos) http://127.0.0.1:3999/s10.types.slide#1 Page 6 of 16 Compiladores: Expresiones, Tipos y Built-ins - (c)2014 LSUB 1/25/16, 2:49 PM Tipado estático A cada objeto tenemos que asignatura un tipo ¿Qué tipos tenemos? predefinidos tipos definidos por el usuario http://127.0.0.1:3999/s10.types.slide#1 Page 7 of 16 Compiladores: Expresiones, Tipos y Built-ins - (c)2014 LSUB 1/25/16, 2:49 PM Tipos definidos por el usuario ¿Qué quiere decir? TipoEnt = int TipoNat = TipoEnt 1..MaxInt En el primer caso el tipo es nuevo (incompatible) pero admite constantes universales En el segundo caso el tipo no es nuevo (compatible) pero impone restricciones de rango http://127.0.0.1:3999/s10.types.slide#1 Page 8 of 16 Compiladores: Expresiones, Tipos y Built-ins - (c)2014 LSUB 1/25/16, 2:49 PM Tipado en el lenguaje Tipos predefinidos int bool char float Y tipos universales para las constantes X = 3 ... universal universal universal universal int bool char float http://127.0.0.1:3999/s10.types.slide#1 Page 9 of 16 Compiladores: Expresiones, Tipos y Built-ins - (c)2014 LSUB 1/25/16, 2:49 PM Tipado en el lenguaje Además tenemos una constante polimórfica nil Y además "hi there" http://127.0.0.1:3999/s10.types.slide#1 Page 10 of 16 Compiladores: Expresiones, Tipos y Built-ins - (c)2014 LSUB 1/25/16, 2:49 PM Tipado en el lenguaje Constructores de tipos nuevos: T T T T T T = = = = = = (a, b, c, ... n) T1 T1 a..b record { T1, T2, ..., Tn } array[T1] of T2 ^T1 http://127.0.0.1:3999/s10.types.slide#1 Page 11 of 16 Compiladores: Expresiones, Tipos y Built-ins - (c)2014 LSUB 1/25/16, 2:49 PM Sistema de tipos Para cada tipo creamos una estructura única, guardada en un array de tipos con la información que describe el tipo apuntando a los tipos de los elementos internos incluyendo min y max para rangos Un tipo es un puntero a una estructura de tipos http://127.0.0.1:3999/s10.types.slide#1 Page 12 of 16 Compiladores: Expresiones, Tipos y Built-ins - (c)2014 LSUB 1/25/16, 2:49 PM Sistema de tipos Dos tipos son compatibles si son el mismo puntero o uno deriva de un universal y el otro es el universal o uno es un subtipo del otro (ej. subrango) En cualquier otro caso son incompatibles http://127.0.0.1:3999/s10.types.slide#1 Page 13 of 16 Compiladores: Expresiones, Tipos y Built-ins - (c)2014 LSUB 1/25/16, 2:49 PM Sistema de tipos Dos tipos pueden convertirse entre si cuando son el mismo tipo son enumerados y se convierten de/a int No hay más conversiones aceptadas La conversión se implementa como un builtin una función que acepta un tipo y devuelve otro posiblemente la función no haga nada http://127.0.0.1:3999/s10.types.slide#1 Page 14 of 16 Compiladores: Expresiones, Tipos y Built-ins - (c)2014 LSUB 1/25/16, 2:49 PM Implementación del sistema de tipos Hay que crear las estructuras para los tipos Hay que asignar tipos a los elementos del AST Hay que comprobar los tipos la generación de código usará la información de tipado http://127.0.0.1:3999/s10.types.slide#1 Page 15 of 16 Compiladores: Expresiones, Tipos y Built-ins - (c)2014 LSUB 1/25/16, 2:49 PM Questions? Francisco J Ballesteros LSUB, URJC http://lsub.org (http://lsub.org) http://127.0.0.1:3999/s10.types.slide#1 Page 16 of 16