stringtranslate.com

Scala (lenguaje de programación)

Scala ( / ˈ s k ɑː l ə / SKAH -lah ) [8] es un potente lenguaje de programación de propósito general de alto nivel y tipado estático que admite tanto la programación orientada a objetos como la programación funcional . Diseñado para ser conciso, [9] muchas de las decisiones de diseño de Scala tienen como objetivo abordar las críticas a Java . [7]

El código fuente de Scala se puede compilar en código de bytes de Java y ejecutar en una máquina virtual Java (JVM). Scala también se puede compilar en JavaScript para ejecutarlo en un navegador o directamente en un ejecutable nativo. En JVM, Scala proporciona interoperabilidad de lenguaje con Java , de modo que se puede hacer referencia directamente a las bibliotecas escritas en cualquiera de los idiomas en código Scala o Java. [ 10] Al igual que Java, Scala está orientado a objetos y utiliza una sintaxis denominada llave que es similar al lenguaje C. Desde Scala 3, también existe una opción para utilizar la regla fuera de juego (sangría) para estructurar bloques , y se recomienda su uso. Martin Odersky ha dicho que este resultó ser el cambio más productivo introducido en Scala 3. [11]

A diferencia de Java, Scala tiene muchas características de los lenguajes de programación funcionales (como Scheme , Standard ML y Haskell ), incluido el curry , la inmutabilidad , la evaluación diferida y la coincidencia de patrones . También tiene un sistema de tipos avanzado que admite tipos de datos algebraicos , covarianza y contravarianza , tipos de orden superior (pero no tipos de rango superior ), tipos anónimos , sobrecarga de operadores , parámetros opcionales , parámetros con nombre , cadenas sin formato y una excepción experimental. Versión de efectos algebraicos que puede verse como una versión más potente de las excepciones comprobadas de Java . [12]

El nombre Scala es un acrónimo de escalable y lenguaje , lo que significa que está diseñado para crecer con las demandas de sus usuarios. [13]

Historia

El diseño de Scala se inició en 2001 en la École Polytechnique Fédérale de Lausanne (EPFL) (en Lausana , Suiza ) por Martin Odersky . Fue una continuación del trabajo en Funnel, un lenguaje de programación que combina ideas de programación funcional y redes de Petri . [14] Odersky trabajó anteriormente en Generic Java y javac , el compilador Java de Sun. [14]

Después de un lanzamiento interno a finales de 2003, Scala se lanzó públicamente a principios de 2004 en la plataforma Java , [15] [7] [14] [16] Le siguió una segunda versión (v2.0) en marzo de 2006. [7]

El 17 de enero de 2011, el equipo de Scala ganó una subvención de investigación de cinco años de más de 2,3 millones de euros del Consejo Europeo de Investigación . [17] El 12 de mayo de 2011, Odersky y sus colaboradores lanzaron Typesafe Inc. (más tarde rebautizada como Lightbend Inc. ), una empresa para brindar soporte comercial, capacitación y servicios para Scala. Typesafe recibió una inversión de 3 millones de dólares en 2011 de Greylock Partners . [18] [19] [20] [21]

Plataformas y licencia

Scala se ejecuta en la plataforma Java ( máquina virtual Java ) y es compatible con los programas Java existentes . [15] Como las aplicaciones de Android generalmente se escriben en Java y se traducen del código de bytes de Java al código de bytes de Dalvik (que puede traducirse posteriormente a código de máquina nativo durante la instalación) cuando se empaquetan, la compatibilidad de Java de Scala lo hace muy adecuado para el desarrollo de Android, especialmente cuando se prefiere un enfoque funcional. [22]

La distribución de software Scala de referencia, incluidos el compilador y las bibliotecas, se publica bajo la licencia Apache . [23]

Otros compiladores y objetivos

Scala.js es un compilador de Scala que compila en JavaScript, lo que permite escribir programas Scala que se pueden ejecutar en navegadores web o Node.js. [24] El compilador, en desarrollo desde 2013, se anunció como ya no experimental en 2015 (v0.6). La versión v1.0.0-M1 se lanzó en junio de 2018 y la versión 1.1.1 en septiembre de 2020. [25]

Scala Native es un compilador de Scala que apunta a la infraestructura del compilador LLVM para crear código ejecutable que utiliza un tiempo de ejecución administrado liviano, que utiliza el recolector de basura Boehm . El proyecto está dirigido por Denys Shabalin y tuvo su primera versión, 0.1, el 14 de marzo de 2017. El desarrollo de Scala Native comenzó en 2015 con el objetivo de ser más rápido que la compilación justo a tiempo para JVM al eliminar la compilación en tiempo de ejecución inicial de código y también proporciona la capacidad de llamar a rutinas nativas directamente. [26] [27]

En junio de 2004 se lanzó un compilador de Scala de referencia dirigido a .NET Framework y su Common Language Runtime , [14] pero se eliminó oficialmente en 2012. [28]

Ejemplos

Ejemplo de "Hola mundo"

El programa Hello World escrito en Scala 3 tiene esta forma:

@main def main () = println ( "¡Hola mundo!" )    

A diferencia de la aplicación independiente Hello World para Java , no hay declaración de clase y nada se declara estático.

Cuando el programa se almacena en el archivo HelloWorld.scala , el usuario lo compila con el comando:

$ scalac HolaMundo.scala

y lo ejecuta con

$ Scala Hola Mundo

Esto es análogo al proceso para compilar y ejecutar código Java. De hecho, el modelo de compilación y ejecución de Scala es idéntico al de Java, lo que lo hace compatible con herramientas de compilación de Java como Apache Ant .

Una versión más corta del programa Scala "Hello World" es:

println ( "¡Hola mundo!" )

Scala incluye un shell interactivo y soporte para secuencias de comandos. [29] Guardado en un archivo llamado HelloWorld2.scala, esto se puede ejecutar como un script usando el comando:

$scala HolaMundo2.scala

Los comandos también se pueden ingresar directamente en el intérprete de Scala, usando la opción -e :

$ scala -e 'println("¡Hola, mundo!")'

Las expresiones se pueden ingresar de forma interactiva en REPL :

$ scala Bienvenido a Scala 2.12.2 (VM de servidor Java HotSpot(TM) de 64 bits, Java 1.8.0_131). Escriba expresiones para evaluación. O prueba: ayuda.scala> Lista(1, 2, 3).map(x => x * x) res0: Lista[Int] = Lista(1, 4, 9)escala>

Ejemplo básico

El siguiente ejemplo muestra las diferencias entre la sintaxis de Java y Scala. La función mathFunction toma un número entero, lo eleva al cuadrado y luego suma la raíz cúbica de ese número al logaritmo natural de ese número, devolviendo el resultado (es decir, ):

Algunas diferencias sintácticas en este código son:

Estas flexibilizaciones sintácticas están diseñadas para permitir la compatibilidad con lenguajes de dominios específicos .

Algunas otras diferencias sintácticas básicas:

Ejemplo con clases

El siguiente ejemplo contrasta la definición de clases en Java y Scala.

El código anterior muestra algunas de las diferencias conceptuales entre el manejo de clases de Java y Scala:

Características (con referencia a Java)

Scala tiene el mismo modelo de compilación que Java y C# , es decir, compilación separada y carga dinámica de clases , de modo que el código Scala pueda llamar a las bibliotecas Java.

Las características operativas de Scala son las mismas que las de Java. El compilador de Scala genera código de bytes que es casi idéntico al generado por el compilador de Java. [15] De hecho, el código Scala se puede descompilar en código Java legible, con la excepción de ciertas operaciones del constructor. Para la máquina virtual Java (JVM), el código Scala y el código Java son indistinguibles. La única diferencia es una biblioteca de tiempo de ejecución adicional, scala-library.jar. [30]

Scala agrega una gran cantidad de características en comparación con Java y tiene algunas diferencias fundamentales en su modelo subyacente de expresiones y tipos, lo que hace que el lenguaje sea teóricamente más limpio y elimina varios casos extremos en Java. Desde la perspectiva de Scala, esto es prácticamente importante porque varias características agregadas en Scala también están disponibles en C#.

Flexibilidad sintáctica

Como se mencionó anteriormente, Scala tiene mucha flexibilidad sintáctica, en comparación con Java. Los siguientes son algunos ejemplos:

