Nuevas Perspectivas en Lenguajes de Programación: Teoría de Tipos y Seguridad de Tipos



Documentos relacionados
Pruebas de unidad con JUnit

Compiladores e Intérpretes Proyecto N 1 Sintaxis de MiniJava Segundo Cuatrimestre de 2015

ISTP CIDET COMPUTACION E INFORMATICA ARREGLOS EN JAVA

Conceptos. ELO329: Diseño y Programación Orientados a Objetos. ELO 329: Diseño y Programación Orientados a Objetos

En cualquier caso, tampoco es demasiado importante el significado de la "B", si es que lo tiene, lo interesante realmente es el algoritmo.

Programación Orientada a Objetos en JAVA

Modulo 1 El lenguaje Java

8. Sentencia return y métodos

GUIA PROGRAMACIÓN ORIENTADA A OBJETOS

Nota 2. Luis Sierra. Marzo del 2010

2. Estructura de un programa en Java

Tema 6. Reutilización de código. Programación Programación - Tema 6: Reutilización de código

Identificadores, palabras reservadas, tipos de datos, operadores aritméticos y el sistema estándar de salida en Java

GESTIÓN DE EXCEPCIONES EN JAVA. CAPTURA CON BLOQUES TRY CATCH Y FINALLY. EJEMPLOS RESUELTOS. (CU00927C)

QUÉ ES Y PARA QUÉ SIRVE UML? VERSIONES DEL LENGUAJE UNIFICADO DE MODELADO. TIPOS DE DIAGRAMAS. INGENIERÍA DEL SOFTWARE (DV00205D)

OPERADORES LÓGICOS Y DE COMPARACIÓN EN PHP. PRIORIDADES. EJEMPLOS. EJERCICIOS RESUELTOS. (CU00818B)

Curso 0 de Informática

GUÍA TÉCNICA PARA LA DEFINICIÓN DE COMPROMISOS DE CALIDAD Y SUS INDICADORES

RESUMEN DE CONCEPTOS BASICOS DE PROGRAMACION JAVA

Y es que carecer de acceso al agua no sólo es una fuente de conflictos sociales sino también una causa ineludible de pobreza.

9. Objetos y clases Clases

Caso práctico de Cuadro de Mando con Tablas Dinámicas

L204 DVD-ROM 1 Audio transcripts: Unidad 1

Programación III. 1. Facultad: Ingeniería Escuela: Computación Asignatura:Programación III I. OBJETIVOS II. INTRODUCCIÓN TEÓRICA

Tema 3: Herencia en C++ Programación Orientada a Objetos Curso 2008/2009 Begoña Moros Valle

Nociones Básicas de Sémantica: Semántica Denotacional

Ingeniería del Software. Pruebas. Pruebas en el PUD. Las pruebas del software. Tipos de prueba Estrategias de prueba

Proyecto MONO. Juantomás García. 1. Introducción. GNOME Hispano

Programación Orientada a Objetos con Java

Resumen Lenguaje Java

3º Grado Educación Infantil Bilingüe Números. Método Singapur y F. Bravo E R

Apuntes de Matemática Discreta 1. Conjuntos y Subconjuntos

Contenidos. Funciones (suplemento) Funciones. Justificación del uso de Funciones

Objetivos de la práctica: - Practicar uso de ficheros: abrir, cerrar y tratamiento de información contenida en el fichero.

Introducción a la programación orientada a objetos

Módulo III. Aprendizaje permanente Tema 4: Aprendizaje de actividades laborales Entrevista. El papel de las familias como impulsoras del empleo

Programación I: Funciones y módulos

LABORATORIO Nº 2 GUÍA PARA REALIZAR FORMULAS EN EXCEL

Ejercicio 1. Desarrollar un pequeño juego para practicar mecanografía.

Análisis y gestión de riesgo

Curso de Doctorado: Tecnologías de Objetos

El lenguaje de Programación C. Fernando J. Pereda

Introduccion al Lenguaje C. Omar Andrés Zapata Mesa Grupo de Fenomenología de Interacciones Fundamentales, (Gfif) Universidad de Antioquia

1 Introducción a XML

ISO14001: disponer de un certificado bajo la versión de 2008 en vigor - superar una auditoria bajo los requisitos de la nueva versión

Técnicas Avanzadas de Testing Automatizado

5.1 Introducción a XSL

Tecnólogo Informático- Estructuras de Datos y Algoritmos- 2009

Capítulo 11. Conclusiones y trabajo futuro

Tema 3. Test Driven Development

INTRODUCCIÓN AL TIPO COMPUESTO CADENA CONTENIDOS

