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 ) |
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] .
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:
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] .
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.
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 .
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] .
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 .
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.
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.
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.
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.
Lenguajes de programación | |
---|---|
|