Por sí solas, estas pueden parecer opciones cuestionables, pero en conjunto sirven para permitir que lenguajes de dominio específicos se definan en Scala sin necesidad de ampliar el compilador. Por ejemplo, la sintaxis especial de Erlangactor ! message para enviar un mensaje a un actor, es decir , puede implementarse (y se implementa) en una biblioteca Scala sin necesidad de extensiones de lenguaje.

Sistema de tipo unificado

Java hace una clara distinción entre tipos primitivos (por ejemplo, inty boolean) y tipos de referencia (cualquier clase ). Sólo los tipos de referencia forman parte del esquema de herencia, que se deriva de java.lang.Object. En Scala, todos los tipos heredan de una clase de nivel superior Any, cuyos hijos inmediatos son AnyVal(tipos de valor, como Inty Boolean) y AnyRef(tipos de referencia, como en Java). Esto significa que la distinción de Java entre tipos primitivos y tipos encajonados (por ejemplo, intvs. Integer) no está presente en Scala; boxing y unboxing es completamente transparente para el usuario. Scala 2.10 permite que el usuario defina nuevos tipos de valores.

Para expresiones

En lugar de los bucles " foreach " de Java para recorrer un iterador, Scala tiene forexpresiones -, que son similares a las listas por comprensión en lenguajes como Haskell, o una combinación de listas por comprensión y expresiones generadoras en Python . Las expresiones For que utilizan la palabra clave permiten generar yielduna nueva colección iterando sobre una existente, devolviendo una nueva colección del mismo tipo. El compilador los traduce en una serie de llamadas y map. Cuando no se utiliza, el código se aproxima a un bucle de estilo imperativo, traduciéndolo a .flatMapfilteryieldforeach

Un ejemplo sencillo es:

val s = for ( x <- 1 a 25 si x * x > 50 ) produce 2 * x              

El resultado de ejecutarlo es el siguiente vector:

Vector(16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50)

(Tenga en cuenta que la expresión 1 to 25no tiene una sintaxis especial. El método tomás bien se define en la biblioteca estándar de Scala como un método de extensión en números enteros, utilizando una técnica conocida como conversiones implícitas [32] que permite agregar nuevos métodos a los tipos existentes).

Un ejemplo más complejo de iteración sobre un mapa es:

// Dado un mapa que especifica los usuarios de Twitter mencionados en un conjunto de tweets // y el número de veces que se mencionó a cada usuario, busque los usuarios // en un mapa de políticos conocidos y devuelva un nuevo mapa que proporcione solo // los demócratas políticos (como objetos, más que como hilos). val dem_mentions = for ( mención , veces ) <- cuenta de menciones <- cuentas . obtener ( mencionar ) si cuenta . partido == rendimiento "demócrata" ( cuenta , tiempos )                  

La expresión (mention, times) <- mentionses un ejemplo de coincidencia de patrones (ver más abajo). La iteración sobre un mapa devuelve un conjunto de tuplas clave-valor , y la coincidencia de patrones permite desestructurar fácilmente las tuplas en variables separadas para la clave y el valor. De manera similar, el resultado de la comprensión también devuelve tuplas clave-valor, que se reconstruyen automáticamente en un mapa porque el objeto fuente (de la variable mentions) es un mapa. Tenga en cuenta que si, mentionsen cambio, tuviera una lista, conjunto, matriz u otra colección de tuplas, exactamente el mismo código anterior produciría una nueva colección del mismo tipo.

tendencias funcionales

Si bien admite todas las funciones orientadas a objetos disponibles en Java (y, de hecho, las aumenta de varias maneras), Scala también proporciona una gran cantidad de capacidades que normalmente se encuentran solo en lenguajes de programación funcionales . Juntas, estas características permiten que los programas Scala se escriban en un estilo casi completamente funcional y también permiten mezclar estilos funcionales y orientados a objetos.

Ejemplos son:

Todo es una expresión.

A diferencia de C o Java , pero similar a lenguajes como Lisp , Scala no hace distinción entre declaraciones y expresiones . Todas las declaraciones son, de hecho, expresiones que se evalúan con algún valor. En Scala se considera que las funciones que se declararían como retornantes voiden C o Java, y declaraciones como whileesa que lógicamente no devuelven un valor, devuelven el tipo Unit, que es un tipo singleton , con un solo objeto de ese tipo. Las funciones y operadores que nunca regresan (por ejemplo, el throwoperador o una función que siempre sale de forma no local usando una excepción) lógicamente tienen un tipo de retorno Nothing, un tipo especial que no contiene objetos; es decir, un tipo inferior , es decir, una subclase de todos los tipos posibles. (Esto a su vez hace que el tipo Nothingsea compatible con todos los tipos, lo que permite que la inferencia de tipos funcione correctamente) .

De manera similar, una if-then-else"declaración" es en realidad una expresión que produce un valor, es decir, el resultado de evaluar una de las dos ramas. Esto significa que dicho bloque de código se puede insertar dondequiera que se desee una expresión, obviando la necesidad de un operador ternario en Scala:

Por razones similares, returnlas declaraciones son innecesarias en Scala y, de hecho, no se recomiendan. Como en Lisp , la última expresión en un bloque de código es el valor de ese bloque de código, y si el bloque de código es el cuerpo de una función, la función lo devolverá.

Para dejar claro que todas las funciones son expresiones, incluso los métodos que devuelven Unitse escriben con un signo igual

def printValue ( x : String ): Unidad = println ( "Me comí un %s" . formato ( x ))      

o de manera equivalente (con inferencia de tipos y omitiendo la nueva línea innecesaria):

def printValue ( x : String ) = println ( formato "Me comí un %s" x )      

Inferencia de tipos

Debido a la inferencia de tipos , el tipo de variables, los valores de retorno de la función y muchas otras expresiones normalmente se pueden omitir, ya que el compilador puede deducirlo. Algunos ejemplos son val x = "foo"(para una constante inmutable u objeto inmutable ) o var x = 1.5(para una variable cuyo valor se puede cambiar más adelante). La inferencia de tipos en Scala es esencialmente local, en contraste con el algoritmo Hindley-Milner más global utilizado en Haskell , ML y otros lenguajes más puramente funcionales. Esto se hace para facilitar la programación orientada a objetos. El resultado es que aún es necesario declarar ciertos tipos (en particular, los parámetros de función y los tipos de retorno de funciones recursivas ), por ejemplo

def formatApples ( x : Int ) = "Comí %d manzanas" . formato ( x )    

o (con un tipo de retorno declarado para una función recursiva)

def factorial ( x : Int ): Int = si x == 0 entonces 1 si no x * factorial ( x - 1 )                

Funciones anónimas

En Scala, las funciones son objetos y existe una sintaxis conveniente para especificar funciones anónimas . Un ejemplo es la expresión x => x < 2, que especifica una función con un parámetro, que compara su argumento para ver si es menor que 2. Es equivalente a la forma Lisp (lambda (x) (< x 2)). xTenga en cuenta que no es necesario especificar explícitamente ni el tipo ni el tipo de retorno y, por lo general, se pueden inferir mediante inferencia de tipos ; pero se pueden especificar explícitamente, por ejemplo, como (x: Int) => x < 2o incluso (x: Int) => (x < 2): Boolean.

Las funciones anónimas se comportan como cierres verdaderos en el sentido de que capturan automáticamente cualquier variable que esté léxicamente disponible en el entorno de la función adjunta. Esas variables estarán disponibles incluso después de que regrese la función adjunta y, a diferencia del caso de las clases internas anónimas de Java , no es necesario declararlas como finales. (Incluso es posible modificar dichas variables si son mutables, y el valor modificado estará disponible la próxima vez que se llame a la función anónima).

Una forma aún más corta de función anónima utiliza variables de marcador de posición : por ejemplo, la siguiente:

list map { x => sqrt(x) }

se puede escribir de manera más concisa como

list map { sqrt(_) }

o incluso

list map sqrt

Inmutabilidad

Scala impone una distinción entre variables inmutables y mutables. Las variables mutables se declaran mediante la varpalabra clave y los valores inmutables se declaran mediante la valpalabra clave. Una variable declarada usando la valpalabra clave no se puede reasignar de la misma manera que una variable declarada usando la finalpalabra clave no se puede reasignar en Java. vals son sólo superficialmente inmutables, es decir, no se garantiza que un objeto al que hace referencia un val sea inmutable.

