Scala Overview

Download Scala Overview

Post on 15-Jan-2015

2.587 views

Category:

Technology

1 download

Embed Size (px)

DESCRIPTION

Un vistazo general e introductorio al lenguaje de programacin Scala

TRANSCRIPT

<ul><li> 1. Scala: Un lenguaje escalable para la JVM Miguel Pastor</li></ul><p> 2. Scala: Un lenguaje escalable para la JVMMiguel Pastor 2 3. Tabla de contenidos1.-Por qu Scala? 1 1.1.-Qu es Scala? 1 1.1.1.-Orientacin a objetos2 1.1.2.-Lenguaje funcional 2 1.1.3.-Lenguaje multiparadigma3 1.1.4.-Lenguaje extensible y escalable3 1.1.5.-Ejecucin sobre la JVM 4 1.2.-En crisis4 1.2.1.-Ley de Moore 4 1.2.2.-Programando para multincleo 4 1.3.-Objetivos52.-Fundamentos de Scala7 2.1.-Clases y objetos 7 2.2.-Reglas de inferencia de puntos y coma8 2.3.-Singleton objects9 2.4.-Objetos funcionales9 2.4.1.-Nmeros racionales 9 2.4.2.-Constructores10 2.4.3.-Sobreescritura de mtodos10 2.4.4.-Precondiciones 10 2.4.5.-Atributos y mtodos 11 2.4.6.-Operadores 12 2.5.-Funciones y closures 12 2.5.1.-Funciones first-class13 2.5.2.-Closures 13 2.5.3.-Tail recursion 14 2.6.-Currying 14 2.7.-Traits 15 2.7.1.-Cmo funcionan los traits?15 2.7.2.-Ejemplo: objetos rectangulares 16 2.7.3.-Uso de traits como stackable modifications 17 2.7.4.-Traits: si o no?19 2.8.-Patrones y clases case 20 2.8.1.-Clases case20 2.8.2.-Patrones: estructura y tipos 21 2.8.2.1.-Patrones wildcard21 2.8.2.2.-Patrones constantes21 2.8.2.3.-Patrones variables 21iii 4. 2.8.2.4.-Patrones constructores 22 2.8.2.5.-Patrones de secuencia22 2.8.2.6.-Patrones tipados 22 2.9.-Conclusiones 233.-Actors y concurrencia 24 3.1.-Problemtica 24 3.2.-Modelo de actores25 3.3.-Actores en Scala 253.3.1.-Buenas prcticas26 3.3.1.1.-Ausencia de bloqueos 26 3.3.1.2.-Comunicacin exclusiva mediante mensajes 27 3.3.1.3.-Mensajes inmutables27 3.3.1.4.-Mensajes autocontenidos27 3.4.-Un ejemplo completo283.4.1.-Especificacin del problema 283.4.2.-Implementacin del producer y coordinator 283.4.3.-Interfaz iterator 294.-Conclusiones y trabajo futuro 31 4.1.-Conclusiones 31 4.2.-Lneas de trabajo32A.-Modelo de objetos de Scala33B.-Producers 34 B.1.-Cdigo fuente completo 34Bibliografa 37 iv 5. Por qu Scala? Captulo 1. Por qu Scala?Durante este captulo se cubrirn aspectos relativos como qu es Scala, caractersticas dealto nivel del lenguaje o por qu deberamos escoger Scala como nuestro siguiente lenguajede programacin. En la parte final del mismo analizaremos los objetivos perseguidos con eldesarrollo de este trabajo as como la estructura del mismo.Debido a la creciente proliferacin de una gran cantidad de diferentes lenguajes enlas plataformas JVM, .NET, OTP entre otras muchas ha surgido el dilema entre losdesarrolladores acerca de cul debera ser el siguiente lenguaje de progragramacin que sedebera aprender. Entre la amplia variedad de lenguajes disponibles como Groovy, Erlang,Ruby o F# por qu deberamos aprender Scala ?.Durante este captulo analizaremos las caractersticas de alto nivel del lenguajeestableciendo una comparacin con aquellos lenguajes con los que estemos msfamiliarizados. Los programadores provenientes de la orientacin a objetos as comoaquellos cuyo origen es la programacin funcional rpidamente se sentirn cmodos conScala dado que este lenguaje soporta ambos paradigmas. Scala es uno de esos extraoslenguajes en los que se integran de manera satisfactoria las caractersticas de los lenguajesorientados a objetos y los funcionales.1.1. Qu es Scala?Scala es un lenguaje de propsito general diseado para expresar los patrones deprogramacin ms comunes de una manera sencilla, elegante y segura. Integra de manerasencilla caractersticas de orientacin a objetos y lenguajes funcionales, permitiendo de estemodo que los desarrolladores puedan ser ms productivos. Su creador, Martin Odersky, y suequipo comenzaron el desarrollo de este nuevo lenguaje en el ao 2001, en el laboratoriode mtodos de programacin en EPFL1Scala hizo su aparacin pblica sobre la plataforma JVM (Java Virtual Machine) en enero de2004 y unos meses despus haria lo propio sobre la plataforma .NET.Aunque se trata de un elemento relativamente novedoso dentro del espacio de los lenguajesde programacin, ha adquirido una notable popularidad la cual se acrecenta da tras da.1cole Polytechnique Fdrale de Lausanne1 6. Por qu Scala?1.1.1. Orientacin a objetosLa popularidad de lenguajes como Java, C# o Ruby han hecho que la programacinorientada a objetos sea un paradigma ampliamente aceptado entre la mayora dedesarrolladores. Aunque existen numerosos lenguajes orientados a objetos en el ecosistemaactual nicamente podramos encajar unos pocos si nos ceimos a una definicin estrictade orientacin a objetos. Un lenguaje orientado a objetos "puro" debera presentar lassiguientes caractersticas: Encapsulamiento/ocultacin de informacin. Herencia. Polimorfismo/Enlace dinmico. Todos los tipos predefinidos son objetos. Todas las operaciones son llevadas a cabo mediante en envo de mensajes a objetos. Todos los tipos definidos por el usuario son objetos.Scala da soporte a todas las caractersticas anteriores mediante la utilizacin de un modelopuro de orientacin a objetos muy similar al presentado por Smalltalk (lenguaje creado porAlan Kay sobre el ao 1980).2De manera adicional a todas las caracterscticas puras de un lenguaje orientado a objetospresentadas anteriormente, Scala aade algunas innovaciones en el espacio de los lenguajesorientados a objetos: Composicin modular de mixin. Mecanismo que permite la composicin de clases para eldiseo de componentes reutilizables evitando los problemas presentados por la herenciamltiple. Similar a los interfaces Java y las clases abstractas. Por una parte se puedendefinir mltiples "contratos" (del mismo modo que los interfaces). Por otro lado, sepodran tener implementaciones concretas de los mtodos. Self-type. Los mixin no dependen de ningn mtodo y/o atributo de aquellas clases con lasque se est entremezclando aunque en determinadas ocasiones ser necesario hacer usode las mismas. Esta capacidad es conocida en Scala como self-type3 Abstraccin de tipos. Existen dos mecanismos principales de abstraccin en los lenguajesde programacin: la parametrizacin y los miembros abstractos. Scala soporta ambosestilos de abstraccin de manera uniforme para tipos y valores.1.1.2. Lenguaje funcionalLa programacin funcional es un paradigma en el que se trata la computacin como laevaluacin de funciones matemticas y se evitan los programas con estado y datos quepuedan ser modificados. Se ofrece adopta una visin ms matemtica del mundo en el que2http://en.wikipedia.org/wiki/Smalltalk2 7. Por qu Scala?los programas estn compuestos por numerosas funciones que esperan una determinadaentrada y producen una determinada salida y, en muchas ocasiones, otras funciones.Otro de los aspectos de la programacin funcional es la ausencia de efectos colateralesgracias a los cuales los programas desarrollados son mucho ms sencillos de comprender yprobar. Adicionalmente, se facilita la programacin concurrente, evitando que se conviertaen un problema gracias a la ausencia de cambio.Los lenguajes de programacin que soportan este estilo de programacin deberan ofreceralgunas de las siguientes caractersticas: Funciones de primer nivel. Closures Asignacin simple. Evaluacin tarda Inferencia de tipos Optimizacin del tail call Efectos monadicEs importante tener claro que Scala no es un lenguaje funcional puro dado que en estetipo de lenguajes no se permiten las modificaciones y las variables se utilizan de maneramatemtica.4. Scala da soporte tanto a variables inmutables (tambien conocidas comovalues) como a variables que apuntan estados no permanentes1.1.3. Lenguaje multiparadigmaScala ha sido el primero en incorporar y unificar la programacin funcional y la orientacina objetos en un lenguaje estticamente tipado. La pregunta es por qu necesitamas ms deun estilo de programacin.El objetivo principal de la computacin multiparadigma es ofrecer un determinado conjuntode mecanismos de resolucin de problemas de modo que los desarrolladores puedanseleccionar la tcnica que mejor se adapte a las caractersticas del problema que se esttratando de resolver.1.1.4. Lenguaje extensible y escalableUno de los principales objetivos del diseo de Scala es la construccin de un lenguaje quepermita el crecimiento y la escalabilidad en funcin de la exigencia del desarrollador. Scalapuede ser utilizado como lenguaje de scripting as como tambin se puede adoptar en elproceso de construccin de aplicaciones empresariales. La conjuncin de su abastraccin de4Un ejemplo de lenguaje funcional puro sera Haskell 3 8. Por qu Scala?componentes, su sintaxis reducida, el soporte para la orientacin a objetos y funcional hancontribuido a que el lenguaje sea ms escalable.1.1.5. Ejecucin sobre la JVMLa caractersticas ms relevante de Java no es el lenguaje sino su mquina virtual (JVM), unapulida maquinaria que el equipo de HotSpot ha ido mejorando a lo largo de los aos. Puestoque Scala es un lenguaje basado en la JVM se integra a la perfeccin dentro con Java y suecosistema (herramientas, IDEs, libreras, . . .) por lo que no ser necesario desprenderse detodas las inversiones hechas en el pasado.El compilador de Scala genera bytecode siendo indistinguible, a este nivel, el cdigo escritoen Java y el escrito en Scala. Adicionalmente, puesto que se ejecuta sobre la JVM, se beneficiadel rendimiento y estabilidad de dicha plataforma. Y siendo un lenguaje de tipado estticolos programas construidos con Scala se ejecutan tan rpido como los programas Java.1.2. En crisisA pesar de las altas prestaciones que los procesadores estn adquiriendo, los desarrolladoressoftware encuentran los mecanismos para agotarla. El motivo es que, gracias al software,se estn resolviendo problemas muy complejos, y esta tendencia continuar creciendo, almenos en el futuro cercano.La pregunta clave es si los fabricantes de procesadores sern capaces de sostener la demandade potencia y velocidad exigida por los desarrolladores.1.2.1. Ley de MooreSi nos hacemos eco de la ley postulada por Moore por el ao 19655, el nmero de transistorespor circuito integrado se duplica cada dos aos aproximadamente. Sin embargo, muchosfabricantes estn tocando techo con esta ley6 y estn apostando por los procesadoresmultincleo. Las buenas noticias es que la potencia de los procesadores seguir creciendode manera notable aunque las malas noticias es que los programas actuales y entornos dedesarrollo necesitarn cambiar para hacer uso de las ventajas ofrecidas por una CPU convarios ncleos.1.2.2. Programando para multincleoCmo se puede beneficiar el software de la nueva relucin iniciada por los procesadoresmultimedia?5Concretamente la fecha data del 19 de Abril de 19656http://www.gotw.ca/publications/concurrency-ddj.htm 4 9. Por qu Scala?Concurrencia. La concuncurrencia ser, si no lo es ya, el modo en el que podremosescribir soluciones software que nos permitan resolver problemas complejos, distrubidos yempresariales, beneficindonos de la productividad ofrecida por mltiples ncleos. Al fin yal cabo, quin no desea software eficiente?.En el modelo tradicional de concurrencia basado en hilos los programas son "troceados" enmltiples unidades de ejecucin concurrentes (threads) en el que cada de ellos opera enun segmento de memoria compartida. En numerosas ocasiones el modelo anterior ocasiona"condiciones de carrera" complicadas de detectar as como siuaciones de "deadlocks" queocasionan inversiones de semanas completas intentando reproducir, aislar y subsanar elerror. El origen de todas estos problemas no radica en el modelo de hilos sino que resideen segmentos de memoria compartida. La programacin concurrente se ha convertido enun modelo demasiado complicado para los desarrolladores por lo que necesitaramos unmejor modelo de programacin concurrente que nos permita crear y mantener programasconcurrentes de manera sencilla.Scala adopta un enfoque completamente diferente a la problemtica de la concurrencia: elmodelo basado en actores. Un actor es un modelo matemtico de computacin concurrenteen el que se encapsulan datos, cdigo y su propio hilo de control, comunicndose de maneraasncrona mediante tcnicas de paso de mensajes inmutables. La arquitectura base de estemodelo est basada en polticas de comparticin cero y componentes ligeros.Haciendo un poco de historia, el modelo de actores fue propuesto por primera vez por CarlHewitt en el ao 1973 en el famoso artculo "A Universal Modular ACTOR Formalism forArtificial Intelligence " , para posteriormente ser mejorado por Gul Agha con su ACTORS: AModel of Concurrent Computation in Distributed Systems).El primer lenguaje que llev a cabo la implementacin de este modelo fue Erlang. Tras el xitoobtenido por el lenguaje en lugares tan populares como Ericsson (su lugar de nacimiento),Yahoo o Facebook, el modelo de actores se ha convertido en una alternativa viable parasolucionar la problemtica derivada de la concurrencia, por lo que Scala ha decidido adoptareste mismo enfoque.1.3. ObjetivosA lo largo de las secciones anteriores hemos descrito de manera superficial algunas de lascaractersticas ms relevantes del lenguaje Scala as como las motivaciones principales delmismo. El resto del trabajo estar dividido en las siguientes secciones: Durante la primera seccin, esta que nos ocupa, analizamos las caractersticas generalesdel lenguaje y los objetivos del presente documento. La segunda seccin abarcar los principales fundamentos del lenguaje, describiendo tantolos mecanismos funcionales como la orientacin a objetos, ambos disponibles de maneranativa en el lenguaje. Analizaremos, aunque no de manera excesivamente exhaustiva, el modelo deprogramacin concurrente propuesto por Scala (basado en una librera de actores).Construiremos una pequea serie de ejemplos que nos permita poner en marcha los5 10. Por qu Scala?conocimientos adquiridos, tanto aquellos relativos a la programacin concurrente comolos analizados en la primera parte del trabajo. Debido a limitaciones de tiempo y espacio no podremos abordar muchos temasinteresantes realacionados con el lenguaje Scala. por lo que durante la ltima seccinde este trabajo se propondrn numerosos temas de ampliacin: web funcional, otrasaproximaciones de actores en Scala, arquitectura del compilador Scala, etc 6 11. Fundamentos de ScalaCaptulo 2. Fundamentos de ScalaA lo largo de este captulo ahondaremos en los aspectos fundalmentales del lenguaje,describiendo las caractersticas ms relevantes tanto de la orientacin a objectos como lafuncional. No olvidemos que Scala, tal y como hemos descrito durante el captulo anterior,permite la confluencia del paradigma funcional y la orientacin a objetos.Aquellos lectores familiarizados con el lenguaje de programacin Java encontrar muchos delos conceptos aqu descritos (sobre todo aquellos conceptos relativos al paradigma funcional)similares aunque no son exactamente idnticos.2.1. Clases y objetosDel mismo modo que en todos los lenguajes orientados a objetos Scala permite la definicinde clases en las que podremos aadir mtodos y atributos:class MyFirstClass{val a = 1}Si deseamos instanciar un objeto de la clase anterior tendremos que hacer uso de la palabrareservada newval v = new MyFirstClassEn Scal...</p>