Scala (lenguaje de programación)

La versión actual de la página aún no ha sido revisada por colaboradores experimentados y puede diferir significativamente de la versión revisada el 13 de octubre de 2018; las comprobaciones requieren 27 ediciones .
Scala
clase de idioma Multiparadigma : funcional , orientado a objetos , imperativo
Apareció en 20 de enero de 2004
Autor Oderski, Martín
Desarrollador Laboratorio de Métodos de Programación de la EPFL
extensión de archivo .scalao.sc
Liberar 3.1.3 [1]  (21 de junio de 2022 ) ( 2022-06-21 )
sistema de tipos estático , estricto , tipo de inferencia , estructural
sido influenciado Java , Haskell , Erlang , ML estándar , Objective Caml , Smalltalk , Scheme , Algol68 , Lisp
influenciado Kotlin , Swift
Licencia Licencia BSD y Apache 2.0 [2]
Sitio web scala-lang.org
Plataforma Máquina Virtual Java , JavaScript [3] y Nativo [4]

Scala  es un lenguaje de programación multiparadigma diseñado para ser conciso y seguro para la creación fácil y rápida de software de componentes , combinando las características de la programación funcional y orientada a objetos .

Las primeras versiones del lenguaje fueron creadas en 2003 por el equipo del laboratorio de métodos de programación de la Escuela Politécnica Federal de Lausana bajo la dirección de Martin Odersky , el lenguaje fue implementado para las plataformas Java y JavaScript . Según James Strachan , el creador del lenguaje de programación Groovy , Scala podría ser el sucesor del lenguaje Java [5] .

Historia

El lenguaje fue creado en 2001-2004 en el Laboratorio de Métodos de Programación de la EPFL . Fue el resultado de una investigación destinada a desarrollar un soporte de lenguaje mejorado para el software de componentes. Se tomaron dos ideas como base para el desarrollo del lenguaje:

  1. Un lenguaje de programación de software de componentes debe ser escalable en el sentido de que debe ser posible describir partes pequeñas y grandes utilizando los mismos conceptos. Por lo tanto, la atención se ha centrado en los mecanismos de abstracción , composición y descomposición , en lugar de introducir una gran cantidad de primitivas que solo pueden ser útiles en cualquier nivel de zoom.
  2. El soporte de componentes escalables puede ser proporcionado por un lenguaje de programación que unifica y generaliza la programación funcional y orientada a objetos . Algunas de las principales innovaciones técnicas de Scala son conceptos que son una fusión de estos paradigmas de programación . En lenguajes tipificados estáticamente , como Scala, estos paradigmas se han separado casi por completo hasta ahora.

El lenguaje se lanzó para uso general en la plataforma JVM en enero de 2004 y en la plataforma .NET en junio de 2004, y el compilador LLVM (Scala Native) se creó en 2016 [6] .

Orígenes del diseño

El diseño del lenguaje ha sido influenciado por muchos lenguajes y trabajos de investigación.

En primer lugar, el lenguaje ha absorbido una cantidad significativa de conceptos y convenciones sintácticas de Java y C# . La forma en que se expresan las propiedades se toma prestada en gran medida de Sather . El concepto de un modelo de objeto unificado se toma de Smalltalk . De BETA surgió la idea de que todo, incluidas las clases, debería permitir el anidamiento. Los tipos abstractos en Scala son muy similares a los tipos de firma abstracta en SML y OCaml , generalizados en el contexto de componentes completos.

En cierto sentido, Scala es una continuación del trabajo de Pizza . Al igual que Pizza, Scala compila en Java VM, agregando funciones de orden superior , coincidencia de patrones , construcciones que se crearon originalmente en la comunidad de programación funcional . Si bien Pizza es compatible con versiones anteriores de Java, el objetivo de Scala es solo la interoperabilidad, por lo que tiene más libertad de diseño. Otro objetivo de Scala es proporcionar construcciones avanzadas para la abstracción y composición de componentes, compartidas con varios desarrollos de investigación recientes.

Aspectos clave del lenguaje

Los programas Scala son similares a los programas Java en muchos aspectos y pueden interactuar libremente con el código Java. El lenguaje incluye un modelo de objeto uniforme, en el sentido de que cualquier valor es un objeto y cualquier operación es una llamada de método . Al mismo tiempo, también es un lenguaje funcional en el sentido de que las funciones son valores en toda regla.

