32
EL LENGUAJE SCALA Daniel Gallardo Alcalde José Luis Martín Morales Curso 08/09

EL LENGUAJE SCALA Daniel Gallardo Alcalde José Luis Martín Morales Curso 08/09

Embed Size (px)

Citation preview

Page 1: EL LENGUAJE SCALA Daniel Gallardo Alcalde José Luis Martín Morales Curso 08/09

EL LENGUAJE SCALA

Daniel Gallardo Alcalde

José Luis Martín Morales

Curso 08/09

Page 2: EL LENGUAJE SCALA Daniel Gallardo Alcalde José Luis Martín Morales Curso 08/09

Cuso 08/09

2

El lenguaje Scala.

ÍNDICE Introducción – motivaciones. ¿Qué es Scala? Influencias de otros lenguajes. Características de Scala. Traits. Lenguajes de dominio específico (DSLs). Herramientas. ¿Quién lo usa? Conclusiones. Aplicación. Bibliografía. 2

Page 3: EL LENGUAJE SCALA Daniel Gallardo Alcalde José Luis Martín Morales Curso 08/09

Cuso 08/09

3

El lenguaje Scala.

Software de componentes - estado del arte

En principio, el software debería ser desarrollado a partir de partes reusable ("componentes").

En la práctica, el software se escribe a menudo desde cero, más como un arte que como una industria.

Los lenguajes de programación tienen parte de la culpa.

La mayoría de los lenguajes existentes ofrecen sólo un soporte limitado para los componentes.

Page 4: EL LENGUAJE SCALA Daniel Gallardo Alcalde José Luis Martín Morales Curso 08/09

Cuso 08/09

4

El lenguaje Scala.

¿Cómo hacerlo mejor?

Hipótesis 1: Los lenguajes para componentes necesitan ser escalables; los mismos conceptos deben ser válidos para describir sistemas pequeños y grandes.

Hipótesis 2: La escalabilidad puede ser lograda unificando y generalizando conceptos de la programación funcional y la orientada a objetos.

Page 5: EL LENGUAJE SCALA Daniel Gallardo Alcalde José Luis Martín Morales Curso 08/09

Cuso 08/09

5

El lenguaje Scala.

¿Por qué unificar PF y POO? Ambas tienen cualidades que se complementan

para la composición.Programación funcional: Hace fácil desarrollar

cosas interesantes desde partes sencillas, usando funciones de orden superior tipos algebraicos y pattern matching polimorfismo paramétrico

Programación orientada a objetos: Hace fácil adaptar y extender sistemas complejos, usando especialización (subclases) y herencia configuraciones dinámicas clases como abstracciones parciales

Page 6: EL LENGUAJE SCALA Daniel Gallardo Alcalde José Luis Martín Morales Curso 08/09

Cuso 08/09

6

El lenguaje Scala.

¿Qué es Scala? Scala es un lenguaje funcional y orientado a

objetos completamente interoperable con Java (la versión para .NET no está al día).

Elimina algunas de las construcciones más antiguas de estos entornos y a cambio añade: Un modelo de objetos uniforme. Pattern matching y funciones de orden superior. Nuevas formas para abstraer y componer

programas.

Su diseño comenzó en 2001en la Escuela Politécnica Federal de Lausana (Suiza) por Martin Odersky.

6

Page 7: EL LENGUAJE SCALA Daniel Gallardo Alcalde José Luis Martín Morales Curso 08/09

Cuso 08/09

7

El lenguaje Scala.

Scala es un lenguaje funcional en el sentido de que cada función es un valor.

Las funciones pueden ser anónimas, anidadas, aplicadas parcialmente (currying).

Muchas funciones útiles de orden superior son implementadas como métodos de clases de Scala.

scala> val matrix = Array(Array(1, 0, 0), | Array(0, 1, 0), | Array(0, 0, 1))