Programación: QBASIC

Tutorial Básico de vbscript

Procesadores de lenguaje Tema 5 Comprobación de tipos

Tecnologías de la Información. Apuntes de programación en Visual Basic 6.0

Herencia. 3.- Herencia. Declaración de una clase derivada en Delphi. Jerarquía de clases

Titulación: Ingeniero Técnico en Informática de Gestión Curso: 2º

TÉCNICAS DE ESTUDIO EN EL TERCER CICLO DE EDUCACIÓN PRIMARIA

Escuela Politécnica Superior de Ingeniería Departamento de Ingeniería Informática

Programación Orientada a Objetos. Java: Excepciones

UTILIZACION DE ESQUEMAS XML DE LA AGENCIA TRIBUTARIA PARA CALCULO RETENCIONES

Una base de datos es una colección de información ordenada e interrelacionada que es de importancia para una empresa.

NUEVAS SOLUCIONES y CAMBIOS EN LA GESTION DEL NEGOCIO. JOSE LUIS LENCE Socio Director de Gesfarm Consultoria Farmacias

Pontificia Universidad Católica de Chile Escuela de Ingeniería Departamento de Ciencia de la Computación

Es una persona que ayudará a que los derechos de las personas con discapacidad se hagan realidad

Colegio Alexander von Humboldt - Lima. Tema: La enseñanza de la matemática está en un proceso de cambio

CLASE # 5 TÉCNICAS DE CAJA BLANCA

Tema: Clases y Objetos en C++.

VARIABLES, CONSTANTES Y EXPRESIONES ASIGNACIÓN. TIPOS ELEMENTALES. PRECEDENCIA DE LOS ESTRUCTURAS DE CONTROL. CONDICIONAL E

Clases y Objetos. Informática II Ingeniería Electrónica

PREGUNTAS FRECUENTES SOBRE LOWESLINK DE LOWE S MÉXICO

Objetivo: Introducción conceptual y aplicación básica de los lenguajes del lado del servidor.

UML, ejemplo sencillo sobre Modelado de un Proyecto

Capítulo 6. Asociaciones y Declaraciones.

CLASS JAVASCRIPT CLASES? OBJETOS PREDEFINIDOS. WINDOW, OBJETO GLOBAL. NUMBER, MATH, DATE, REGEXP, ERROR. (CU01144E)

5.1. Organizar los roles

La mayor parte de las empresas en el mundo utilizan sistemas de información,

OFICIOS DEL CINE ESPAÑOL CAPITULO XXI PRODUCTORES ELLOS CREAN QUE VES

QUE MUEVE TU ESCALERA?

Inter American Accreditation Cooperation. Grupo de prácticas de auditoría de acreditación Directriz sobre:

Puedes Desarrollar Tu Inteligencia

Nuestras Tradiciones y Conceptos: Una Base para el Liderazgo en NA

Benemérita Universidad Autónoma del Estado de Puebla

Operativa en Acciones: Introducción a la Bolsa

Propiedad Colectiva del Código y Estándares de Codificación.

Objetivo de aprendizaje del tema

INSTITUTO TECNOLOGICO de la laguna Programación Orientada a Objetos en C++

10. Algunas clases estándar de Java (I)

Introducción. Ciclo de vida de los Sistemas de Información. Diseño Conceptual

Servicios Administrados al Cliente

CONSEJERÍA DE EDUCACIÓN

El Producto: Software

QUÉ ES Y QUÉ ESTUDIAR PARA SER PROGRAMADOR WEB? ITINERARIO DE FORMACIÓN, PLAN DE ESTUDIOS O DE CARRERA. (CE00302D)

Fundamentos de la Programación

Ejemplos de conversión de reales a enteros

Para llegar a conseguir este objetivo hay una serie de líneas a seguir:

DCU Diagramas de casos de uso

Capitulo VI. Conclusiones.

INTELIGENCIA EN REDES DE COMUNICACIONES PRÁCTICA FINAL. Ignacio Ribas Ramos Miguel Flecha Lozano Ingeniería de Telecomunicaciones

Trabajo Semanal Alternativo

Transcripción:

Nuevas Perspectivas en Lenguajes de Programación: Teoría de Tipos y Seguridad de Tipos Borja Sotomayor 10 de julio de 2006 1 Charla organizada por: Cursillos de Julio 2006 http://www.eside.deusto.es/eventos/cursillosjulio 2

