Scala

Scala
Información sobre la plantilla
Parte de la familia Lenguajes de Programación Orientado a Objetos
Scala.jpg
Scala POO
CreadorMartin Odersky en 2003

Scala es un moderno lenguaje de programación multi-paradigma diseñado para expresar patrones de programación comunes de una forma concisa, elegante, y de tipado seguro. Integra fácilmente características de lenguajes orientados a objetos y funcionales. La implementación actual corre en la máquina virtual de Java y es compatible con las aplicaciones Java existentes. El nombre de Scala viene de “scalable” y “language”, esto indica cual es el propósito de este lenguaje.

Características

  • Scala es orientado a objetos: Scala es un lenguaje puramente orientado a objetos en el sentido de que todo es un objeto. Los tipos y comportamientos de objetos son descriptos por clases y traits (que podría ser traducido como un “rasgo”). Las clases pueden ser extendidas a través de subclases y un flexible mecanismo de composición mezclada que provee un claro remplazo para la herencia múltiple.
  • Scala es funcional: Scala es también un lenguaje funcional en el sentido que toda función es un valor. Scala provee una sintaxis ligera para definir funciones anónimas. Soporta funciones de primer orden, permite que las funciones sean anidadas, y soporta currying. Las clases caso de Scala y las construcciones incorporadas al lenguaje para reconocimiento de patrones modelan tipos algebráicos usados en muchos lenguajes de programación funcionales. Además, la noción de reconocimiento de patrones de Scala se puede extender naturalmente al procesamiento de datos XML con la ayuda de patrones de secuencias que igonoran a la derecha. En este contexto, seq comprehensions resultan útiles para formular consultas. Estas características hacen a Scala ideal para desarrollar aplicaciones como Web Services.
  • Scala estáticamente tipado: Scala cuenta con un expresivo sistema de tipado que fuerza estáticamente las abstracciones a ser usadas en una manera coherente y segura. En particular, el sistema de tipado soporta:
    • Clases genéricas
    • Anotaciones variables
    • Límites de tipado superiores e inferiores
    • Clases internas y tipos abstractos como miembros de objetos
    • Tipos compuestos
    • Auto-referencias explicitamente tipadas
    • Vistas
    • Métodos polimórficos

El mecanismo de inferencia de tipos locales se encarga de que el usuario no tengan que anotar el programa con información redundante de tipado. Combinadas, estas características proveen una base poderosa para el reuso seguro de abstracciones de programación y para la extensión segura (en cuanto a tipos) de software.

  • Scala es extensible: En la práctica el desarrollo de aplicaciones específicas para un dominio generalmente requiere de “Lenguajes de dominio específico” (DSL). Scala provee una única combinación de mecanismos del lenguaje que simplifican la creación de construcciones propias del lenguaje en forma de librerías:
    • cualquier método puede ser usado como un operador de infijo o postfijo
    • las closures son construidas automáticamente dependiendo del tipo esperado (tipos objetivo).

El uso conjunto de ambas características facilita la definición de nuevas sentencias sin tener que extender la sintaxis y sin usar facciones de meta-programación como tipo macros. Scala está diseñado para interoperar bien con el popular Entorno de ejecución de Java 2 (JRE). En particular, la interacción con el lenguaje orientado a objetos Java es muy sencilla. Scala tiene el mismo esquema de compilación (compilación separada, carga de clases dinámica) que java y permite acceder a las miles de librerías de gran calidad existentes. También está disponible el soporte para el Framework .NET (CLR).

Ventajas que Ofrece

Dentro de las ventajas que ofrece Scala es que la cantidad de código necesario para programar es inferior a la que se requiere con el lenguaje Java, y el hecho de que es compatible con la Java Virtual Machine. El dinero necesario para comercializar Scala viene de la firma Greylock Partners, que ya ha financiado a empresas tecnológicas como Red Hat o Cloudera.

El lanzamiento comercial lo hizo la empresa Typesafe, creada por el propio Odersky, que ofrece herramientas para los desarrolladores, así como servicios de mantenimiento, formación y consultoría para empresas.

Cada vez son más las empresas que apuestan por Scala, entre las que destaca el ejemplo de Twitter, que lo implementó hace unos años, o de la web del periódico The Guardian, que hizo también el cambio. Martin Odersky ha explicado a la web Cnet que la idea es que las páginas con un elevado volumen de datos puedan cambiarse sin problemas de Java a Scala, beneficiándose de su arquitectura JVM sin que ello afecte a su infraestructura.

