¿Por qué hoy me debo interesar en el lenguaje Scala? Título: ¿Por qué hoy me debo interesar en el lenguaje Scala? Autor: Dr. Gabriel Guerrero Ref: gg20150308_PorQueHoyMeInteresaScala.doc En el mundo de las TI día a día surgen modas y herramientas que todas dicen sus promotores que resuelven los problemas que las anteriores modas y herramientas hasta la fecha no lo hacían. ¿Por qué Scala hoy no es una moda reciente?, sino un lenguaje que desde su inicio hace más de 15 años, en la Escuela Politécnica de Lausana Suiza por Martin Odersky, ha promovido una metodología “GRIS combinación de NEGROS Y BLANCOS”, entre una metodología “BLANCA” basada en objetos (Object-Oriented programming) y, entre una metodología “NEGRA” basa en programación FUNCIONAL (Functional programming). Hoy se tiene una etapa de transición entre estos paradigmas de la programación: programación imperativa/OOP y la programación funcional. Como nota histórica escrita por el creador, es interesante leer Una breve historia de Scala (A Brief History of Scala http://www.artima.com/weblogs/viewpost.jsp?thread=163733). Recordemos que Martin Odersky fue alumno de Niklaus Wirth y que en ese tiempo concibió entre otros los lenguajes de programación Algol W, Pascal, Modula, Modula-2 y Oberon. En un párrafo podemos resumir, Scala es un lenguaje multi-paradigma diseñado para expresar patrones comunes de programación en forma concisa, elegante y con tipos seguros. Sin embargo, estas características se tienen por todos lados y no son atractivas para que un programador Java, C++, o programador en cualquier otro lenguaje piense en aprender Scala. Hay otras características que tal vez podrían ser atractivas para programadores, ya que hoy Scala se ejecuta en el sistema operativo Android para teléfonos inteligentes y es compatible desde su concepción con todos los ambientes Java y se ejecuta en una Máquina Virtual Java (JVM). Página Recordemos el lanzamiento oficial de Java 8 SE hace un año, el 20140318. Leemos de la documentación Java Oracle (http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/Lambda-QuickStart/index.html) 1 Otra característica de Scala es su metodología para ofrecer mecanismos de programación funcional, que hasta la versión 8 de Java con la introducción de EXPRESIONES LAMBDA ya se tienen también para Java SE 8. ¿Por qué hoy me debo interesar en el lenguaje Scala? “Lambda expressions are a new and important feature included in Java SE 8. They provide a clear and concise way to represent one method interface using an expression. Lambda expressions also improve the Collection libraries making it easier to iterate through, filter, and extract data from a Collection. In addition, new concurrency features improve performance in multicore environments.” Las expresiones lambda son una nueva e importante característica incluidas en Java SE 8. Proporcionan una manera clara y concisa para representar una interfaz con un solo método utilizando una expresión. Las expresiones lambda también mejoran las bibliotecas del manejo de una Colección (Collection libraries) haciendo más fácil el recorrer, filtrar y extraer datos de una colección. Además, las nuevas características de concurrencia a mejorar el rendimiento en entornos multi-núcleo (multicore environments). Hoy, Java 8 SE está enfocándose a dos aspectos ESTRATEGICOS de las características de importancia de Scala y que son características relevantes desde hace varios lustros como: 1) COLECCIONES. Manejo eficiente y sencillo de GRUPOS DE DATOS en donde se realiza una misma acción en cada uno de los elementos del grupo. Esto es lo que se denomina genéricamente COLECCIÓN. 2) COMPUTO DISTRIBUIDO EN MULTI NUCLEOS. Mecanismos eficientes y sencillos para ambientes modernos de equipos físicos con un gran número de núcleos (cores) y la programación concurrente con mecanismos más eficientes como actores en vez solo de un concepto NO adecuado, como los son hoy los hilos (THREADs), que constituyen “dolores de cabeza” de los programadores de Java para aplicaciones de ALTA DISPONIBILIDAD con gran demanda de recursos de cómputo. 3) EVALUACION PEREZOSA. La evaluación perezosa (del inglés lazy evaluation) o llamada por necesidad es una estrategia de evaluación que retrasa el cálculo de una expresión hasta que su valor sea necesario, y que también evita repetir la evaluación en caso de ser necesaria en posteriores ocasiones. Esta compartición del cálculo puede reducir el tiempo de ejecución de ciertas funciones de forma exponencial, comparado con otros tipos de evaluación. En Java 8 SE, se tiene para ciertas estructuras y aún no es eficiente. Página “Parallel computing involves dividing a problem into subproblems, solving those problems simultaneously (in parallel, with each subproblem running in a separate thread), and then combining the results of the solutions to the subproblems. Java SE provides the fork/join framework which enables you to more easily implement parallel computing in your applications” 2 En la documentación oficial Oracle Java 8 SE (http://docs.oracle.com/javase/tutorial/collections/streams/parallelism.html) podemos leer: ¿Por qué hoy me debo interesar en el lenguaje Scala? La computación en paralelo consiste en dividir un problema en subproblemas, enseguida llevar a cabo la solución de esos problemas simultáneamente (en paralelo, con cada subproblema se ejecuta en un hilo separado “separate thread”), y luego para ofrecer una solución al problema inicial se combinan los resultados de las soluciones a los subproblemas. Java SE ofrece el marco de referencia “fork/join framework “, que permite implementar con mayor facilidad la computación paralela en sus aplicaciones Sin embargo, esto aún no es una técnica madura como se comenta en el mismo sitio: “One difficulty in implementing parallelism in applications that use collections is that collections are not thread-safe, which means that multiple threads cannot manipulate a collection without introducing thread interference or memory consistency errors” Una de las dificultades en la aplicación de paralelismo en aplicaciones que utilizan las colecciones es que las colecciones no son seguros para subprocesos con hilos (not thread-safe), lo que significa que varios subprocesos no pueden manipular una colección sin introducir interferencias de hilos (thread interference) o errores de coherencia de memoria (memory consistency errors) El modelo de Actor para el soporte de procesos concurrentes en Scala. Dentro de las características que promueven hoy el uso de Scala es el soporte en los procesos distribuidos tolerantes a fallas con grandes volúmenes de datos (BigData). En Scala la concurrencia se ofrece por medio del Modelo de Actores (Actor Model). Este modelo ofrece un enfoque de la concurrencia basada completamente en intercambio de mensajes entre los procesos. (It provides an approach to concurrency that is entirely based on passing messages between processes). Página 3 El Modelo basado en Actores es una idea exitosa ya instrumentada en otros lenguajes por ejemplo en el lenguaje Erlang. Recordemos que este es un lenguaje antiguo que sus inicios datan de 1982 y que según se dice es homenaje a Agner Krarup Erlang (1878–1929), un matemático e ingeniero danés que trabajo en problemas de telecomunicaciones y que fue creado por el Laboratorio de Cómputo de Ericsson para desarrollar sistemas de alta disponibilidad y en tiempo real de los instrumentos físicos de la empresa Ericsson. También se menciona que es un acrónimo de ERicsson LANGuage en retributo a la empresa que lo creó. ¿Por qué hoy me debo interesar en el lenguaje Scala? La instrumentación del Modelo de Actores en Scala fue escrita por Philipp Haller, y se incorporó en julio de 2006 en la versión Scala 2.1.7, cambiándose en la versión 2.11.0 por la biblioteca Akka. Hoy en marzo 2015 se tiene la versión 2.11.6 del lenguaje Scala. La biblioteca Akka es un conjunto de herramientas para la construcción de aplicaciones altamente concurrentes, distribuidas controladas por mensajes en una Máquina Virtual Java (JVM) que son tolerantes a fallas (resilientes). El Modelo basado en Actores Los actores son entidades concurrentes muy ligeras. Procesan mensajes de forma asíncrona utilizando un ciclo de recepción basado en eventos (event-driven receive loop). La coincidencia de patrones (Pattern matching) en los mensajes es una forma conveniente de expresar el comportamiento de un actor. Elevan el nivel de abstracción y hacen que sea mucho más fácil de escribir, probar, comprender y mantener sistemas concurrentes y / o distribuidos. El programador se centra en el flujo de trabajo de ¿cómo? los mensajes fluyen en el sistema, en lugar de dedicarse a generar primitivas de bajo nivel de Entrada/Salida (I/O) como hilos (threads) , bloqueos o cerraduras (locks) y los enchufes de conexión (socket) con puertos. Es decir, el programador se concentra en el QUE, dejando al modelo de Actores con Scala el COMO. El mundo Apache Spark BigData y los lenguajes de programación para procesos distribuidos tolerante a fallas con grandes volúmenes de datos (BigData) Página En estos ambientes se tenían interfaces de programación en Java y se desarrollaron una gran diversidad de sistema alrededor de Apache HDFS/MapReduce conocido como el ecosistema Hadoop. 4 Hoy en los ámbitos del desarrollo de aplicaciones distribuidas tolerantes a fallas para manejo de grandes volúmenes de datos, conocido como mundo BigData, se tienen desde hace más de 10 años una gran variedad de metodologías como Apache Hadoop HDFS (Hadoop Distributed File System) con el marco de referencia Mapeo/Reducción (Map/Reduce framework). ¿Por qué hoy me debo interesar en el lenguaje Scala? En los años 2008 y con la diversidad de aplicaciones que se empezaron a utilizar con Apache HDFS/MapReduce, se inician un nuevos retos que no se facilitaba su programación o que tal vez que su instrumentación era demasiado laboriosa y en ocasiones sin ofrecer los niveles de servicio esperados. En este contexto surge en 2008 una alternativa en la Universidad de Berkeley en California E.U.A., en donde se desarrolla un nuevo paradigma denominado SPARK que utiliza como lenguaje nativo, el lenguaje de programación Scala. Cabe mencionar que en el ambiente Spark también ofrece Interfaces de Programación (API) en Java y Python. Sin embargo, todos los adelantos y nuevas versiones del ambiente Spark siempre se ofrecen en Scala en donde se tiene un óptimo desempeño. Este nuevo enfoque da origen a una nueva rama de las TI que se enfoca en Procesos Analíticos de Sistemas que generan Grandes Volúmenes de Datos que sean distribuidos y tolerante a fallas. En este contexto el lenguaje Scala, que existe desde hace varios lustros tiene un nuevo impulso y hoy en día es un lenguaje necesario para la instrumentación de mecanismos para el manejo de grandes volúmenes de datos. En el lenguaje Scala una gran característica es su manejo eficiente de Colecciones y así mismo sus directivas para PARALELIZAR tareas, además de sus mecanismos para crear sistemas concurrentes con el Modelo de Actores de Akka. Por todas estas razones son de relevancia en el por qué hoy me debo interesar en el lenguaje Scala!!! Página 5 A sus teclados mis valientes para Scalar Montañas de Datos con Spark!!!