Disclaimer No soy un experto en Teoría de Lenguajes de Programación (PL). Esta charla es el resultado de (1) haber estudiado PL en Chicago y (2) incontables conversaciones y charlas con verdaderos expertos en PL. Agradecimientos: Jacob Matthews, Mike Rainey, y Adam Shaw Esta no es una charla dogmática. Más detalles sobre mi (verdadera) área de investigación (Grid Computing) en mi web: http://people.cs.uchicago.edu/~borja/ 3 Introducción Comprobaciones estáticas vs. dinámicas Índice Teoría de Tipos y Seguridad de Tipos El estado del arte Lenguajes Interesantes 4

Índice Introducción Comprobaciones estáticas vs. dinámicas Teoría de Tipos y Seguridad de Tipos El estado del arte Lenguajes Interesantes 5 Introducción (I) Los lenguajes de programación han evolucionado durante décadas. Hay un puñado de lenguajes que se han convertido en los más populares para ingeniería: C/C++, Java, C#, Visual B***c, Delphi,... Python, Perl, PHP, Java/ECMAScript,... En círculos académicos: Haskell, Scheme,... 6

Introducción (II) Sin embargo, hay miles de lenguajes de programación [1]. Muchos de estos lenguajes son research languages que, en muchas ocasiones, no llegarán a ser adoptados por la industria informática. Sin embargo, exploran técnicas y nuevos paradigmas que eventualmente llegan a los grandes lenguajes de programación. Orientación a objetos: surgió de Simula y Smalltalk VB9 influido por programación funcional (especialmente Haskell) [2] 7 Introducción (III) Es interesante conocer cuales son estos research languages porque: Las ideas incluidas en esos lenguajes pueden acabar llegando a lenguajes más populares. En algunos casos concretos, puede resultar más eficiente utilizar uno de estos lenguajes. 8

Introducción (IV) Cuales son las principales preocupaciones de estos lenguajes? Hay muchas subareas, pero podemos distinguir dos importantes áreas generales: La detección estática de bugs Lenguajes para afrontar nuevos desafíos 9 Introducción (V) Objetivos de esta charla Presentar nuevas perspectivas en lenguajes de programación, para ver que hay un universo de lenguajes más allá del C/C++, Java, etc. de toda la vida. Nos centraremos en la diferencia entre comprobaciones estáticas (static checking) y comprobaciones dinámicas (dynamic checking). Énfasis en área concreta llamada Teoría de Tipos (Type Theory) y la Seguridad de Tipos (Type Safety). Comentar brevemente algunos lenguajes que aplican las ideas expuestas en la charla. 10

Introducción Comprobaciones estáticas vs. dinámicas Índice Teoría de Tipos y Seguridad de Tipos El estado del arte Lenguajes Interesantes 11 Comprobación Estática (I) Comprobación estática Realizada por el compilador al analizar el código fuente. Un compilador no sólo detecta errores de sintaxis, también puede detectar ciertos errores de lógica. P.ej. El compilador de Java puede rechazar código que es sintácticamente válido pero que contiene errores básicos de lógica. 12

Comprobación Estática (II) public int sumar(int a, int b) int c = a + b; public int sumar(int a, int b) int c; No hay return public void refreshgui() Vector newbuttons; return a+b; Variable no utilizada for(int i=0; i<newbuttons.size(); i++) //... Objeto no inicializado 13 Comprobación Dinámica (I) Comprobación dinámica Realizada en tiempo de ejecución (responsabilidad del programador) Hay comprobaciones que el compilador no puede realizar. P.ej. errores de lógica específicos a nuestro dominio. P.ej. Comprobar que los strings que representan contraseñas nunca tienen más de ocho caracteres Sin embargo, hay muchas comprobaciones dinámicas que pueden pasar a ser responsabilidad del compilador. P.ej. Colecciones en Java 1.4 vs. Java 5 14

Comprobación Dinámica (II) public void despedir(vector vectorempleados) for(int i=0; i<vectorempleados.size(); i++) Empleado empl = (Empleado) vectorempleados.get(i); empl.despedir(); Y si antes de llamar a despedir() he hecho esto? vectorempleados.add(new Integer(5)) ClassCastException! 15 Solución: Comprobación Dinámica (III) El programador es el responsable de añadir comprobaciones para asegurarse de que esos errores son manejados adecuadamente. No es una solución ideal. El programador puede olvidarse de añadir esas comprobaciones ( o puede darle pereza!) El código suele ser engorroso y dificulta la lectura del resto del código. 16

Comprobación Dinámica (IV) public void despedir(vector vectorempleados) for(int i=0; i<vectorempleados.size(); i++) Object obj = vectorempleados.get(i); if(obj instanceof Empleado) Empleado empl = (Empleado) obj; empl.despedir(); else System.err.println("Vector de empleados contiene objeto no-empleado"); 17 Comprobación Dinámica (V) Además, hay ciertos errores para los que no es posible añadir comprobaciones. Son bugs con los que tendremos que pelearnos al depurar nuestro programa. public void despedir(vector vectorempleados) for(int i=0; i<=vectorempleados.size(); i++)... ArrayIndexOutOfBoundsException! 18