Sin embargo, la convención recomienda las clases inmutables y la biblioteca estándar de Scala proporciona un rico conjunto de clases de colección inmutables . Scala proporciona variantes mutables e inmutables de la mayoría de las clases de colección, y la versión inmutable siempre se usa a menos que la versión mutable se importe explícitamente. [34] Las variantes inmutables son estructuras de datos persistentes que siempre devuelven una copia actualizada de un objeto antiguo en lugar de actualizar el objeto antiguo de forma destructiva en su lugar. Un ejemplo de esto son las listas enlazadas inmutables donde anteponer un elemento a una lista se realiza devolviendo un nuevo nodo de lista que consta del elemento y una referencia al final de la lista. Solo se puede agregar un elemento a una lista anteponiendo todos los elementos de la lista anterior a una lista nueva con solo el elemento nuevo. De la misma manera, insertar un elemento en medio de una lista copiará la primera mitad de la lista, pero mantendrá una referencia a la segunda mitad de la lista. A esto se le llama compartir estructural. Esto permite una simultaneidad muy sencilla: no se necesitan bloqueos ya que nunca se modifican objetos compartidos. [35]

Evaluación perezosa (no estricta)

La evaluación es estricta ("ansiosa") por defecto. En otras palabras, Scala evalúa las expresiones tan pronto como están disponibles, en lugar de según sea necesario. Sin embargo, es posible declarar una variable no estricta ("lazy") con la lazypalabra clave, lo que significa que el código para producir el valor de la variable no se evaluará hasta la primera vez que se haga referencia a la variable. También existen colecciones no estrictas de varios tipos (como el tipo Stream, una lista enlazada no estricta), y cualquier colección se puede convertir en no estricta con el viewmétodo. Las colecciones no estrictas proporcionan un buen ajuste semántico a cosas como datos producidos por el servidor, donde la evaluación del código para generar elementos posteriores de una lista (que a su vez desencadena una solicitud a un servidor, posiblemente ubicado en otro lugar de la web) solo sucede cuando los elementos son realmente necesarios.

recursividad de cola

Los lenguajes de programación funcional suelen proporcionar optimización de llamadas de cola para permitir un uso extensivo de la recursividad sin problemas de desbordamiento de pila . Las limitaciones en el código de bytes de Java complican la optimización de las llamadas finales en la JVM. En general, una función que se llama a sí misma con una llamada final se puede optimizar, pero las funciones mutuamente recursivas no. Se han sugerido trampolines como solución alternativa. [36] La biblioteca Scala proporciona soporte para trampolín con el objeto scala.util.control.TailCallsdesde Scala 2.8.0 (lanzado el 14 de julio de 2010). Opcionalmente, una función puede tener anotaciones con @tailrec, en cuyo caso no se compilará a menos que sea recursiva al final. [37]


Un ejemplo de esta optimización podría implementarse utilizando la definición factorial . Por ejemplo, la versión recursiva del factorial:

def factorial ( n : Int ): Int = si n == 0 entonces 1 si no n * factorial ( n - 1 )                

Podría optimizarse para la versión recursiva de cola de esta manera:

@tailrec def factorial ( n : Int , accum : Int ): Int = si n == 0 entonces accum else factorial ( n - 1 , n * accum )                    

Sin embargo, esto podría comprometer la componibilidad con otras funciones debido al nuevo argumento en su definición, por lo que es común usar cierres para preservar su firma original:

def factorial ( n : Int ): Int =      @tailrec def bucle ( actual : Int , acumulado : Int ): Int =         si n == 0 entonces acumular      else bucle ( actual - 1 , n * accum )        loop ( n , 1 ) // Llamada al cierre usando el caso base   factorial final 

Esto garantiza la optimización de las llamadas finales y, por tanto, evita un error de desbordamiento de pila.

Clases de casos y coincidencia de patrones.

Scala tiene soporte incorporado para la coincidencia de patrones , que puede considerarse como una versión más sofisticada y extensible de una declaración de cambio , donde se pueden hacer coincidir tipos de datos arbitrarios (en lugar de solo tipos simples como enteros, booleanos y cadenas), incluidos los arbitrarios. anidación. Se proporciona un tipo especial de clase conocida como clase de caso , que incluye soporte automático para la coincidencia de patrones y se puede utilizar para modelar los tipos de datos algebraicos utilizados en muchos lenguajes de programación funcionales. (Desde la perspectiva de Scala, una clase de caso es simplemente una clase normal para la cual el compilador agrega automáticamente ciertos comportamientos que también podrían proporcionarse manualmente, por ejemplo, definiciones de métodos que proporcionan comparaciones profundas y hash, y desestructuran una clase de caso en su constructor. parámetros durante la coincidencia de patrones.)

Un ejemplo de una definición del algoritmo de clasificación rápida que utiliza la coincidencia de patrones es este:

def qsort ( lista : Lista [ Int ]): Lista [ Int ] = lista de coincidencias caso Nil => Nil caso pivote :: cola => val ( más pequeño , resto ) = cola . partición ( _ < pivote ) qsort ( más pequeño ) ::: pivote :: qsort ( resto )                            

La idea aquí es dividir una lista en elementos menores que un pivote y elementos no menores, ordenar recursivamente cada parte y pegar los resultados junto con el pivote intermedio. Esto utiliza la misma estrategia de divide y vencerás de mergesort y otros algoritmos de clasificación rápida.

El matchoperador se utiliza para hacer coincidencias de patrones en el objeto almacenado en list. Cada caseexpresión se prueba por turno para ver si coincide, y la primera coincidencia determina el resultado. En este caso, Nilsolo coincide con el objeto literal Nil, pero pivot :: tailcoincide con una lista que no está vacía y simultáneamente desestructura la lista de acuerdo con el patrón dado. En este caso, el código asociado tendrá acceso a una variable local denominada que pivotocupa el principio de la lista y a otra variable tailque ocupa el final de la lista. Tenga en cuenta que estas variables son de solo lectura y son semánticamente muy similares a los enlaces de variables establecidos mediante el letoperador en Lisp y Scheme.

La coincidencia de patrones también ocurre en declaraciones de variables locales. En este caso, el valor de retorno de la llamada a tail.partitiones una tupla (en este caso, dos listas). (Las tuplas se diferencian de otros tipos de contenedores, por ejemplo las listas, en que siempre tienen un tamaño fijo y los elementos pueden ser de diferentes tipos, aunque aquí ambos son iguales.) La coincidencia de patrones es la forma más fácil de recuperar las dos partes de un contenedor. la tupla.

El formulario _ < pivotes una declaración de una función anónima con una variable marcador de posición; consulte la sección anterior sobre funciones anónimas.

Aparecen los operadores de lista ::(que agrega un elemento al comienzo de una lista, similar a consLisp y Scheme) y :::(que agrega dos listas juntas, similar a Lisp y Scheme). appendA pesar de las apariencias, ninguno de estos operadores tiene nada "integrado". Como se especificó anteriormente, cualquier cadena de símbolos puede servir como nombre de función, y un método aplicado a un objeto puede escribirse en estilo "infijo" sin punto ni paréntesis. La línea de arriba como está escrita:

qsort(smaller) ::: pivot :: qsort(rest)

también podría escribirse así:

qsort(rest).::(pivot).:::(qsort(smaller))

en notación de llamada de método más estándar. (Los métodos que terminan con dos puntos son asociativos por la derecha y se vinculan al objeto de la derecha).

Funciones parciales

En el ejemplo anterior de coincidencia de patrones, el cuerpo del matchoperador es una función parcial , que consta de una serie de caseexpresiones, prevaleciendo la primera expresión coincidente, similar al cuerpo de una declaración de cambio . Las funciones parciales también se utilizan en la parte de manejo de excepciones de una trydeclaración:

intente ... detectar caso nfe : NumberFormatException => { println ( nfe ); Lista ( 0 ) } caso _ => Nulo               

Finalmente, una función parcial se puede usar sola y el resultado de llamarla equivale a realizar una matchsobre ella. Por ejemplo, el código anterior para la clasificación rápida se puede escribir así:

