Baño

1,943 views

Published on

ejemplo

Published in: Education
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,943
On SlideShare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
104
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Baño

  1. 1. EL LENGUAJE SCALA Reala mnsagbhdasbhjsad Curso 08/09
  2. 2. ÍNDICE <ul><li>Introducción – motivaciones. </li></ul><ul><li>¿Qué es Scala? </li></ul><ul><li>Influencias de otros lenguajes. </li></ul><ul><li>Características de Scala. </li></ul><ul><li>Traits. </li></ul><ul><li>Lenguajes de dominio específico (DSLs). </li></ul><ul><li>Herramientas. </li></ul><ul><li>¿Quién lo usa? </li></ul><ul><li>Conclusiones. </li></ul><ul><li>Aplicación. </li></ul><ul><li>Bibliografía. </li></ul>Cuso 08/09 El lenguaje Scala.
  3. 3. Software de componentes - estado del arte <ul><li>En principio , el software debería ser desarrollado a partir de partes reusable (&quot;componentes&quot;). </li></ul><ul><li>En la práctica , el software se escribe a menudo desde cero, más como un arte que como una industria. </li></ul><ul><li>Los lenguajes de programación tienen parte de la culpa. </li></ul><ul><li>La mayoría de los lenguajes existentes ofrecen sólo un soporte limitado para los componentes. </li></ul>Cuso 08/09 El lenguaje Scala.
  4. 4. ¿Cómo hacerlo mejor? <ul><li>Hipótesis 1: Los lenguajes para componentes necesitan ser escalables ; los mismos conceptos deben ser válidos para describir sistemas pequeños y grandes. </li></ul><ul><li>Hipótesis 2: La escalabilidad puede ser lograda unificando y generalizando conceptos de la programación funcional y la orientada a objetos . </li></ul>Cuso 08/09 El lenguaje Scala.
  5. 5. ¿Por qué unificar PF y POO? <ul><li>Ambas tienen cualidades que se complementan para la composición. </li></ul><ul><ul><li>Programación funcional: Hace fácil desarrollar cosas interesantes desde partes sencillas, usando </li></ul></ul><ul><ul><ul><li>funciones de orden superior </li></ul></ul></ul><ul><ul><ul><li>tipos algebraicos y pattern matching </li></ul></ul></ul><ul><ul><ul><li>polimorfismo paramétrico </li></ul></ul></ul><ul><ul><li>Programación orientada a objetos: Hace fácil adaptar y extender sistemas complejos, usando </li></ul></ul><ul><ul><ul><li>especialización (subclases) y herencia </li></ul></ul></ul><ul><ul><ul><li>configuraciones dinámicas </li></ul></ul></ul><ul><ul><ul><li>clases como abstracciones parciales </li></ul></ul></ul>Cuso 08/09 El lenguaje Scala.
  6. 6. ¿Qué es Scala? <ul><li>Scala es un lenguaje funcional y orientado a objetos completamente interoperable con Java (la versión para .NET no está al día). </li></ul><ul><li>Elimina algunas de las construcciones más antiguas de estos entornos y a cambio añade: </li></ul><ul><ul><li>Un modelo de objetos uniforme. </li></ul></ul><ul><ul><li>Pattern matching y funciones de orden superior. </li></ul></ul><ul><ul><li>Nuevas formas para abstraer y componer programas. </li></ul></ul><ul><li>Su diseño comenzó en 2001en la Escuela Politécnica Federal de Lausana (Suiza) por Martin Odersky. </li></ul>Cuso 08/09 El lenguaje Scala.
  7. 7. <ul><li>Scala es un lenguaje funcional en el sentido de que cada función es un valor. </li></ul><ul><li>Las funciones pueden ser anónimas, anidadas, aplicadas parcialmente ( currying ). </li></ul><ul><li>Muchas funciones útiles de orden superior son implementadas como métodos de clases de Scala. </li></ul><ul><ul><li>scala> val matrix = Array(Array(1, 0, 0), </li></ul></ul><ul><ul><li> | Array(0, 1, 0), </li></ul></ul><ul><ul><li> | Array(0, 0, 1)) </li></ul></ul><ul><ul><li>matrix: Array[Array[Int]] = Array ([I@164da25,... </li></ul></ul><ul><ul><li>scala> matrix.exists(row => row.forall(0 ==)) </li></ul></ul><ul><ul><li>res13: Boolean = false </li></ul></ul>Scala es funcional Cuso 08/09 El lenguaje Scala.
  8. 8. Scala es orientado a objetos <ul><li>Cada valor es un objeto. </li></ul><ul><li>Cada operación es una llamada a un método. </li></ul><ul><li>Las excepciones a estas reglas en Java (como los tipos primitivos, statics) son eliminadas. </li></ul><ul><ul><li>scala> (1).hashCode </li></ul></ul><ul><ul><li>res8: Int = 1 </li></ul></ul><ul><ul><li>scala> (1).+(2) </li></ul></ul><ul><ul><li>res10: Int = 3 </li></ul></ul>Cuso 08/09 El lenguaje Scala.
  9. 9. <ul><li>Si las funciones son valores, y los valores son objetos, entonces las funciones son objetos. </li></ul><ul><li>La función de tipo S => T es equivalente a scala.Function1[S, T] , donde Function1 se define como sigue: </li></ul><ul><ul><li>trait Function1[-S, +T] { </li></ul></ul><ul><ul><li>def apply ( x : S): T </li></ul></ul><ul><ul><li>} </li></ul></ul><ul><li>Así las funciones son interpretadas como objetos con métodos apply . </li></ul><ul><li>Por ejemplo, la función anónima sucesor </li></ul><ul><li>(x: Int) => x + 1 </li></ul><ul><li>se expande a: </li></ul><ul><ul><li>new Function1[Int, Int]{ </li></ul></ul><ul><ul><li>def apply ( x : Int) = </li></ul></ul><ul><ul><li>x + 1 </li></ul></ul><ul><ul><li>} </li></ul></ul>Las funciones son objetos Cuso 08/09 El lenguaje Scala.
  10. 10. Influencias de otros lenguajes <ul><li>Influencias principales del diseño de Scala: Java, C# por su sintaxis, tipos básicos y bibliotecas. </li></ul><ul><li>Smalltalk por su modelo de objetos uniforme. </li></ul><ul><li>Eiffel por su principio de acceso uniforme. </li></ul><ul><li>Beta por la anidación sistemática. </li></ul><ul><li>ML y Haskell por muchos de sus aspectos funcionales. </li></ul><ul><li>OCaml, OHaskell, PLT-Scheme, como otras combinaciones (aunque menos integradas) de PF y POO. </li></ul><ul><li>Pizza, Multi Java, Nice y otras extensiones de la plataforma Java con ideas funcionales. </li></ul><ul><li>Scala también parece influenciar otros nuevos diseños de lenguajes, como por ejemplo los cierres léxicos ( closures ) y la comprensión en LINQ/C# 3.0. </li></ul>Cuso 08/09 El lenguaje Scala.
  11. 11. Características de Scala <ul><li>Tipificado estático </li></ul><ul><li>Interoperabilidad </li></ul><ul><li>Expresivo y ligero </li></ul><ul><li>De alto nivel </li></ul><ul><li>Conciso </li></ul><ul><li>Orientado a objetos puro </li></ul><ul><li>Perezoso </li></ul><ul><li>Cierres léxicos ( closures ) </li></ul><ul><li>Eficiente </li></ul>Cuso 08/09 El lenguaje Scala.
  12. 12. <ul><li>Scala une PF y POO. Esto ha funcionado bien para otros lenguajes como Smalltalk, Python o Ruby pero, Scala va más allá unificando la PF y la POO en un lenguaje de tipos estáticos. </li></ul><ul><li>Scala produce la sensación de estar programando en un lenguaje de scripting moderno pero, sin renunciar a los tipos estáticos. </li></ul><ul><li>No es necesario especificar el tipo de cada expresión porque Scala posee inferencia de tipos . </li></ul><ul><li>object InferenceTest1 extends Application { </li></ul><ul><li>val x = 1 + 2 * 3 // el tipo de x es Int </li></ul><ul><li>val y = x.toString() // el tipo de y es String </li></ul><ul><li>} </li></ul>Tipificado estático Cuso 08/09 El lenguaje Scala.
  13. 13. Interoperabilidad <ul><li>Scala encaja sin fisuras en un entorno Java. </li></ul><ul><li>Puede invocar métodos Java, seleccionar campos Java, heredar de clases Java, implementar interfaces Java, etc. </li></ul><ul><li>Nada de esto requiere código puente o descripción de interfaces. </li></ul><ul><li>El código Java también puede usar fácilmente código Scala. </li></ul><ul><li>El código Scala es traducido a casi el mismo código de bytes que Java. </li></ul>Cuso 08/09 El lenguaje Scala.
  14. 14. <ul><li>Debido a la eficacia del lenguaje Scala, el programador puede desarrollar código más expresivo que en otros lenguajes orientado a objetos; gracias a la forma de trabajar con los objetos. Lo que produce como resultado un código más ligero y entendible. </li></ul><ul><ul><li>val telefonos = Map(“Luis” -> “123456”, </li></ul></ul><ul><ul><li> “ Sara” -> “654321”) </li></ul></ul><ul><ul><li>telefonos += (“Carmen” -> “987654”) </li></ul></ul><ul><ul><li>println(telefonos(“Luis”)) </li></ul></ul>Expresivo y ligero Cuso 08/09 El lenguaje Scala.
  15. 15. <ul><li>La eficacia del lenguaje produce también una funcionalidad de alto nivel mayor que en otros lenguajes. </li></ul><ul><ul><li>Según Java: </li></ul></ul><ul><ul><li>boolean hasUpperCase = false ; </li></ul></ul><ul><ul><li>for (int i = 0; i < nom.length(); i++){ </li></ul></ul><ul><ul><li>if (Character.isUpperCase(nom.charAt(i))) { </li></ul></ul><ul><ul><li>hasUpperCase = true ; </li></ul></ul><ul><ul><li>break ; </li></ul></ul><ul><ul><li>} </li></ul></ul><ul><ul><li>} </li></ul></ul><ul><ul><li>Según Scala: </li></ul></ul><ul><ul><ul><li>val hasUpperCase = nom.exists( _ .isUpperCase) </li></ul></ul></ul>Alto nivel Cuso 08/09 El lenguaje Scala.
  16. 16. Conciso <ul><li>// Java </li></ul><ul><li>public class Persona { </li></ul><ul><li>private String nombre; private int edad; </li></ul><ul><li>public Persona(String nombre, int edad) { </li></ul><ul><li>this.nombre = nombre; </li></ul><ul><li>this.edad = edad; </li></ul><ul><li>} </li></ul><ul><li>public String getNombre() { </li></ul><ul><li>return nombre; </li></ul><ul><li>} </li></ul><ul><li>public int getEdad() { </li></ul><ul><li>return edad; </li></ul><ul><li>} </li></ul><ul><li>public void setNombre(String nombre) { </li></ul><ul><li>this.nombre = nombre; </li></ul><ul><li>} </li></ul><ul><li>public void setEdad(int edad) { </li></ul><ul><li>this.edad = edad; </li></ul><ul><li>} </li></ul><ul><li>} </li></ul><ul><li>// Scala </li></ul><ul><li>class Persona ( </li></ul><ul><li>var nombre: String, </li></ul><ul><li>var edad: int) </li></ul><ul><li>La reducción media de líneas de código es ≥ 2 debido a la sintaxis concisa y a mejores capacidades de abstracción. </li></ul><ul><li>Scala es un Java más limpio. </li></ul>Cuso 08/09 El lenguaje Scala.
  17. 17. Valores perezosos <ul><li>Secuencia de Fibonacci : </li></ul><ul><li> scala> lazy val fib: Stream[Int] = Stream.cons(0, </li></ul><ul><li> | Stream.cons(1, fib.zip(fib.tail).map(p => p._1 + p._2))) </li></ul><ul><li> fib: Stream[Int]= Stream(0,?) </li></ul><ul><li>Se definen manualmente los dos primeros valores de la secuencia, entonces recursivamente se define un stream infinito de los restantes términos. </li></ul><ul><li>fib es la secuencia de Fibonacci empezando en cero (0, 1, 1, 2, 3, ...). </li></ul><ul><li>fib.tail es la secuencia empezando en uno (1, 1, 2, 3, 5, ...). </li></ul><ul><li>fib.zip.(fib.tail) es la secuencia de pares ((0, 1), (1, 1), (1, 2), (2, 3), ...). </li></ul><ul><li>Entonces usamos map para los elementos de cada par (._1, ._2) y completar la definición recursiva del resto de fib . </li></ul><ul><li> scala> fib.take(13).print </li></ul><ul><li> 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, Stream.empty </li></ul>Cuso 08/09 El lenguaje Scala.
  18. 18. Eficiencia <ul><li>Scala se compila a código de bytes ( bytecode ) muy próximo al Java nativo. </li></ul><ul><li>Es tan eficiente como Java, a veces es incluso más rápido cuando hace uso de la recursión de cola o en aplicaciones de código concurrente. </li></ul><ul><li>El único inconveniente es que la JVM puede tardar más en cargar la aplicación debido a que el compilador de Scala genera un gran número de clases. Aunque esto va mejorando con cada nueva versión del compilador (scalac). </li></ul>Cuso 08/09 El lenguaje Scala.
  19. 19. Eficiencia <ul><li>Los resultados obtenidos comparando el Factorial en Java como en Scala usando recursión de cola son: </li></ul>Cuso 08/09 El lenguaje Scala.
  20. 20. Traits: Unidades componibles de comportamiento <ul><li>Los traits son sencillos pero potentes mecanismos de composición. </li></ul><ul><li>Un trait es esencialmente un conjunto de métodos parametrizados. </li></ul><ul><li>En Scala las clases aún están organizadas en una jerarquía de herencia simple, pero con los traits podemos definir un comportamiento adicional respecto a sus superclases. </li></ul><ul><li>trait Padre { </li></ul><ul><li>private var hijos: List[Hijos] = Nil </li></ul><ul><li>def añadirHijo(hijo: Hijo) = </li></ul><ul><li>hijos = hijo :: hijos </li></ul><ul><li>def obtenerHijos = hijos.clone </li></ul><ul><li>} </li></ul>Cuso 08/09 El lenguaje Scala.
  21. 21. Traits: Unidades componibles de comportamiento <ul><li>Clase base: </li></ul><ul><li>class Hombre( val nombre: String) extends SerHumano </li></ul><ul><li>Composición con mixins estática y uso: </li></ul><ul><li> class Hombre( val nombre: String) extends SerHumano with Padre </li></ul><ul><li> </li></ul><ul><li> val juan = new Hombre(&quot;Juan&quot;) </li></ul><ul><li>juan.añadirHijo( new Hijo(&quot;Jose&quot;)) </li></ul><ul><li>Composición con mixins dinámica y uso: </li></ul><ul><li>val juan = new Hombre(&quot;Juan&quot;) with Padre </li></ul><ul><li>juan.añadirHijo( new Hijo(&quot;Jose&quot;)) </li></ul>Cuso 08/09 El lenguaje Scala.
  22. 22. Traits: Unidades componibles de comportamiento <ul><li>Los traits nos permiten simular la herencia múltiple: </li></ul><ul><li>val orden = new Orden(cliente) </li></ul><ul><li> with Entidad </li></ul><ul><li> with InventarioCjtoItems </li></ul><ul><li> with LimiteDeCompre </li></ul><ul><li> with Notificaci ó nPorCorreo </li></ul><ul><li> with ACL </li></ul><ul><li> with Transaccion </li></ul><ul><li>El orden en que se añaden los traits es importante. </li></ul>Cuso 08/09 El lenguaje Scala.
  23. 23. Lenguajes de dominio específico (DSLs) <ul><li>Las características de Scala lo hacen ideal para el diseño de lenguajes de dominio específico. </li></ul><ul><li>Ya se ha creado alguno como Apache Camel . Este DSL permite integrar sistemas heterogéneos haciendo uso de ficheros XML. </li></ul><ul><li>Scala soporta XML a nivel de lenguaje y no de biblioteca. </li></ul><ul><li>class Entrada( var titulo:String, val enlace:String, val id:String, var fecha:Date, </li></ul><ul><li>var sumario: String) { </li></ul><ul><li> def toAtom = </li></ul><ul><li><entry> </li></ul><ul><li> <link href ={enlace}/> </li></ul><ul><li> <id>{id}</id> </li></ul><ul><li> <updated>{fecha}</updated> </li></ul><ul><li> <summary>{sumario}</summary> </li></ul><ul><li> </entry> </li></ul><ul><li>} </li></ul><ul><li>Estos ficheros son muy sencillos de manipular gracias al pattern matching. </li></ul>Cuso 08/09 El lenguaje Scala.
  24. 24. Herramientas <ul><li>El conjunto de herramientas para el desarrollo en Scala es muy completo. </li></ul><ul><li>Compilador e intérprete: scalac y scala . </li></ul><ul><li>Plugins para los IDEs más usados: </li></ul><ul><ul><li>Eclispe </li></ul></ul><ul><ul><li>IntelliJ </li></ul></ul><ul><ul><li>Netbeans </li></ul></ul><ul><li>Modo para Emacs. </li></ul><ul><li>Frameworks para tests: Specs, ScalaCheck, ScalaTest, SUnit... </li></ul><ul><li>Framework web: Lift (similar a Ruby on Rails). </li></ul><ul><li>Otros frameworks: Sweet, Slinky y Pinky. </li></ul><ul><li>Building: Maven, Ant, SBT (Simple Build Tool). </li></ul>Cuso 08/09 El lenguaje Scala.
  25. 25. ¿Quién lo usa? <ul><li>Compañías: </li></ul><ul><ul><li>Twitter: Backend (cola de mensajes) </li></ul></ul><ul><ul><li>Sony Pictures: Middleware (capa de conversión/traducción) </li></ul></ul><ul><ul><li>Nature.com </li></ul></ul><ul><ul><li>SAP community </li></ul></ul><ul><ul><li>Reaktor Innovations </li></ul></ul><ul><ul><li>Mimesis Republic: juegos multijugador online </li></ul></ul><ul><ul><li>EDF Trading: inversiones bursátiles </li></ul></ul><ul><li>Proyectos Open Source: </li></ul><ul><ul><li>Lift: Framework de aplicaciones web similar a Ruby on Rails. </li></ul></ul><ul><ul><li>NetLogo: Lenguaje de programación multiagente. </li></ul></ul><ul><ul><li>Isabelle: Demostrador de teoremas - Intefaz de usuario </li></ul></ul>Cuso 08/09 El lenguaje Scala.
  26. 26. ¿Quién lo usa? <ul><li>Universidades: </li></ul><ul><ul><li>Programming Methods Group - Escuela Politécnica Federal de Lausana (EPFL), Suiza. </li></ul></ul><ul><ul><li>Program Structures and Data Organization Institute (IPD) - Universidad de Karlsruhe, Alemania. </li></ul></ul><ul><li>Tesis: </li></ul><ul><ul><li>Object-Oriented Pattern Matching. Burak Emir. EPFL Oct-2007. </li></ul></ul><ul><ul><li>An Object-Oriented Programming Model for Event-Based Actors. Philipp Haller. EPFL May-2006. </li></ul></ul><ul><ul><li>A Typed Intermediate Language and Algorithms for Compiling Scala by Successive Rewritings. Philippe Altherr. EPFL Mar-2006. </li></ul></ul><ul><ul><li>Foundations for Scala: Semantics and Proof of Virtual Types. Vincent Cremet. EPFL May-2006. </li></ul></ul><ul><ul><li>Compiling Scala for the Java Virtual Machine. Michel Schinz. EPFL Sep-2005. </li></ul></ul>Cuso 08/09 El lenguaje Scala.
  27. 27. Conclusiones <ul><li>Scala le permite: </li></ul><ul><ul><li>Crear código altamente escalable. </li></ul></ul><ul><ul><li>Aprovecha la arquitecturas paralelas de hardware (como CPUs multi-core). </li></ul></ul><ul><ul><li>Creación de Lenguaje de Dominio Específico (DSL). </li></ul></ul><ul><li>Factores que trabajan a favor del programador: </li></ul><ul><ul><li>Scala compila a bytecode de Java, se ejecuta en la JVM. </li></ul></ul><ul><ul><li>Se basa en principios funcionales de Haskell y Meta Lenguaje. </li></ul></ul><ul><ul><li>Hace uso intensivo de inferencia de tipos. </li></ul></ul><ul><ul><ul><li>El compilador analiza el código profundamente para determinar de que tipo es un valor en particular, sin intervención del programador. </li></ul></ul></ul><ul><ul><li>Scala no fue desarrollado por capricho, y no será abandonado de la misma manera. </li></ul></ul>Cuso 08/09 El lenguaje Scala.
  28. 28. Java vs Scala. <ul><li>Nuestra conclusión es que Scala es un mejor Java. </li></ul>Cuso 08/09 El lenguaje Scala.
  29. 29. Aplicación <ul><li>Productor/Consumidor </li></ul><ul><li>con actores </li></ul>Cuso 08/09 El lenguaje Scala.
  30. 30. Bibliografía <ul><li>Página principal del lenguaje. Disponible online www.scala-lang.org </li></ul><ul><li>Martin Odersky. Scala By Example. Mayo 2009. Disponible online www.scala-lang.org/docu/files/ScalaByExample.pdf </li></ul><ul><li>Michel Schinz, Philipp Haller. A Scala Tutorial for Java programmers v1.3. Marzo 2009. Disponible online http://www.scala-lang.org/docu/files/ScalaTutorial.pdf </li></ul><ul><li>M. Odersky, P. Altherr, V. Cremet, I. Dragos, G. Dubochet, B. Emir, S. McDirmid, S. Micheloud, N. Mihaylov, M. Schinz, E. Stenman, L. Spoon, M. Zenger . An Overview of the Scala Programming Language. Second Edition. 2006. Disponible online http://www.scala-lang.org/node/197 </li></ul><ul><li>Martin Odersky. The Scala Language Specification v2.7. Marzo 2009. Disponible online www.scala-lang.org/docu/files/ScalaReference.pdf </li></ul>Cuso 08/09 El lenguaje Scala.
  31. 31. Bibliografía <ul><li>Artículos, charlas y tesis sobre Scala. Disponible online www.scala-lang.org/node/143 </li></ul><ul><li>Descarga de la plataforma Scala. Disponible online www.scala-lang.org/downloads </li></ul><ul><li>Herramientas para el desarrollo con Scala. Disponible online www.scala-lang.org/node/91 </li></ul><ul><li>A Conversation with Steve Jenson, Alex Payne, and Robey Pointer by Bill Venners Twitter on Scala. Abril 2009. Disponible online ww.artima.com/scalazine/articles/twitter_on_scala.html </li></ul><ul><li>Jonas Bonér. Pragmatic Real-World Scala. 2009. Disponible online www.slideshare.net/jboner/pragmatic-real-world-scala-45-min-presentation </li></ul>Cuso 08/09 El lenguaje Scala.
  32. 32. ¿PREGUNTAS? <ul><li>GRACIAS </li></ul>Cuso 08/09 El lenguaje Scala.

×