Scala incluye conceptos de abstracción potentes y coherentes tanto para tipos como para valores. En particular, el lenguaje contiene construcciones mixtas simétricas flexibles para la composición de clases y rasgos . Tal vez le permita descomponer objetos comparándolos con una muestra ; Los patrones y expresiones se han generalizado para admitir el procesamiento natural de documentos XML . En general, estas construcciones facilitan la expresión de componentes independientes utilizando las bibliotecas de Scala sin usar construcciones de lenguaje especiales.

El lenguaje permite extensiones de componentes externos usando vistas . Las funciones de programación genéricas se realizan mediante el soporte de funciones genéricas ( genéricos ), incluido el tipo superior ( genéricos de un tipo superior ). Además de varios tipos de datos estructurales clásicos, el lenguaje incluye soporte para tipos existenciales .

Lenguaje orientado a objetos

El lenguaje utiliza un modelo puro orientado a objetos similar al de Smalltalk : cada valor es un objeto y cada operación es un mensaje. Por ejemplo, la suma x+yse interpreta como x.+(y), es decir, como una llamada a un método +con un argumento yy xcomo un objeto receptor.

Consideremos otro ejemplo: 1+2. Esta expresión se interpreta como (1).+(2). Tenga en cuenta que los paréntesis alrededor de los números son obligatorios porque Scala lexer divide la expresión en tokens según el principio de la coincidencia más larga posible. Por lo tanto, la expresión se 1.+(2)dividirá en tokens 1.y +porque 2el token 1.es más largo que el token 1y el primer argumento de suma se interpretará como tipo Double en lugar de Int [7] .

Lenguaje funcional

Cada función es un valor. El lenguaje proporciona una sintaxis ligera para definir funciones anónimas y curry . Cada construcción devuelve un valor. La coincidencia de patrones es naturalmente aplicable al procesamiento de XML con expresiones regulares .

Reutilización y adaptación

Cada sistema de componentes con poderosas construcciones de abstracción y composición enfrenta un desafío cuando se trata de integrar subsistemas desarrollados por diferentes equipos en diferentes momentos. El problema es que la interfaz de componentes desarrollada por un grupo u otro muchas veces no es adecuada para los clientes que pretenden utilizar este componente.

Scala introduce un nuevo concepto para resolver el problema de la extensibilidad externa: vistas ( vistas ). Permiten que la clase se amplíe con nuevos miembros y rasgos . Las vistas en Scala se corresponden de alguna manera con las clases de tipos utilizadas en Haskell , pero a diferencia de las clases de tipos, el alcance de las vistas se puede controlar y las vistas paralelas pueden coexistir en diferentes partes del programa.

Ejemplos de programas

Un programa, como en Java, es una clase. Este es un ejemplo de un programa de consola que imprime una línea de texto en la pantalla.

object HelloWorld { def main ( args : Array [ String ]) = println ( "¡Hola MUNDO!" ) } // La versión más corta del objeto HelloWorld extiende la aplicación { println ( "¡Hola, MUNDO!" ) }

El siguiente ejemplo de programa simple está escrito en Java , Scala y C# , y muestra algunas diferencias en la sintaxis ( notación de postfijo de tipos de variables, sin sintaxis especial para acceder a matrices ). Este ejemplo describe un programa de consola que imprime todas las opciones pasadas en la línea de comandos. Las opciones comienzan con un carácter "-" (menos).

// Java: clase PrintOptions { public static void main ( String [] args ) { System . fuera _ println ( "Opciones seleccionadas:" ); corriente _ de ( argumentos ) . filtro ( arg -> arg . comienza con ( "-" ) ) . mapa ( arg -> arg . subcadena ( 1 )) . forEach ( System.out :: println ) ; _ } } // Scala: objeto PrintOptions { def main ( args : Array [ String ]) { println ( "Opciones seleccionadas:" ) for ( arg <- args si arg comienza con "-" ) { println ( " " + ( arg substring 1 ) ) } } } // Estilo funcional de Scala: objeto PrintOptions { def main ( args : Array [ String ]) = println ( "Opciones seleccionadas:" +: ( args filter ( _ comienza con "-" ) map ( " " + _ . drop ( 1 ) )) mkString "\n" ) } // Estilo C# funcional: class PrintOptions { static void Main ( String [] args ) { Console . WriteLine ( "Opciones seleccionadas:" + argumentos . Donde ( x => x . Comienza con ( "-" )). Agregado (( r , x ) => r + " " + x . Subcadena ( 1 ))); } } // Estilo Java funcional: clase PrintOptions { public static void main ( String [] args ) { System . fuera _ println ( "Opciones seleccionadas:\n" + Arrays . stream ( args ) . filter ( o -> o . beginWith ( "-" ) ) . map ( o -> " " + o . substring ( 1 )) . collect ( Collectors.joining ( " \ n" ))); } }