val qsort : Lista [ Int ] => Lista [ Int ] = caso Nil => Nil caso pivote :: cola => val ( más pequeño , resto ) = cola . partición ( _ < pivote ) qsort ( más pequeño ) ::: pivote :: qsort ( resto )                           

Aquí se declara una variable de solo lectura cuyo tipo es una función de listas de números enteros a listas de números enteros, y la vincula a una función parcial. (Tenga en cuenta que el parámetro único de la función parcial nunca se declara ni se nombra explícitamente). Sin embargo, aún podemos llamar a esta variable exactamente como si fuera una función normal:

scala > qsort ( Lista ( 6 , 2 , 5 , 9 )) res32 : Lista [ Int ] = Lista ( 2 , 5 , 6 , 9 )       

Extensiones orientadas a objetos

Scala es un lenguaje puro orientado a objetos en el sentido de que cada valor es un objeto . Los tipos de datos y comportamientos de los objetos se describen mediante clases y rasgos . Las abstracciones de clases se amplían mediante subclases y mediante un mecanismo de composición flexible basado en mixin para evitar los problemas de herencia múltiple .

Los rasgos son el reemplazo de Scala para las interfaces de Java . Las interfaces en las versiones de Java inferiores a 8 están muy restringidas y solo pueden contener declaraciones de funciones abstractas. Esto ha llevado a críticas de que proporcionar métodos convenientes en las interfaces es incómodo (los mismos métodos deben volver a implementarse en cada implementación) y que es imposible extender una interfaz publicada de manera compatible con versiones anteriores. Los rasgos son similares a las clases mixtas en el sentido de que tienen casi todo el poder de una clase abstracta regular, careciendo sólo de parámetros de clase (el equivalente de Scala a los parámetros del constructor de Java), ya que los rasgos siempre se mezclan con una clase. El superoperador se comporta especialmente en los rasgos, permitiendo que los rasgos se encadenen mediante composición además de herencia. El siguiente ejemplo es un sistema de ventanas simple:

Ventana de clase abstracta : // resumen def draw ()     clase SimpleWindow extiende la ventana : def draw () println ( "en SimpleWindow" ) // dibuja una ventana básica         rasgo WindowDecoration extiende la ventana   rasgo HorizontalScrollbarDecoration extiende WindowDecoration : // Aquí se necesita "anulación abstracta" para que "super()" funcione porque la // función principal es abstracta. Si fuera concreto, una "anulación" regular sería suficiente. anulación abstracta def draw () println ( "en HorizontalScrollbarDecoration" ) super . draw () // ahora dibuja una barra de desplazamiento horizontal              rasgo VerticalScrollbarDecoration extiende WindowDecoration : anulación abstracta def draw () println ( "en VerticalScrollbarDecoration" ) super . draw () // ahora dibuja una barra de desplazamiento vertical            rasgo TitleDecoration extiende WindowDecoration : anulación abstracta def draw () println ( "en TitleDecoration" ) super . draw () // ahora dibuja la barra de título           

Una variable puede declararse así:

val mywin = nueva SimpleWindow con VerticalScrollbarDecoration con HorizontalScrollbarDecoration con TitleDecoration          

El resultado de llamar mywin.draw()es:

en TítuloDecoración en barra de desplazamiento horizontalDecoración en barra de desplazamiento verticalDecoración en ventana simple    

En otras palabras, la llamada a drawprimero ejecutó el código en TitleDecoration(el último rasgo mezclado), luego (a través de las super()llamadas) volvió a pasar por los otros rasgos mezclados y finalmente al código en Window, aunque ninguno de los rasgos heredados de unos a otros . Esto es similar al patrón decorador , pero es más conciso y menos propenso a errores, ya que no requiere encapsular explícitamente la ventana principal, reenviar explícitamente funciones cuya implementación no se modifica ni depender de la inicialización en tiempo de ejecución de las relaciones entre entidades. . En otros lenguajes, se podría lograr un efecto similar en tiempo de compilación con una larga cadena lineal de herencia de implementación , pero con la desventaja en comparación con Scala de que se tendría que declarar una cadena de herencia lineal para cada combinación posible de mezclas.

Sistema de tipos expresivos

Scala está equipado con un expresivo sistema de tipo estático que principalmente impone el uso seguro y coherente de abstracciones. Sin embargo, el sistema de tipos no es sólido . [38] En particular, el sistema de tipos admite:

Scala es capaz de inferir tipos por uso. Esto hace que la mayoría de las declaraciones de tipos estáticos sean opcionales. No es necesario declarar explícitamente los tipos estáticos a menos que un error del compilador indique la necesidad. En la práctica, se incluyen algunas declaraciones de tipos estáticos para mayor claridad del código.

Enriquecimiento de tipos

Una técnica común en Scala, conocida como "enriquecer mi biblioteca" [39] (originalmente denominada " proxeneta mi biblioteca " por Martin Odersky en 2006; [32] surgieron preocupaciones sobre esta frase debido a sus connotaciones negativas [40] e inmadurez [ 41] ), permite utilizar nuevos métodos como si se hubieran agregado a tipos existentes. Esto es similar al concepto de métodos de extensión de C# pero más poderoso, porque la técnica no se limita a agregar métodos y puede, por ejemplo, usarse para implementar nuevas interfaces. En Scala, esta técnica implica declarar una conversión implícita del tipo que "recibe" el método a un nuevo tipo (normalmente, una clase) que envuelve el tipo original y proporciona el método adicional. Si no se puede encontrar un método para un tipo determinado, el compilador busca automáticamente cualquier conversión implícita aplicable a tipos que proporcionen el método en cuestión.

Esta técnica permite agregar nuevos métodos a una clase existente utilizando una biblioteca complementaria de modo que solo el código que importa la biblioteca complementaria obtenga la nueva funcionalidad y el resto del código no se vea afectado.

El siguiente ejemplo muestra el enriquecimiento del tipo Intcon métodos isEveny isOdd:

objeto MisExtensiones : extensión ( i : Int ) def esPar = i % 2 == 0 def esImpar = ! incluso                 importar MisExtensiones . _ // llevar el enriquecimiento implícito al alcance 4 . es par // -> verdadero   

La importación de los miembros de trae al alcance MyExtensionsla conversión implícita a la clase de extensión . [42]IntPredicates

concurrencia

La biblioteca estándar de Scala incluye soporte para futuros y promesas , además de las API de concurrencia estándar de Java. Originalmente, también incluía soporte para el modelo de actor , que ahora está disponible como una plataforma de fuente separada Akka [43] con licencia de Lightbend Inc. Los actores de Akka pueden distribuirse o combinarse con memoria transaccional de software ( transactors ). Las implementaciones alternativas de procesos secuenciales de comunicación (CSP) para el paso de mensajes basado en canales son la comunicación de objetos Scala [44] o simplemente a través de JCSP .

Un actor es como una instancia de hilo con un buzón. Puede crearse system.actorOfanulando el receivemétodo para recibir mensajes y utilizando el !método (signo de exclamación) para enviar un mensaje. [45] El siguiente ejemplo muestra un EchoServer que puede recibir mensajes y luego imprimirlos.

val echoServer = actor ( nueva Ley : convertirse en : case msg => println ( "echo" + msg ) )           ecoServidor ! "Hola"  

Scala también viene con soporte incorporado para programación de datos paralelos en forma de Colecciones Paralelas [46] integradas en su Biblioteca Estándar desde la versión 2.9.0.

El siguiente ejemplo muestra cómo utilizar Colecciones paralelas para mejorar el rendimiento. [47]

val URL = Lista ( "https://scala-lang.org" , "https://github.com/scala/scala" )    def de URL ( url : cadena ) = scala . yo . Fuente . desdeURL ( url ) . obtener líneas (). cadenamk ( "\n" )     val t = Sistema . URL de currentTimeMillis () . par . map ( fromURL ( _ )) // par devuelve la implementación paralela de una colección println ( "time: " + ( System . currentTimeMillis - t ) + "ms" )          

Además de futuros y promesas, soporte de actores y paralelismo de datos , Scala también admite programación asincrónica con memoria transaccional de software y flujos de eventos. [48]

Computación en clúster

La solución de computación en clúster de código abierto más conocida escrita en Scala es Apache Spark . Además, Apache Kafka , la cola de mensajes de publicación y suscripción popular entre Spark y otras tecnologías de procesamiento de flujo, está escrita en Scala.