matrix: Array[Array[Int]] = Array ([I@164da25,...

scala> matrix.exists(row => row.forall(0 ==))res13: Boolean = false

Scala es funcional

Page 8: EL LENGUAJE SCALA Daniel Gallardo Alcalde José Luis Martín Morales Curso 08/09

Cuso 08/09

8

El lenguaje Scala.

Scala es orientado a objetos Cada valor es un objeto. Cada operación es una llamada a un método. Las excepciones a estas reglas en Java (como

los tipos primitivos, statics) son eliminadas.

scala> (1).hashCoderes8: Int = 1

scala> (1).+(2)res10: Int = 3

Page 9: EL LENGUAJE SCALA Daniel Gallardo Alcalde José Luis Martín Morales Curso 08/09

Cuso 08/09

9

El lenguaje Scala.

Si las funciones son valores, y los valores son objetos, entonces las funciones son objetos.

La función de tipo S => T es equivalente a scala.Function1[S, T], donde Function1 se define como sigue:

trait Function1[-S, +T] {def apply(x: S): T

}

Así las funciones son interpretadas como objetos con métodos apply.

Por ejemplo, la función anónima sucesor

(x: Int) => x + 1

se expande a:

new Function1[Int, Int]{def apply(x: Int) =

x + 1}

Las funciones son objetos

Page 10: EL LENGUAJE SCALA Daniel Gallardo Alcalde José Luis Martín Morales Curso 08/09

Cuso 08/09

10

El lenguaje Scala.

Influencias de otros lenguajes

Influencias principales del diseño de Scala: Java, C# por su sintaxis, tipos básicos y bibliotecas.

Smalltalk por su modelo de objetos uniforme. Eiffel por su principio de acceso uniforme. Beta por la anidación sistemática. ML y Haskell por muchos de sus aspectos funcionales. OCaml, OHaskell, PLT-Scheme, como otras

combinaciones (aunque menos integradas) de PF y POO.

Pizza, Multi Java, Nice y otras extensiones de la plataforma Java con ideas funcionales.

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.

Page 11: EL LENGUAJE SCALA Daniel Gallardo Alcalde José Luis Martín Morales Curso 08/09

Cuso 08/09

11

El lenguaje Scala.

Características de Scala Tipificado estático Interoperabilidad Expresivo y ligero De alto nivel Conciso Orientado a objetos puro Perezoso Cierres léxicos (closures) Eficiente

Page 12: EL LENGUAJE SCALA Daniel Gallardo Alcalde José Luis Martín Morales Curso 08/09

Cuso 08/09

12

El lenguaje Scala.

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.

Scala produce la sensación de estar programando en un lenguaje de scripting moderno pero, sin renunciar a los tipos estáticos.

No es necesario especificar el tipo de cada expresión porque Scala posee inferencia de tipos.

object InferenceTest1 extends Application { val x = 1 + 2 * 3 // el tipo de x es Int

val y = x.toString() // el tipo de y es String

}

Tipificado estático

Page 13: EL LENGUAJE SCALA Daniel Gallardo Alcalde José Luis Martín Morales Curso 08/09

Cuso 08/09

13

El lenguaje Scala.

Interoperabilidad Scala encaja sin fisuras en un entorno Java.

Puede invocar métodos Java, seleccionar campos Java, heredar de clases Java, implementar interfaces Java, etc.

Nada de esto requiere código puente o descripción de interfaces.

El código Java también puede usar fácilmente código Scala.

El código Scala es traducido a casi el mismo código de bytes que Java.

Page 14: EL LENGUAJE SCALA Daniel Gallardo Alcalde José Luis Martín Morales Curso 08/09

Cuso 08/09

14

El lenguaje Scala.

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.

val telefonos = Map(“Luis” -> “123456”,

“Sara” -> “654321”)telefonos += (“Carmen” -> “987654”)println(telefonos(“Luis”))

Expresivo y ligero

Page 15: EL LENGUAJE SCALA Daniel Gallardo Alcalde José Luis Martín Morales Curso 08/09

Cuso 08/09

15

El lenguaje Scala.

La eficacia del lenguaje produce también una funcionalidad de alto nivel mayor que en otros lenguajes. Según Java:

boolean hasUpperCase = false;

for (int i = 0; i < nom.length(); i++){if

(Character.isUpperCase(nom.charAt(i))) {hasUpperCase = true;break;

}}

Según Scala:val hasUpperCase = nom.exists(_.isUpperCase)

Alto nivel

Page 16: EL LENGUAJE SCALA Daniel Gallardo Alcalde José Luis Martín Morales Curso 08/09

Cuso 08/09

16

El lenguaje Scala.

Conciso// Javapublic class Persona {

private String nombre; private int edad;public Persona(String nombre, int edad) {this.nombre = nombre;this.edad = edad;}public String getNombre() {return nombre;}public int getEdad() {return edad;}public void setNombre(String nombre) {this.nombre = nombre;}public void setEdad(int edad) {this.edad = edad;}

}

// Scalaclass Persona (

var nombre: String,var edad: int)

La reducción media de líneas de código es ≥ 2 debido a la sintaxis concisa y a mejores capacidades de abstracción.

Scala es un Java más limpio.

Page 17: EL LENGUAJE SCALA Daniel Gallardo Alcalde José Luis Martín Morales Curso 08/09