Ejemplo

Scala permite desarrollar programas con una sintaxis más limpia y concisa con lo que se crearán programas más cortos, reduciendo considerablemente el número de líneas de código si se compara con Java.

Por ejemplo:

// Java
class Clase
{
   private int indice;
   private String nombre;

   public Clase(int indice, String nombre)
  {
       this.indice = indice;
       this.nombre = nombre;
   }
}
Java


// Scala
class Clase (indice: Int, nombre: String)

Cuando se compila un programa se transforma en en bytcodes, ejecutandose sobre la máquina virtual de Java, lo que permite utilizar características o librerías de Java dentro de un programa en Scala, por ejemplo, invocar métodos Java, seleccionar campos Java, heredar de clases Java, implementar interfaces Java, etc. A su vez, el código Java también puede usar fácilmente código Scala y a su vez permite ejecutar programas tanto en modo compilado como en modo scripting.

Scala Orientado a Objetos

Scala es un lenguaje orientado a objetos puro, donde todo es un objeto y todas las operación se realizan mediante una llamada a un método. Pero mientras Java tiene excepciones como los tipos primitivos o los statics, Scala no pose dichas excepciones.

En la programación orientada a objetos la composición y la herencia son los dos mecanismos básicos de rehúso. Scala ofrece un soporte excelente para el diseño correcto de los principios de abstracción fundamentales de la programación orientada a objetos: Clasificación/Instanciación, Agregación/Descomposición, Generalización/Especialización y Agrupamiento/Individualización.

Características en la programación orientadas a objetos que no posee Java

  • Composición modular de mixin: Este mecanismo que permite la composición de clases para el diseño de componentes reutilizables evitando los problemas presentados por la herencia múltiple. Similar a los interfaces Java y las clases abstractas. Por una parte se pueden definir múltiples “contratos” (del mismo modo que los interfaces). Por otro lado, se podrían tener implementaciones concretas de los métodos.
  • Self-type: Los mixin no dependen de ningún método y/o atributo de aquellas clases con las que se está entremezclando aunque en determinadas ocasiones será necesario hacer uso de las mismas. Esta capacidad es conocida en Scala como self-type.
  • Abstracción de tipos: Existen dos mecanismos principales de abstracción en los lenguajes de programación: la parametrización y los miembros abstractos. Scala soporta ambos estilos de abstracción de manera uniforme para tipos y valores.

Los Actores

Para muchos, la programación concurrente es la siguiente revolución en la forma que escribimos software. Java y otros lenguajes dan soporte a un modelo de concurrencia basado en técnicas de sincronización por condición y exclusión mutua, adecuadas para muchas aplicaciones pero inadecuadas para otras. Otros modelos de concurrencia han existido desde hace muchos años y uno de ellos es el conocido como el modelo de actores basado en la inexistencia de regiones críticas por estados compartidos entre hilos o procesos, y usando intercambio de mensajes entre los componentes del sistema para resolver problemas de computación concurrente.

Scala adopta un enfoque completamente diferente a la problemática de la concurrencia: el modelo basado en actores. Un actor es un modelo matemático de computación concurrente en el que se encapsulan datos, código y su propio hilo de control, comunicándose de manera asíncrona mediante técnicas de paso de mensajes inmutables. La arquitectura base de este modelo está basada en políticas de compartición cero y componentes ligeros.

Valoración

Scala es un lenguaje tremendamente poderoso que ha sabido heredar las mejores cosas de cada uno de los lenguajes más exitosos que se han conocido. Java no es la excepción, y comparte muchas cosas con este. La diferencia que vemos es que para cada uno de los conceptos de Java, Scala los aumenta, refina y mejora. Poder aprender todas las características de Scala nos equipa con más y mejores herramientas a la hora de escribir nuestros programas.

Si bien la programación funcional no ha sido una característica de Java, el progamador experimentado puede notar la falta de soporte de este paradigma en múltiples ocasiones. El solo pensar en el código necesario para proveer a un JButton con el código que debe ejecutar al ser presionado nos muestra lo necesario que sería contar con herramientas funcionales. Recomendamos entonces tratar de ir incorporando estas características, por más que sea difícil para el programador Java al estar tan acostumbrado al paradigma imperativo de este lenguaje.

Fuentes

  • Manual de Scala para Programadores Java

Referencias