EL LENGUAJE SCALA
Daniel Gallardo Alcalde
José Luis Martín Morales
Curso 08/09
Í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.

El lenguaje Scala.
2
Cuso 08/09
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.
3
El lenguaje Scala.
Cuso 08/09
¿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.
4
El lenguaje Scala.
Cuso 08/09
¿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

El lenguaje Scala.
5
Cuso 08/09
¿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.
El lenguaje Scala.
6
Cuso 08/09
Scala es funcional
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 ([[email protected],...
scala> matrix.exists(row => row.forall(0 ==))
res13: Boolean = false
El lenguaje Scala.
7
Cuso 08/09
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).hashCode
res8: Int = 1
scala> (1).+(2)
res10: Int = 3
8
El lenguaje Scala.
Cuso 08/09
Las funciones son objetos

Si las funciones son valores, y los
valores son objetos, entonces las

Así las funciones son interpretadas
como objetos con métodos apply.
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
}
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
}
9
El lenguaje Scala.
Cuso 08/09
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.
10
El lenguaje Scala.
Cuso 08/09
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

11
El lenguaje Scala.
Cuso 08/09
Tipificado estático

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
}
El lenguaje Scala.
12
Cuso 08/09
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.
El lenguaje Scala.
Cuso 08/09
13
Expresivo y ligero

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”))
14
El lenguaje Scala.
Cuso 08/09
Alto nivel

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)
15
El lenguaje Scala.
Cuso 08/09
Conciso
// Java
public 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;
}
}
El lenguaje Scala.
// Scala
class 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.
16
Cuso 08/09
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
El lenguaje Scala.
17
Cuso 08/09
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).

18
El lenguaje Scala.
Cuso 08/09
Eficiencia

Los resultados obtenidos comparando el Factorial en
Java como en Scala usando recursión de cola son:
19
El lenguaje Scala.
Cuso 08/09
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
}
20
El lenguaje Scala.
Cuso 08/09
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
21
juan.añadirHijo(new Hijo("Jose"))
El lenguaje Scala.
Cuso 08/09
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.
El lenguaje Scala.
22
Cuso 08/09
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.
El lenguaje Scala.
Cuso 08/09
23
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).
24
El lenguaje Scala.
Cuso 08/09
¿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

El lenguaje Scala.
Cuso 08/09
25
¿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.
El lenguaje Scala.
Cuso 08/09
26
Conclusiones
Scala 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.
El lenguaje Scala.
27
Cuso 08/09
Java vs Scala.
Nuestra conclusión es que Scala es un mejor Java.
28
El lenguaje Scala.
Cuso 08/09
Aplicación
Productor/Consumidor
con actores
29
El lenguaje Scala.
Cuso 08/09
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
30
El lenguaje Scala.
Cuso 08/09
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-scala45-min-presentation
31
El lenguaje Scala.
Cuso 08/09
¿PREGUNTAS?
GRACIAS
32
El lenguaje Scala.
Cuso 08/09
Descargar

Scala