Pruebas

Hay varias formas de probar código en Scala. ScalaTest admite múltiples estilos de prueba y puede integrarse con marcos de prueba basados ​​en Java. [49] ScalaCheck es una biblioteca similar a QuickCheck de Haskell . [50] specs2 es una biblioteca para escribir especificaciones de software ejecutables. [51] ScalaMock proporciona soporte para probar funciones de alto orden y curry. [52] JUnit y TestNG son marcos de prueba populares escritos en Java.

Versiones

Comparación con otros lenguajes JVM

Scala se compara a menudo con Groovy y Clojure , otros dos lenguajes de programación que también utilizan JVM. Existen diferencias sustanciales entre estos lenguajes en el sistema de tipos, en la medida en que cada lenguaje admite programación funcional y orientada a objetos, y en la similitud de su sintaxis con la de Java.

Scala se escribe estáticamente , mientras que Groovy y Clojure se escriben dinámicamente . Esto hace que el sistema de tipos sea más complejo y difícil de entender, pero permite detectar casi todos los errores de tipo [38] en tiempo de compilación y puede dar como resultado una ejecución significativamente más rápida. Por el contrario, la escritura dinámica requiere más pruebas para garantizar la corrección del programa y, por lo tanto, es generalmente más lenta para permitir una mayor flexibilidad y simplicidad de programación. En cuanto a las diferencias de velocidad, las versiones actuales de Groovy y Clojure permiten anotaciones de tipo opcionales para ayudar a los programas a evitar la sobrecarga de la escritura dinámica en casos donde los tipos son prácticamente estáticos. Esta sobrecarga se reduce aún más cuando se utilizan versiones recientes de JVM, que se ha mejorado con una instrucción dinámica de invocación para métodos que se definen con argumentos escritos dinámicamente. Estos avances reducen la diferencia de velocidad entre la escritura estática y la dinámica, aunque un lenguaje de escritura estática, como Scala, sigue siendo la opción preferida cuando la eficiencia de la ejecución es muy importante.

En cuanto a los paradigmas de programación, Scala hereda el modelo orientado a objetos de Java y lo extiende de diversas formas. Groovy, aunque también está fuertemente orientado a objetos, está más centrado en reducir la verbosidad. En Clojure, se resta importancia a la programación orientada a objetos, siendo la programación funcional la principal fortaleza del lenguaje. Scala también tiene muchas facilidades de programación funcional, incluidas características que se encuentran en lenguajes funcionales avanzados como Haskell , y trata de ser agnóstico entre los dos paradigmas, permitiendo al desarrollador elegir entre los dos paradigmas o, más frecuentemente, alguna combinación de los mismos.

En cuanto a la similitud de sintaxis con Java, Scala hereda gran parte de la sintaxis de Java, como es el caso de Groovy. Clojure, por otro lado, sigue la sintaxis Lisp , que es diferente tanto en apariencia como en filosofía. [ cita necesaria ]

Adopción

Clasificaciones de idiomas

En 2013, cuando Scala estaba en la versión 2.10, ThoughtWorks Technology Radar, que es un informe bianual basado en la opinión de un grupo de tecnólogos senior, [122] recomendó la adopción de Scala en su categoría de lenguajes y marcos. [123]

En julio de 2014, esta evaluación se hizo más específica y ahora se refiere a “Scala, las partes buenas”, que se describe como “Para usar Scala con éxito, es necesario investigar el lenguaje y tener una opinión muy sólida sobre qué partes son correctas”. para usted, creando su propia definición de Scala, las partes buenas”. [124]

En la edición de 2018 de la encuesta State of Java , [125] que recopiló datos de 5160 desarrolladores sobre diversos temas relacionados con Java, Scala ocupa el tercer lugar en términos de uso de lenguajes alternativos en la JVM . En relación con la edición de la encuesta del año anterior, el uso de Scala entre los lenguajes JVM alternativos cayó del 28,4 % al 21,5 %, superado por Kotlin , que aumentó del 11,4 % en 2017 al 28,8 % en 2018. El índice de popularidad del lenguaje de programación, [126 ] que rastrea las búsquedas de tutoriales de idiomas, clasificó a Scala en el puesto 15 en abril de 2018 con una pequeña tendencia a la baja, y en el puesto 17 en enero de 2021. Esto convierte a Scala en el tercer lenguaje basado en JVM más popular después de Java y Kotlin , en el puesto 12.

Las clasificaciones de lenguajes de programación de RedMonk, que establecen clasificaciones basadas en la cantidad de proyectos de GitHub y preguntas formuladas en Stack Overflow , en enero de 2021 clasificaron a Scala en el puesto 14. [127] Aquí, Scala se colocó dentro de un grupo de lenguajes de segundo nivel, por delante de Go , PowerShell y Haskell , y detrás de Swift , Objective -C , Typescript y R.

El índice TIOBE [128] de popularidad de lenguajes de programación emplea clasificaciones en motores de búsqueda de Internet y recuentos de publicaciones similares para determinar la popularidad del lenguaje. En septiembre de 2021, Scala ocupaba el puesto 31. En este ranking, Scala estaba por delante de Haskell (38.º) y Erlang , pero por debajo de Go (14.º), Swift (15.º) y Perl (19.º).

A partir de 2022 , los lenguajes basados ​​en JVM como Clojure, Groovy y Scala están altamente clasificados, pero siguen siendo significativamente menos populares que el lenguaje Java original , que generalmente se ubica entre los tres primeros lugares. [127] [128]

Compañías

Crítica

En noviembre de 2011, Yammer se alejó de Scala por motivos que incluían la curva de aprendizaje para los nuevos miembros del equipo y la incompatibilidad de una versión del compilador de Scala a la siguiente. [158] En marzo de 2015, el ex vicepresidente del grupo de ingeniería de plataformas en Twitter , Raffi Krikorian , declaró que no habría elegido Scala en 2011 debido a su curva de aprendizaje . [159] El mismo mes, el vicepresidente senior de LinkedIn , Kevin Scott, declaró su decisión de "minimizar [su] dependencia de Scala". [160]

Ver también