Java 1.4 vs. Java 5 En Java 5 esta responsabilidad pasa del programador (comprobación dinámica) al compilador (comprobación estática). ClassCastException -> Templates ArrayIndexOutOfBoundsException -> Bucle 'for' mejorado public void despedir(vector<empleado> vectorempleados) for (Empleado e: vectorempleados) e.despedir(); 19 Otros errores (I) Pero todavía hay muchos errores que el compilador no detectará. Y si vectorempleados es null? Y si uno de los valores del vector es null? Solución: Capturar NullPointerException en todos lados? Locura! Sin embargo, hay lenguajes que están diseñados para capturar este tipo de errores estáticamente. Tipos option en SML, OCaml,... Tipos maybe en Haskell 20

Otros errores (II) En Java, todos los tipos son nullable (excepto los tipos primitivos) Es imposible indicar que una variable del tipo FOOBAR nunca debe tener un valor nulo. En SML, esto es posible gracias a los tipos option type pair = int * int type pair = (int * int) option Pareja de enteros Pareja de enteros (o NULL) 21 Otros errores (III) type empleado = nombre : string, dni : int, empl : bool ; type empleadolist = empleado list; fun despedirempleado ( e:empleado ) = nombre = #nombre e, dni = #dni e, empl = false fun despedir emps = map despedirempleado emps 22

Otros errores (IV) type empleado = nombre : string, dni : int, empl : bool ; type empleadolist = empleado option list; fun despedirempleado ( e:empleado ) = nombre = #nombre e, dni = #dni e, empl = false fun despedir emps = map despedirempleado emps Si en el programa llamamos a despedir sobre una lista de tipo empleadolist, el compilador puede inferir que se puede producir un null pointer exception en despedirempleado, ya que no contemplamos el caso NULL. 23 Otros errores (V) type empleado = nombre : string, dni : int, empl : bool ; type empleadolist = empleado option list; fun despedirempleado ( SOME (e:empleado) ) = SOME nombre = #nombre e, dni = #dni e, empl = false despedirempleado (NONE) = (print "WARN: Empleado nulo"; NONE) fun despedir emps = map despedirempleado emps 24

Resumen Recordando: se están desarrollando lenguajes que la detección de bugs pasa de ser una comprobación dinámica a ser una comprobación estática. Las técnicas y ideas exploradas en estos lenguajes eventualmente llegan a las masas. P.ej. Orientación a objetos, Templates, etc. 25 Introducción Comprobaciones estáticas vs. dinámicas Índice Teoría de Tipos y Seguridad de Tipos El estado del arte Lenguajes Interesantes 26

Teoría de Tipos (I) La Teoría de Tipos [3] es una rama de PL que se centra en el estudio de los type systems ( el sistema de tipos ) en los lenguajes de programación. Los tipos no son una parte trivial ( int, float, etc.) de un lenguaje de programación. Tipo: Clasificación de un valor o una expresión según el tipo que computa. Todo lenguaje tiene un sistema de tipos (aunque sea para especificar que hay un único tipo variable) 27 Teoría de Tipos (II) Un sistema de tipos bien diseñado permite realizar más comprobaciones estáticas. Qué es un sistema de tipos bien diseñado? Fuertemente tipado? Tipado estático o dinámico? Añadir el máximo posible de comprobaciones en el compilador para evitar bugs frecuentes? 28

Seguridad de Tipos (I) En general, un sistema de tipos debe aspirar a ser type-safe (debe garantizar la seguridad de tipos ) [3,4] En un lenguaje type-safe el compilador no aceptará ningún programa mal tipado. Expresiones del tipo Hola / 5 Expresiones con errores más sutiles como los que hemos visto antes. El compilador también puede rechazar programas que, aun estando mal tipados, no generarían una excepción en ejecución. if (true) return Hola ; else return 42; 29 Seguridad de Tipos (II) La seguridad de tipos se puede definir formalmente, y se puede demostrar que un lenguaje es type-safe. Progreso: Un término bien tipado (una expresión ) nunca se queda atascado. Es decir, o es un valor, o podemos tomar un paso de evaluación. Preservación: Si tomamos un paso de evaluación sobre un término bien tipado, el término sigue estando bien tipado. Esta demostración se realiza inductivamente sobre todos los posibles términos de nuestro lenguaje. 30