Cuso 08/09

17

El lenguaje Scala.

Valores perezosos Secuencia de Fibonacci:

scala> lazy val fib: Stream[Int] = Stream.cons(0, | Stream.cons(1, fib.zip(fib.tail).map(p => p._1 + p._2)))

fib: Stream[Int]= Stream(0,?)

Se definen manualmente los dos primeros valores de la secuencia, entonces recursivamente se define un stream infinito de los restantes términos. fib es la secuencia de Fibonacci empezando en cero (0, 1, 1, 2, 3, ...). fib.tail es la secuencia empezando en uno (1, 1, 2, 3, 5, ...).fib.zip.(fib.tail) es la secuencia de pares ((0, 1), (1, 1), (1, 2), (2, 3), ...).Entonces usamos map para los elementos de cada par (._1, ._2) y completar la definición recursiva del resto de fib.

scala> fib.take(13).print 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, Stream.empty

Page 18: EL LENGUAJE SCALA Daniel Gallardo Alcalde José Luis Martín Morales Curso 08/09

Cuso 08/09

18

El lenguaje Scala.

Eficiencia Scala se compila a código de bytes

(bytecode) muy próximo al Java nativo. 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.

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).

Page 19: EL LENGUAJE SCALA Daniel Gallardo Alcalde José Luis Martín Morales Curso 08/09

Cuso 08/09

19

El lenguaje Scala.

Eficiencia Los resultados obtenidos comparando el

Factorial en Java como en Scala usando recursión de cola son:

Page 20: EL LENGUAJE SCALA Daniel Gallardo Alcalde José Luis Martín Morales Curso 08/09

Cuso 08/09

20

El lenguaje Scala.

Traits: Unidades componibles de comportamiento Los traits son sencillos pero potentes mecanismos de

composición. Un trait es esencialmente un conjunto de métodos

parametrizados. 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.

trait Padre { private var hijos: List[Hijos] = Nil

def añadirHijo(hijo: Hijo) =

hijos = hijo :: hijos

def obtenerHijos = hijos.clone

}

Page 21: EL LENGUAJE SCALA Daniel Gallardo Alcalde José Luis Martín Morales Curso 08/09

Cuso 08/09

21

El lenguaje Scala.

Traits: Unidades componibles de comportamiento Clase base:

class Hombre(val nombre: String) extends SerHumano

Composición con mixins estática y uso:

class Hombre(val nombre: String) extends SerHumano with Padre

val juan = new Hombre("Juan")

juan.añadirHijo(new Hijo("Jose"))

Composición con mixins dinámica y uso:

val juan = new Hombre("Juan") with Padre

juan.añadirHijo(new Hijo("Jose"))

Page 22: EL LENGUAJE SCALA Daniel Gallardo Alcalde José Luis Martín Morales Curso 08/09

Cuso 08/09

22

El lenguaje Scala.

Traits: Unidades componibles de comportamiento Los traits nos permiten simular la herencia

múltiple:

val orden = new Orden(cliente)

with Entidad

with InventarioCjtoItems

with LimiteDeCompre

with NotificaciónPorCorreo

with ACL

with Transaccion

El orden en que se añaden los traits es importante.

Page 23: EL LENGUAJE SCALA Daniel Gallardo Alcalde José Luis Martín Morales Curso 08/09

Cuso 08/09

23

El lenguaje Scala.

Lenguajes de dominio específico (DSLs) Las características de Scala lo hacen ideal para el diseño de

lenguajes de dominio específico. Ya se ha creado alguno como Apache Camel. Este DSL permite

integrar sistemas heterogéneos haciendo uso de ficheros XML. Scala soporta XML a nivel de lenguaje y no de biblioteca.

class Entrada(var titulo:String, val enlace:String, val id:String, var fecha:Date,

var sumario: String) { def toAtom =

<entry> <link href ={enlace}/>

<id>{id}</id> <updated>{fecha}</updated> <summary>{sumario}</summary>

</entry> }

Estos ficheros son muy sencillos de manipular gracias al pattern matching.

Page 24: EL LENGUAJE SCALA Daniel Gallardo Alcalde José Luis Martín Morales Curso 08/09

Cuso 08/09

24

El lenguaje Scala.

Herramientas El conjunto de herramientas para el desarrollo en

Scala es muy completo. Compilador e intérprete: scalac y scala. Plugins para los IDEs más usados:

Eclispe IntelliJ Netbeans

Modo para Emacs. Frameworks para tests: Specs, ScalaCheck, ScalaTest,