Scala no declara una clase de objeto, sino inmediatamente una instancia de objeto. Es así como se implementa el patrón de diseño de forma natural, donde el programa debe tener solo una instancia de la clase (“Singleton” - “Singleton”).

Un ejemplo de un programa que suma todos los elementos de una lista que se pasa a través de argumentos:

object Main { def main ( args : Array [ String ]) { try { println ( "Suma de argumentos: " + args . map ( _ . toInt ). sum ) } catch { case e : NumberFormatException => println ( "Error en argumentos. Debe usarse así: scala Main <número1> <número2> ... " ) } } }

En Java:

clase pública Principal { public static void main ( String [] args ) { try { System . fuera _ println ( "Suma de argumentos:" + Arrays . stream ( args ) .mapToInt ( Integer :: parseInt ) .sum ()); } catch ( NumberFormatException e ) { System . fuera _ println ( "Error en los argumentos. Debería usarse así: java Main <número1> <número2> ... " ); } } }

El método mapitera sobre todos los argumentos. Todos ellos se convierten en un número entero por el método Integer.parseInty se agregan a la lista (matriz) elems. Luego, utilizando el método de plegado de lista foldRight , se calcula la suma de los elementos.

Integración de Java

Scala puede interactuar con código escrito en Java. Todas las clases del paquete java.langya están incluidas de forma predeterminada, mientras que otras deben incluirse explícitamente.

Uso

Los principales frameworks web escritos en Scala son Play , Lift . Entre sus usuarios, se observa una serie de grandes servicios, en particular, Play usa Gilt y Coursera [8] , y Foursquare usa  Lift [9] .

La red social LinkedIn utiliza el micromarco Scalatra para soportar su Signal API [10] .

En abril de 2009, Twitter anunció que había trasladado una parte importante de su código de servidor de Ruby a Scala y que trasladaría el resto [11] . En abril de 2011, la versión en línea de The Guardian se migró de Java a Scala [12] .

Proyectos de Apache Foundation: Apache Spark , Apache Kafka están escritos principalmente en Scala.

Uno de los usuarios activos de la lengua es también el banco UBS [13] .

Una parte importante del marco de desarrollo de Scala, la herramienta de construcción automática Sbt ,  también está escrita en Scala.

Notas

  1. 3.1.3 .
  2. https://www.scala-lang.org/news/2.12.8
  3. http://www.scala-js.org/
  4. http://www.scala-native.org/
  5. Strachan, ¿James Scala como reemplazo a largo plazo de java/javac? (6 de julio de 2009). Consultado el 7 de enero de 2012. Archivado desde el original el 10 de febrero de 2012.
  6. Paul Crill. El lenguaje Scala se acerca más al bare metal . Infomundo (11 de mayo de 2016). Fecha de acceso: 4 de diciembre de 2016. Archivado desde el original el 27 de noviembre de 2016.
  7. Copia archivada (enlace no disponible) . Consultado el 7 de noviembre de 2010. Archivado desde el original el 5 de julio de 2010. 
  8. Por qué nos encanta Scala en Coursera . Fecha de acceso: 26 de octubre de 2014. Archivado desde el original el 1 de abril de 2014.
  9. Scala, Lift y el futuro . Consultado el 26 de octubre de 2014. Archivado desde el original el 13 de enero de 2016.
  10. Synodinos, Dionysios G. Señal de LinkedIn: un estudio de caso para Scala, JRuby y Voldemort . InfoQ (11 de octubre de 2010). Consultado el 26 de octubre de 2014. Archivado desde el original el 26 de octubre de 2014.
  11. Greene, Kate El secreto detrás del crecimiento de Twitter, Cómo un nuevo lenguaje de programación web está ayudando a la empresa a manejar su creciente popularidad. . Revisión de tecnología . MIT (1 de abril de 2009). Consultado el 6 de abril de 2009. Archivado desde el original el 17 de abril de 2012.
  12. Guardian cambiando de Java a Scala . Heise Online (5 de abril de 2011). Consultado el 5 de abril de 2011. Archivado desde el original el 9 de abril de 2011.
  13. Binstock, Andrew. Entrevista con Martin Odersky de Scala . Dr. Diario de Dobb (14 de julio de 2011). Consultado el 10 de febrero de 2012. Archivado desde el original el 20 de febrero de 2012.

Literatura

habla inglesa

de habla rusa

Enlaces