Referencias

  1. ^ "Scala 3.3.1 LTS".
  2. ^ Error: no se puede mostrar la referencia correctamente. Consulte la documentación para obtener más detalles.
  3. ^ "Archivo de aviso". GitHub . 2019-01-24 . Consultado el 4 de diciembre de 2019 .
  4. ^ "Macros de Scala".
  5. ^ Fogus, Michael (6 de agosto de 2010). "MartinOdersky lleva (5) a la lista". Envíe más paramédicos . Consultado el 9 de febrero de 2012 .
  6. ^ abcd Odersky, Martin (11 de enero de 2006). "El experimento de Scala: ¿podemos proporcionar un mejor soporte lingüístico para los sistemas de componentes?" (PDF) . Consultado el 22 de junio de 2016 .
  7. ^ abcd Odersky, Martín; et al. (2006). "Una descripción general del lenguaje de programación Scala" (PDF) (2ª ed.). Escuela Politécnica Federal de Lausana (EPFL). Archivado (PDF) desde el original el 9 de julio de 2020.
  8. ^ Odersky, Martín (2008). Programación en Scala. Mountain View, California: Artima. pag. 3.ISBN _ 9780981531601. Consultado el 12 de junio de 2014 .
  9. ^ Potvin, Pascal; Bonja, Mario (24 de septiembre de 2015). SDL 2013: Ingeniería de confiabilidad basada en modelos . Apuntes de conferencias sobre informática. vol. 7916. arXiv : 1509.07326 . doi :10.1007/978-3-642-38911-5. ISBN 978-3-642-38910-8. S2CID  1214469.
  10. ^ "Preguntas frecuentes: interoperabilidad de Java". Scala-lang.org . Consultado el 6 de febrero de 2015 .
  11. ^ Martin Odersky (17 de junio de 2020). Martin Odersky: una actualización de Scala 3 (vídeo). YouTube. El evento ocurre entre las 36:35 y las 45:08. Archivado desde el original el 21 de diciembre de 2021 . Consultado el 24 de abril de 2021 .
  12. ^ "Efecto exp.". escala . Consultado el 31 de julio de 2022 .
  13. ^ Loverdo, Christos (2010). Pasos en Scala: una introducción a la programación funcional de objetos. Prensa de la Universidad de Cambridge . pag. xiii. ISBN 9781139490948. Consultado el 31 de julio de 2014 .
  14. ^ abcd Odersky, Martin (9 de junio de 2006). "Una breve historia de Scala". Artima.com .
  15. ^ abcd Odersky, M.; Rompf, T. (2014). "Unificando la programación funcional y orientada a objetos con Scala". Comunicaciones de la ACM . 57 (4): 76. doi : 10.1145/2591013 .
  16. ^ Martin Odersky, "La especificación del lenguaje Scala versión 2.7"
  17. ^ "Scala Team gana la subvención del ERC" . Consultado el 4 de julio de 2015 .
  18. ^ "Soporte comercial para Scala". 2011-05-12 . Consultado el 18 de agosto de 2011 .
  19. ^ "Por qué invertimos en Typesafe: las aplicaciones modernas exigen herramientas modernas". 2011-05-12 . Consultado el 8 de mayo de 2018 .
  20. ^ "Scala de código abierto obtiene respaldo comercial". 2011-05-12 . Consultado el 9 de octubre de 2011 .
  21. ^ "El pionero de la computación en la nube, Martin Odersky, finaliza su nueva empresa Typesafe". 2011-05-12 . Consultado el 24 de agosto de 2011 .
  22. ^ "Scala en Android". Archivado desde el original el 20 de junio de 2016 . Consultado el 8 de junio de 2016 .
  23. ^ "¡Scala 2.12.8 ya está disponible!". 2018-12-04 . Consultado el 9 de diciembre de 2018 .
  24. ^ "Scala Js ya no es experimental | El lenguaje de programación Scala". Scala-lang.org . Consultado el 28 de octubre de 2015 .
  25. ^ "Lanzamientos · scala-js/Scala-js". GitHub .
  26. ^ Krill, Paul (15 de marzo de 2017). "La variante reducida de Scala corta los vínculos con la JVM". InfoMundo . Consultado el 21 de marzo de 2017 .
  27. ^ Krill, Paul (11 de mayo de 2016). "El lenguaje Scala se acerca al metal desnudo". InfoMundo .
  28. ^ Se eliminó el backend .net. por paulp · Solicitud de extracción n.° 1718 · scala/scala · GitHub. Github.com (5 de diciembre de 2012). Recuperado el 2 de noviembre de 2013.
  29. ^ "Comenzando con Scala". Scala-lang.org . 15 de julio de 2008 . Consultado el 31 de julio de 2014 .
  30. ^ "Inicio". Blog.lostlake.org. Archivado desde el original el 31 de agosto de 2010 . Consultado el 25 de junio de 2013 .
  31. ^ Las estructuras de control integradas de Scala, como ifo, whileno se pueden volver a implementar. Existe un proyecto de investigación, Scala-Virtualized, que tenía como objetivo eliminar estas restricciones: Adriaan Moors, Tiark Rompf, Philipp Haller y Martin Odersky. Scala-virtualizado. Actas del taller ACM SIGPLAN 2012 sobre evaluación parcial y manipulación de programas , 117–120. Julio de 2012.
  32. ^ ab "Mejora mi biblioteca". Artima.com. 2006-10-09 . Consultado el 25 de junio de 2013 .
  33. ^ "Expresiones | Scala 2.13". scala-lang.org . Consultado el 24 de mayo de 2021 .
  34. ^ "Colecciones mutables e inmutables: documentación de Scala" . Consultado el 30 de abril de 2020 .
  35. ^ "Colecciones - Clases de colecciones concretas inmutables - Documentación de Scala" . Consultado el 4 de julio de 2015 .
  36. ^ Dougherty, rico. "Blog de Rich Dougherty" . Consultado el 4 de julio de 2015 .
  37. ^ "TailCalls - API de la biblioteca estándar de Scala (Scaladoc) 2.10.2 - scala.util.control.TailCalls". Scala-lang.org . Consultado el 25 de junio de 2013 .
  38. ^ ab "Los sistemas de tipos de Java y Scala no son sólidos" (PDF) .
  39. ^ Giarrusso, Paolo G. (2013). "¡Reifica las consultas de tu colección sobre modularidad y velocidad!". Actas de la duodécima conferencia internacional anual sobre desarrollo de software orientado a aspectos . ACM. arXiv : 1210.6284 . Código Bib : 2012arXiv1210.6284G. También conocido como patrón proxeneta-mi-biblioteca
  40. ^ Gilbert, Clint (15 de noviembre de 2011). "¿Cuál es la máxima prioridad para que Scala tenga éxito en el mundo empresarial (¿Debería estar en el debate de Scala?)?". Scala-lang.org . Consultado el 8 de mayo de 2019 .
  41. ^ "¿Deberíamos" enriquecer "o" proxenetar "las bibliotecas Scala?". stackexchange.com . 17 de junio de 2013 . Consultado el 15 de abril de 2016 .
  42. ^ Se introdujeron clases implícitas en Scala 2.10 para hacer que las extensiones de métodos sean más concisas. Esto equivale a agregar un método implicit def IntPredicate(i: Int) = new IntPredicate(i). La clase también se puede definir como implicit class IntPredicates(val i: Int) extends AnyVal { ... }, lo que produce la llamada clase de valor , también introducida en Scala 2.10. Luego, el compilador eliminará las instancias reales y generará métodos estáticos en su lugar, lo que permitirá que los métodos de extensión prácticamente no tengan sobrecarga de rendimiento.
  43. ^ ¿ Qué es Akka?, documentación en línea de Akka
  44. ^ Sufrin, Bernard (2008). "Comunicación de objetos Scala". En Welch, PH; Stepney, S.; polaco, FAC; Barnes, FRM; McEwan, AA; Stiles, GS; Broenink, JF; Sampson, AT (eds.). Comunicación de arquitecturas de procesos 2008: WoTUG-31 (PDF) . Prensa IOS. ISBN 978-1586039073.
  45. ^ Yan, Kay. «Gira por la Scala» . Consultado el 4 de julio de 2015 .
  46. ^ "Parallelcollections - Descripción general - Documentación de Scala". Docs.scala-lang.org . Consultado el 25 de junio de 2013 .
  47. ^ Yan, Kay. «Gira por la Scala» . Consultado el 4 de julio de 2015 .
  48. ^ Aprendizaje de programación concurrente en Scala, Aleksandar Prokopec, Packt Publishing
  49. ^ Kops, Micha (13 de enero de 2013). "Una breve introducción a ScalaTest". hascode.com . Consultado el 7 de noviembre de 2014 .
  50. ^ Nilsson, Rickard (17 de noviembre de 2008). "Scala Check 1.5". Scala-lang.org . Consultado el 7 de noviembre de 2014 .
  51. ^ "Cree aplicaciones web utilizando Scala y Play Framework". workwithplay.com . 22 de mayo de 2013 . Consultado el 7 de noviembre de 2014 .
  52. ^ Carnicero, Paul (4 de junio de 2012). "Lanzamiento preliminar de ScalaMock 3.0". paulbutcher.com . Archivado desde el original el 8 de noviembre de 2014 . Consultado el 7 de noviembre de 2014 .
  53. ^ abcdefg "Historial de cambios de Scala". Scala-lang.org . Archivado desde el original el 9 de octubre de 2007.
  54. ^ "Eliminado: literales XML". dotty.epfl.ch . Consultado el 5 de marzo de 2021 .
  55. ^ "Cambios en la versión 2.0 (12 de marzo de 2006)". Scala-lang.org . 2006-03-12 . Consultado el 7 de noviembre de 2014 .
  56. ^ "Cambios en la versión 2.1.8 (23 de agosto de 2006)". Scala-lang.org . 2006-08-23 . Consultado el 7 de noviembre de 2014 .
  57. ^ "Cambios en la versión 2.3.0 (23 de noviembre de 2006)". Scala-lang.org . 23 de noviembre de 2006 . Consultado el 7 de noviembre de 2014 .
  58. ^ "Cambios en la versión 2.4.0 (9 de marzo de 2007)". Scala-lang.org . 2007-03-09 . Consultado el 7 de noviembre de 2014 .
  59. ^ "Cambios en la versión 2.5 (2 de mayo de 2007)". Scala-lang.org . 2007-05-02 . Consultado el 7 de noviembre de 2014 .
  60. ^ "Cambios en la versión 2.6 (27 de julio de 2007)". Scala-lang.org . 2007-06-27 . Consultado el 7 de noviembre de 2014 .
  61. ^ "Cambios en la versión 2.7.0 (7 de febrero de 2008)". Scala-lang.org . 2008-02-07 . Consultado el 7 de noviembre de 2014 .
  62. ^ "Cambios en la versión 2.8.0 (14 de julio de 2010)". Scala-lang.org . 2010-07-10 . Consultado el 7 de noviembre de 2014 .
  63. ^ "Cambios en la versión 2.9.0 (12 de mayo de 2011)". Scala-lang.org . 2011-05-12 . Consultado el 7 de noviembre de 2014 .
  64. ^ "Cambios en la versión 2.10.0". Scala-lang.org . 2013-01-04 . Consultado el 7 de noviembre de 2014 .
  65. ^ Harrah, Mark. "Clases de valores y rasgos universales". Scala-lang.org . Consultado el 7 de noviembre de 2014 .
  66. ^ Suereth, Josh. "SIP-13 - Clases implícitas". Scala-lang.org . Archivado desde el original el 8 de noviembre de 2014 . Consultado el 7 de noviembre de 2014 .
  67. ^ Suereth, Josh. "Interpolación de cadenas". Scala-lang.org . Consultado el 7 de noviembre de 2014 .
  68. ^ Haller, Philipp; Prokopec, Aleksandar. "Futuros y Promesas". Scala-lang.org . Consultado el 7 de noviembre de 2014 .
  69. ^ "SIP-17 - Tipo dinámico". Scala-lang.org . Archivado desde el original el 8 de noviembre de 2014 . Consultado el 7 de noviembre de 2014 .
  70. ^ "SIP-18: características del lenguaje modularizado". Scala-lang.org . Archivado desde el original el 8 de noviembre de 2014 . Consultado el 7 de noviembre de 2014 .
  71. ^ Prokopec, Aleksandar; Molinero, brezo. "Colecciones paralelas". Scala-lang.org . Consultado el 7 de noviembre de 2014 .
  72. ^ Molinero, brezo; Burmako, Eugenio. "Resumen de la reflexión". Scala-lang.org . Consultado el 7 de noviembre de 2014 .
  73. ^ Burmako, Eugenio. "Macros de definición". Scala-lang.org . Consultado el 7 de noviembre de 2014 .
  74. ^ "¡Scala 2.10.2 ya está disponible!". Scala-lang.org . 2013-06-06. Archivado desde el original el 8 de noviembre de 2014 . Consultado el 7 de noviembre de 2014 .
  75. ^ "¡Scala 2.10.3 ya está disponible!". Scala-lang.org . 2013-10-01. Archivado desde el original el 8 de noviembre de 2014 . Consultado el 7 de noviembre de 2014 .
  76. ^ "¡Scala 2.10.4 ya está disponible!". Scala-lang.org . 2014-03-18 . Consultado el 7 de enero de 2015 .
  77. ^ "¡Scala 2.10.5 ya está disponible!". Scala-lang.org . 2015-03-04 . Consultado el 23 de marzo de 2015 .
  78. ^ "¡Scala 2.11.0 ya está disponible!". Scala-lang.org . 2014-04-21 . Consultado el 7 de noviembre de 2014 .
  79. ^ "¡Scala 2.11.1 ya está disponible!". Scala-lang.org . 2014-05-20 . Consultado el 7 de noviembre de 2014 .
  80. ^ "¡Scala 2.11.2 ya está disponible!". Scala-lang.org . 22 de julio de 2014 . Consultado el 7 de noviembre de 2014 .
  81. ^ "¡Scala 2.11.4 ya está disponible!". Scala-lang.org . 2014-10-30 . Consultado el 7 de noviembre de 2014 .
  82. ^ "¡Scala 2.11.5 ya está disponible!". Scala-lang.org . 2015-01-08 . Consultado el 22 de enero de 2015 .
  83. ^ "¡Scala 2.11.6 ya está disponible!". Scala-lang.org . 2015-03-05 . Consultado el 12 de marzo de 2015 .
  84. ^ "¡Scala 2.11.7 ya está disponible!". Scala-lang.org . 23 de junio de 2015 . Consultado el 3 de julio de 2015 .
  85. ^ "¡Scala 2.11.8 ya está disponible!". Scala-lang.org . 2016-03-08 . Consultado el 9 de marzo de 2016 .
  86. ^ ab "¡Tres nuevos lanzamientos y más bondades de GitHub!". Scala-lang.org . 2017-04-18 . Consultado el 19 de abril de 2017 .
  87. ^ "Actualización de seguridad: 2.12.4, 2.11.12, 2.10.7 (CVE-2017-15288)". Scala-lang.org . 2017-11-13 . Consultado el 4 de mayo de 2018 .
  88. ^ "¡Scala 2.12.0 ya está disponible!". Scala-lang.org . 03/11/2016 . Consultado el 8 de enero de 2017 .
  89. ^ "¡Scala 2.12.1 ya está disponible!". Scala-lang.org . 2016-12-05 . Consultado el 8 de enero de 2017 .
  90. ^ "¡Scala 2.12.3 ya está disponible!". Scala-lang.org . 2017-07-26 . Consultado el 16 de agosto de 2017 .
  91. ^ "¡Scala 2.12.4 ya está disponible!". Scala-lang.org . 2017-10-18 . Consultado el 26 de octubre de 2017 .
  92. ^ "¡Scala 2.12.5 ya está disponible!". Scala-lang.org . 2018-03-15 . Consultado el 20 de marzo de 2018 .
  93. ^ "¡Scala 2.12.6 ya está disponible!". Scala-lang.org . 2018-04-27 . Consultado el 4 de mayo de 2018 .
  94. ^ "¡Scala 2.12.7 ya está disponible!". Scala-lang.org . 2018-09-27 . Consultado el 9 de octubre de 2018 .
  95. ^ "¡Scala 2.12.8 ya está disponible!". Scala-lang.org . 2018-12-04 . Consultado el 9 de diciembre de 2018 .
  96. ^ "¡Scala 2.12.9 ya está disponible!". Scala-lang.org . 2019-08-05 . Consultado el 20 de enero de 2021 .
  97. ^ "¡Scala 2.12.10 ya está disponible!". Scala-lang.org . 2019-09-10 . Consultado el 20 de enero de 2021 .
  98. ^ "¡Scala 2.12.11 ya está disponible!". Scala-lang.org . 2020-03-16 . Consultado el 20 de enero de 2021 .
  99. ^ "¡Scala 2.12.12 ya está disponible!". Scala-lang.org . 2020-07-13 . Consultado el 20 de enero de 2021 .
  100. ^ "¡Scala 2.12.13 ya está disponible!". Scala-lang.org . 2021-01-12 . Consultado el 20 de enero de 2021 .
  101. ^ "¡Scala 2.12.14 ya está disponible!". Scala-lang.org . 2021-05-28 . Consultado el 15 de abril de 2022 .
  102. ^ "¡Scala 2.12.15 ya está disponible!". Scala-lang.org . 2021-09-14 . Consultado el 19 de junio de 2022 .
  103. ^ "¡Scala 2.12.16 ya está disponible!". Scala-lang.org . 2022-06-10 . Consultado el 19 de junio de 2022 .
  104. ^ "¡Scala 2.12.17 ya está disponible!". Scala-lang.org . 2022-06-10 . Consultado el 16 de septiembre de 2022 .
  105. ^ "¡Scala 2.12.18 ya está disponible!". Scala-lang.org . 2022-06-10 . Consultado el 7 de junio de 2023 .
  106. ^ "¡Scala 2.13.0 ya está disponible!". Scala-lang.org . 2019-06-11 . Consultado el 17 de junio de 2018 .
  107. ^ "¡Scala 2.13.1 ya está disponible!". Scala-lang.org . 2019-09-18 . Consultado el 20 de enero de 2021 .
  108. ^ "¡Scala 2.13.2 ya está disponible!". Scala-lang.org . 2020-04-22 . Consultado el 20 de enero de 2021 .
  109. ^ "¡Scala 2.13.3 ya está disponible!". Scala-lang.org . 2020-06-25 . Consultado el 20 de enero de 2021 .
  110. ^ "¡Scala 2.13.4 ya está disponible!". Scala-lang.org . 2020-11-19 . Consultado el 20 de enero de 2021 .
  111. ^ "¡Scala 2.13.5 ya está disponible!". Scala-lang.org . 2021-02-22 . Consultado el 26 de febrero de 2021 .
  112. ^ "¡Scala 2.13.6 ya está disponible!". Scala-lang.org . 2021-05-17 . Consultado el 15 de abril de 2022 .
  113. ^ "¡Scala 2.13.7 ya está disponible!". Scala-lang.org . 2021-11-01 . Consultado el 15 de abril de 2022 .
  114. ^ "¡Scala 2.13.8 ya está disponible!". Scala-lang.org . 2022-01-12 . Consultado el 15 de abril de 2022 .
  115. ^ "¡Scala 2.13.9 ya está disponible!". Scala-lang.org . 2022-09-21 . Consultado el 28 de agosto de 2023 .
  116. ^ "¡Scala 2.13.10 ya está disponible!". Scala-lang.org . 2022-10-13 . Consultado el 28 de agosto de 2023 .
  117. ^ "¡Scala 2.13.11 ya está disponible!". Scala-lang.org . 2023-06-07 . Consultado el 28 de agosto de 2023 .
  118. ^ "¡Scala 3 ya está aquí!". Scala-lang.org . 2021-05-14 . Consultado el 26 de mayo de 2021 .
  119. ^ "Escala 3.1.2". Scala-lang.org . 2022-04-12 . Consultado el 19 de junio de 2022 .
  120. ^ "Escala 3.2.2". Scala-lang.org . 2023-01-30 . Consultado el 28 de agosto de 2023 .
  121. ^ "Escala 3.3.0". Scala-lang.org . 2023-05-30 . Consultado el 28 de agosto de 2023 .
  122. ^ "Preguntas frecuentes sobre el radar de tecnología ThoughWorks".
  123. ^ "Radar de tecnología ThoughtWorks MAYO DE 2013" (PDF) .
  124. ^ "Scala, las partes buenas".
  125. ^ "El estado de Java en 2018".
  126. ^ "Índice de popularidad del lenguaje de programación".
  127. ^ ab O'Grady, Stephen (1 de marzo de 2021). "Ranking de lenguajes de programación RedMonk: enero de 2021". Monje rojo .
  128. ^ ab "Índice TIOBE de mayo de 2021".
  129. ^ Greene, Kate (1 de abril de 2009). "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 . Consultado el 6 de abril de 2009 .
  130. ^ Breck, Colin; Enlace, Percy (23 de marzo de 2020). «Planta de Energía Virtual Tesla (Arquitectura y Diseño)» . Consultado el 28 de marzo de 2023 .
  131. ^ "Código fuente de Apache Kafka en GitHub". Fundación de software Apache . Consultado el 29 de marzo de 2023 .
  132. ^ "Juega Framework, Akka y Scala en Gilt Groupe". Curva de luz. 15 de julio de 2013 . Consultado el 16 de julio de 2016 .
  133. ^ "Scala, Lift y el futuro". Archivado desde el original el 13 de enero de 2016 . Consultado el 4 de julio de 2015 .
  134. ^ Saeta, Brennan (17 de febrero de 2014). "Por qué amamos Scala en Coursera". Ingeniería de Coursera . Consultado el 21 de septiembre de 2023 .
  135. ^ "El primer ministro de ingeniería de Apple, Jarrod Nettles, en Twitter". Ortigas Jarrod . Consultado el 11 de marzo de 2016 .
  136. ^ "30 puestos vacantes en Scala en Apple". Alvin Alejandro . Consultado el 11 de marzo de 2016 .
  137. ^ David Reid y Tania Teixeira (26 de febrero de 2010). "¿Está la gente dispuesta a pagar por las noticias online?". BBC . Consultado el 28 de febrero de 2010 .
  138. ^ "Guardian cambia de Java a Scala". Heise en línea . 2011-04-05 . Consultado el 5 de abril de 2011 .
  139. ^ "Guardian.co.uk Cambio de Java a Scala". InfoQ.com. 2011-04-04 . Consultado el 5 de abril de 2011 .
  140. ^ Roy, Sumán; Sundaresan, Krishna (13 de mayo de 2014). "Construyendo Blackbeard: un sistema de distribución impulsado por Play, Scala y Akka". Los New York Times . Consultado el 20 de julio de 2014 .
  141. ^ Pavley, John (11 de agosto de 2013). "Avance: HuffPost lleva la colaboración en tiempo real a la sala de redacción". Correo Huffington . Consultado el 20 de julio de 2014 .
  142. ^ Binstock, Andrew (14 de julio de 2011). "Entrevista con Martin Odersky de Scala". Diario del Dr. Dobb . Consultado el 10 de febrero de 2012 .
  143. ^ Synodinos, Dionysios G. (11 de octubre de 2010). "Señal de LinkedIn: un estudio de caso para Scala, JRuby y Voldemort". InfoQ .
  144. ^ "Las reuniones de la vida real merecen API en tiempo real".
  145. ^ "La actualización en tiempo real llega a la aplicación web Remember The Milk".
  146. ^ "QUÉ ES SCALA". 8 de marzo de 2023 . Consultado el 17 de marzo de 2023 .
  147. ^ Novet, Jordania (4 de junio de 2015). "Airbnb anuncia Aerosolve, un paquete de software de aprendizaje automático de código abierto" . Consultado el 9 de marzo de 2016 .
  148. ^ Kops, Alejandro (14 de diciembre de 2015). "Zalando Tech: de Java a Scala en menos de tres meses" . Consultado el 9 de marzo de 2016 .
  149. ^ Calçado, Phil (13 de junio de 2014). "Creación de productos en SoundCloud: Parte III: Microservicios en Scala y Finagle" . Consultado el 9 de marzo de 2016 .
  150. ^ "Estudios de casos de clientes: SoundCloud". Concurrente Inc. 2014-11-18 . Consultado el 9 de marzo de 2016 .
  151. ^ Scala en Morgan Stanley (vídeo). Las habilidades importan. 2015-12-03 . Consultado el 11 de marzo de 2016 .
  152. ^ Greg Soltis (3 de diciembre de 2015). SF Scala, Greg Soltis: Servicios de alto rendimiento en Scala (vídeo). Las habilidades importan. Archivado desde el original el 21 de diciembre de 2021 . Consultado el 11 de marzo de 2016 .
  153. ^ Lee Mighdoll. "Trabajos de Scala en Nest" . Consultado el 11 de marzo de 2016 .
  154. ^ Nurun. "Nurun lanza una plataforma transaccional rediseñada con Walmart Canadá" . Consultado el 11 de diciembre de 2013 .
  155. ^ Horie, André K. (31 de enero de 2017). "Reescribiendo el motor de Duolingo en Scala" . Consultado el 3 de febrero de 2017 .
  156. ^ "Repositorio HMRC GitHub". GitHub .
  157. ^ "Conozca a M1 Finance, un patrocinador Gold de ScalaCon". EscalaCon . Consultado el 2 de septiembre de 2023 .
  158. ^ Hale, Coda (29 de noviembre de 2011). "El resto de la historia". codahale.com . Consultado el 7 de noviembre de 2013 .
  159. ^ Krikorian, Raffi (17 de marzo de 2015). Conferencia de arquitectura de software O'Reilly 2015 Compilación completa de videos: Re-arquitectura sobre la marcha - Raffi Krikorian - Parte 3 (video). Medios O'Reilly. El evento ocurre a las 4:57 . Consultado el 8 de marzo de 2016 . Lo que habría hecho diferente hace cuatro años es usar Java y no Scala como parte de esta reescritura. [...] un ingeniero tardaría dos meses antes de ser completamente productivo y escribir código Scala.[ enlace muerto permanente ]
  160. ^ Scott, Kevin (11 de marzo de 2015). "¿LinkedIn se está deshaciendo de Scala?". quora.com . Consultado el 25 de enero de 2016 .
  161. ^ "Chisel: construcción de hardware en un lenguaje integrado Scala". APSIRE de UC Berkeley . Consultado el 27 de mayo de 2020 .

Otras lecturas