SUnit... Framework web: Lift (similar a Ruby on Rails). Otros frameworks: Sweet, Slinky y Pinky. Building: Maven, Ant, SBT (Simple Build Tool).

Page 25: EL LENGUAJE SCALA Daniel Gallardo Alcalde José Luis Martín Morales Curso 08/09

Cuso 08/09

25

El lenguaje Scala.

¿Quién lo usa? Compañías:

Twitter: Backend (cola de mensajes) Sony Pictures: Middleware (capa de

conversión/traducción) Nature.com SAP community Reaktor Innovations Mimesis Republic: juegos multijugador online EDF Trading: inversiones bursátiles

Proyectos Open Source: Lift: Framework de aplicaciones web similar a Ruby on

Rails. NetLogo: Lenguaje de programación multiagente. Isabelle: Demostrador de teoremas - Intefaz de usuario

Page 26: EL LENGUAJE SCALA Daniel Gallardo Alcalde José Luis Martín Morales Curso 08/09

Cuso 08/09

26

El lenguaje Scala.

¿Quién lo usa? Universidades:

Programming Methods Group - Escuela Politécnica Federal de Lausana (EPFL), Suiza.

Program Structures and Data Organization Institute (IPD) - Universidad de Karlsruhe, Alemania.

Tesis: Object-Oriented Pattern Matching. Burak Emir. EPFL Oct-

2007. An Object-Oriented Programming Model for Event-Based

Actors. Philipp Haller. EPFL May-2006. A Typed Intermediate Language and Algorithms for

Compiling Scala by Successive Rewritings. Philippe Altherr. EPFL Mar-2006.

Foundations for Scala: Semantics and Proof of Virtual Types. Vincent Cremet. EPFL May-2006.

Compiling Scala for the Java Virtual Machine. Michel Schinz. EPFL Sep-2005.

Page 27: EL LENGUAJE SCALA Daniel Gallardo Alcalde José Luis Martín Morales Curso 08/09

Cuso 08/09

27

El lenguaje Scala.

ConclusionesScala le permite:

Crear código altamente escalable. Aprovecha la arquitecturas paralelas de hardware

(como CPUs multi-core). Creación de Lenguaje de Dominio Específico (DSL).

Factores que trabajan a favor del programador: Scala compila a bytecode de Java, se ejecuta en la JVM. Se basa en principios funcionales de Haskell y Meta

Lenguaje. Hace uso intensivo de inferencia de tipos.

El compilador analiza el código profundamente para determinar de que tipo es un valor en particular, sin intervención del programador.

Scala no fue desarrollado por capricho, y no será abandonado de la misma manera.

Page 28: EL LENGUAJE SCALA Daniel Gallardo Alcalde José Luis Martín Morales Curso 08/09

Cuso 08/09

28

El lenguaje Scala.

Java vs Scala.

Nuestra conclusión es que Scala es un mejor Java.

Page 29: EL LENGUAJE SCALA Daniel Gallardo Alcalde José Luis Martín Morales Curso 08/09

Cuso 08/09

29

El lenguaje Scala.

Aplicación

Productor/Consumidorcon actores

Page 30: EL LENGUAJE SCALA Daniel Gallardo Alcalde José Luis Martín Morales Curso 08/09

Cuso 08/09

30

El lenguaje Scala.

Bibliografía Página principal del lenguaje.

Disponible online www.scala-lang.org Martin Odersky. Scala By Example. Mayo 2009.

Disponible online www.scala-lang.org/docu/files/ScalaByExample.pdf

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

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

Martin Odersky. The Scala Language Specification v2.7. Marzo 2009. Disponible online www.scala-lang.org/docu/files/ScalaReference.pdf

Page 31: EL LENGUAJE SCALA Daniel Gallardo Alcalde José Luis Martín Morales Curso 08/09

Cuso 08/09

31

El lenguaje Scala.

Bibliografía Artículos, charlas y tesis sobre Scala.

Disponible online www.scala-lang.org/node/143 Descarga de la plataforma Scala.

Disponible online www.scala-lang.org/downloads Herramientas para el desarrollo con Scala.

Disponible online www.scala-lang.org/node/91 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

Jonas Bonér. Pragmatic Real-World Scala. 2009. Disponible online www.slideshare.net/jboner/pragmatic-real-world-scala-45-min-presentation

Page 32: EL LENGUAJE SCALA Daniel Gallardo Alcalde José Luis Martín Morales Curso 08/09

Cuso 08/09

32

El lenguaje Scala.

¿PREGUNTAS?

GRACIAS