Seguridad de Tipos (III) Ventaja de estos lenguajes: tenemos una garantía formal de que, una vez compilado (realizada la comprobación estática), hay ciertas operaciones que nuestro programa no realizará (operaciones que podrían resultar en un fallo) Sólo hay un lenguaje complejo para el que exista una demostración de que es type-safe: SML Se sospecha que Java 5 es type-safe, pero realizar la demostración sería una tarea hercúlea 31 Ventajas de SML (I) Entonces... qué tiene SML que no tenga Java? Un sistema de tipos mucho más compacto y mejor diseñado con el que se pueden realizar demostraciones formales. Java deja demasiados errores en manos de excepciones que son lanzadas por el sistema, no por el usuario. El sistema de tipos tiene algunas características bastante útiles. 32

Tipos producto ( tuplas ) public class tupla4 private int n1,n2,n3,n4; Ventajas de SML (II) Cuando necesitamos tuplas en nuestro programa, no tenemos que declarar una clase específicamente para esa tupla. public tupla4(int n1, int n2, int n3, int n4) this.n1 = n1; this.n2 = n2; this.n3 = n3; this.n4 = n4; public int getn1() return n1; public void setn1(int n1) this.n1 = n1; Java SML type 4tupla = int * int * int * int //... 33 Inferencia de tipos Ventajas de SML (III) SML no necesita anotaciones de tipos. Es capaz de deducir el tipo de cada expresión analizando el programa entero. fun incr a = a + 1 fun incr a = a + 1.0 int -> int real -> real 34

Introducción Comprobaciones estáticas vs. dinámicas Índice Teoría de Tipos y Seguridad de Tipos El Estado del Arte Lenguajes Interesantes 35 El Estado del Arte Software Transactional Memory [5] Transacciones a nivel de lenguajes de programación (orientado a memoria compartida) Semantics Preservation Garantizar que las optimizaciones que introduce un compilador no alteran la semántica original del programa. Proof-Carrying Code Código que lleva adjunto una demostración de que el código es seguro. 36

Typed Assembly Código ensamblador con tipos Sistemas concurrentes Integrar soporte para concurrencia directamente en el lenguaje (no en la API). Modelos formales: Pi Calculus, Ambient Calculus. 37 Introducción Comprobaciones estáticas vs. dinámicas Índice Teoría de Tipos y Seguridad de Tipos El Estado del Arte Lenguajes Interesantes 38

Lenguajes Interesantes (I) SML http://www.smlnj.org/ (SML/NJ) Type-safe Especialmente indicado para escribir compiladores. Principal carencia: librerías OCaml http://caml.inria.fr/ Desciende, al igual que SML, del lenguaje ML [8] Nadie ha demostrado si es type-safe, pero tiene un sistema de tipos muy similar al de SML. Dispone de muchas librerías. Cyclone http://cyclone.thelanguage.org/ C con seguridad de tipos Toda la versatilidad y potencia de C, pero con muchas más comprobaciones estáticas que un compilador de C. 39 XDuce Lenguajes Interesantes (II) http://xduce.sourceforge.net/ Lenguaje type-safe para procesamiento de XML Scheme JWig Basado en LISP, aunque permite tanto el paradigma funcional como el procedural. Tipado dinámico. http://www.brics.dk/jwig/ Buen ejemplo de un lenguaje de programación diseñado para afrontar un nuevo reto (programación web) 40

Preguntas? Borja Sotomayor Department of Computer Science University of Chicago borja@cs.uchicago.edu http://people.cs.uchicago.edu/~borja/ 41 Bibliografía [1] List of Programming Languages http://en.wikipedia.org/wiki/list_of_programming_languages [2] Confessions of a Used Programming Language Salesman: Getting the Masses Hooked on Haskell. Eric Meijer. Submitted to ICFP2006. http://research.microsoft.com/~emeijer/papers/icfp06.pdf [3] Types and Programming Languages. Benjamin C. Pierce. 2002, The MIT Press. [4] Type Safety. http://en.wikipedia.org/wiki/type-safety [5] Software Transactional Memory. http://en.wikipedia.org/wiki/software_transactional_memory [6] Proof-Carrying Code. http://en.wikipedia.org/wiki/proof-carrying_code [7] Typed Assembly Language (TAL). http://www.cs.cornell.edu/talc/ [8] ML Programming Language. http://en.wikipedia.org/wiki/ml_programming_language [4] The Next Mainstream Programming Language: A Game Developer's Perspective. Tim Sweeney. POPL 2006. http://www.cs.princeton.edu/~dpw/popl/06/tim-popl.ppt 42