programming-languages - software - scala vs python
¿Qué tiene de bueno Scala? (14)
Aquí hay algunas explicaciones bastante profundas para el atractivo de los lenguajes funcionales.
¿Cómo / por qué los lenguajes funcionales (específicamente Erlang) escalan bien?
¿Qué hace que Scala sea un lenguaje tan maravilloso, aparte del sistema de tipos? Casi todo lo que leo sobre el lenguaje hace resaltar el "tipado fuerte" como una gran razón para usar Scala, pero tiene que haber más que eso. ¿Cuáles son algunas de las otras características atractivas y / o interesantes del lenguaje que hacen de Scala una herramienta realmente útil?
Cada día que codifique Java se volverá cada vez más miserable, cada día que codifique Scala se sentirá más feliz.
El sistema de tipo es realmente la característica más distintiva de Scala. También tiene muchas ventajas sintácticas sobre, por ejemplo, Java.
Pero para mí, las características más convincentes de Scala son:
- Módulos de primera clase .
- Tipos de mayor nivel (tipo de polimorfismo constructor).
- Implicits .
En efecto, estas características te permiten aproximar (y en cierto modo superar) las clases de tipos de Haskell. Combinados, le permiten escribir un código excepcionalmente modular.
En breve:
- Obtiene la potencia y la independencia de la plataforma de las bibliotecas de Java, pero sin la repetición y la verbosidad.
- Obtiene la simplicidad y la productividad de Ruby, pero con la tipificación estática y el bytecode compilado.
- Obtiene las bondades funcionales y el soporte de concurrencia de Haskell, pero sin un cambio de paradigma completo y con los beneficios de la orientación a objetos.
Lo que encuentro especialmente atractivo en todas sus magníficas características, entre otras:
- La mayoría de los patrones de diseño orientados a objetos que requieren gran cantidad de código repetitivo en Java son compatibles de forma nativa, por ejemplo, Singleton (a través de objetos), Adaptador, Decorador (a través de rasgos e implícitos), Visitante (a través de patrones), Estrategia (a través de cierres), etc. .
- Puede definir sus modelos de dominio y DSL de manera muy concisa, luego puede ampliarlos con las características necesarias (notificación, manejo de asociación, análisis sintáctico, serialización), sin la necesidad de generación de código o marcos.
- Y finalmente, hay una interoperabilidad total con la plataforma Java bien soportada. Puede mezclar Java y Scala en ambas direcciones. No hay mucha penalización ni problemas de compatibilidad cuando se cambia a Scala después de haber experimentado las molestias de Java que hacen que el código sea difícil de mantener.
Es una mezcla de las mejores partes de un montón de idiomas, lo que no es amar:
- La sintaxis escueta de Ruby
- El rendimiento de Java
- Actor de Erlang''s Support
- Cierres / Bloques
- Conveniente taquigrafía para mapas y matrices
Estas son algunas de las cosas que me hicieron favorecer a Scala (sobre, por ejemplo, Java habitual):
a) Escriba inferencia. La forma Java de hacerlo:
Map<Something, List<SomethingElse>> list = new HashMap<Something, List<SomethingElse>>()
.. es bastante detallado en comparación con Scala. El compilador debería ser capaz de resolverlo si le das una de estas listas.
b) Funciones de primer orden. De nuevo, esta funcionalidad se puede emular con clases, pero es fea.
c) Colecciones que tienen map
y fold
. Estos dos se relacionan con (b), y también estos dos son algo que deseo cada vez que tengo que escribir Java.
d) Coincidencia de patrones y clases de casos.
e) Varianzas, lo que significa que si S extends T
, entonces la List[S] extends List[T]
.
Agregue algunos tipos estáticos de bondad también, y me vendieron en el lenguaje bastante rápido.
Expresividad del flujo de control. Por ejemplo, es muy común tener una colección de datos que debe procesar de alguna manera. Esta podría ser una lista de operaciones en las que el procesamiento implica la agrupación por parte de algunas propiedades (las monedas de los instrumentos de inversión) y luego hacer una suma (para obtener totales por moneda).
En Java esto implica separar un fragmento de código para hacer el agrupamiento (unas pocas líneas de for-loop) y luego otro fragmento de código para hacer la suma (otro para el ciclo). En Scala, este tipo de cosas normalmente se puede lograr en una línea de código usando la programación funcional y luego doblando, que dice muy expresivamente l-to-r.
Por supuesto, esto es solo un argumento para un lenguaje funcional sobre Java.
Las grandes características de Scala ya han sido mencionadas. Sin embargo, una cosa que brilla a través de todas las características pasadas es la forma en que se integra todo el gusto.
Scala se las arregla para ser uno de los lenguajes más poderosos que existen sin tener la sensación de haberse atornillado a las características a toda prisa. Tampoco el lenguaje es un ejercicio académico para demostrar un punto. La innovación y los conceptos realmente avanzados se incorporan al lenguaje con una practicidad y elegancia sorprendentes.
En resumen: Martin Odersky es un genio del diseño puro. ¡Eso es lo mejor de Scala!
Quiero agregar el multi-paradigma (OO y FP) que le da a Scala una ventaja sobre otros lenguajes
Scala a menudo es exhibido por tener cierres e implícitas. No es de extrañar, ya que la falta de cierres y el tipado explícito son quizás las dos fuentes más importantes de repetición de Java.
Pero una vez que lo examinas un poco más, va más allá de Java sin los molestos bits. Tal vez la mayor fortaleza de Scala no sea una característica específica, sino el éxito de unificar todas las características mencionadas en otras respuestas. .
Post Funcional
La unión de la orientación a objetos y la programación funcional, por ejemplo: debido a que las funciones son objetos, Scala pudo hacer que Maps implementara la interfaz de Función, por lo que cuando usa un mapa para buscar un valor, no es diferente sintácticamente de usar una función para calcular un valor. Al unificar tan bien estos paradigmas, Scala realmente es un lenguaje post-funcional.
O la sobrecarga del operador, que se logra al no tener realmente operadores, son solo métodos utilizados en la notación infija. Entonces 1 + 2
simplemente está llamando al método +
en un número entero. Si el método se llamó plus
lugar, entonces lo usaría como 1 plus 2
que no es diferente de 1.plus(2)
. Esto es posible debido a otra combinación de características; todo en Scala es un objeto, no hay primitivos, por lo que los enteros pueden tener métodos.
Otras funciones Fusion
También se mencionaron las clases de tipo, logradas mediante una combinación de tipos de alto grado, objetos únicos e implícitos.
Otras características que funcionan bien juntas son las clases de casos y la coincidencia de patrones, lo que le permite construir y deconstruir fácilmente tipos de datos algebraicos, sin tener que escribir manualmente toda la tediosa lógica de igualdad, hashcode, constructor y getter / setter que exige Java.
Especificar la inmutabilidad por defecto, ofrecer valores diferidos y proporcionar funciones de primera clase se combinan para ofrecerle un lenguaje que es muy adecuado para construir estructuras de datos funcionales eficientes.
La lista continúa, pero he estado usando Scala durante más de 3 años, y todavía estoy sorprendido casi a diario de lo bien que todo funciona en conjunto.
Eficiente y versátil
Scala también es un lenguaje pequeño, con una especificación que (¡sorprendentemente!) Solo necesita ser 1/3 del tamaño de Java. Esto se debe en parte a que Java tiene muchos casos especiales en la especificación de que Scala se simplifica, en parte debido a la eliminación de características como primitivas y operadores, y en parte porque se ha trasladado una gran cantidad de funcionalidad del lenguaje a las bibliotecas.
Como beneficio de esto, todas las técnicas disponibles para los autores de la biblioteca de Scala también están disponibles para cualquier usuario de Scala, lo que lo convierte en un excelente lenguaje para definir sus propios constructos de control de flujo y para construir DSL. Esto se ha utilizado con gran efecto en proyectos como Akka, un marco de Actor de terceros.
Profundo
Finalmente, escala toda la gama de estilos de programación.
El intérprete de tiempo de ejecución (conocido como REPL) le permite explorar ideas rápidamente en una sesión interactiva, y los archivos Scala también se pueden ejecutar como scripts sin necesidad de una compilación explícita. Cuando se combina con la inferencia de tipo, esto le da a Scala la sensación de un lenguaje dinámico como Ruby, Perl o un script bash.
En el otro extremo del espectro, los rasgos, las clases, los objetos y los tipos propios le permiten construir un sistema empresarial a gran escala basado en distintos componentes y utilizando la inyección de dependencia sin la necesidad de herramientas de terceros. Scala también se integra con las bibliotecas de Java en un nivel casi a la par con Java nativo, y al ejecutar JVM puede aprovechar todas las ventajas de velocidad que ofrece esa plataforma, además de ser perfectamente utilizable en contenedores como tomcat o con OSGi.
Si abandonamos la discusión de las características y hablamos sobre el estilo, diría que es un estilo de codificación de línea de tubería. Empiezas a partir de algún objeto o colección, escribe punto y propiedad o punto y transformación y lo haces hasta que formes el resultado deseado. De esta forma, es fácil escribir una cadena de transoformaciones que también será fácil de leer. Los rasgos, en cierta medida, también le permitirán aplicar el mismo enfoque para construir tipos.
Soy nuevo en Scala, pero mi impresión es:
La integración de JVM realmente buena será el factor determinante. JRuby puede llamar a Java y java puede llamar al código JRuby, pero está llamando explícitamente a otro idioma, no a la integración limpia de Scala-Java. De modo que puede usar bibliotecas Java e incluso mezclar y combinar en el mismo proyecto.
Empecé a buscar en scala cuando me di cuenta de que lo que impulsará el próximo gran lenguaje es la simultaneidad fácil. La JVM tiene buena concurrencia desde el punto de vista del rendimiento. Estoy seguro de que alguien dirá que Erlang es mejor, pero Scala es realmente utilizable por programadores normales.
Donde Java se cae es que es tan dolorosamente detallado. Toma demasiados caracteres para crear y pasar un Functor. Scala permite pasar funciones como argumentos.
No es posible en Java crear un tipo de unión o aplicar una interfaz a una clase existente. Estos son fáciles en Scala.
La tipificación estática generalmente tiene una gran penalización de verboseness. Scala elimina esta desventaja a la vez que proporciona la ventaja del tipado estático, que es la verificación del tipo de tiempo de compilación, y facilita la ayuda del código en los editores.
La capacidad de extender el idioma. Esto ha sido lo que ha mantenido a Lisp funcionando durante décadas, y eso permitió a Ruby on Rails.
Supuestamente es muy fácil hacer que el código de Scala se ejecute concurrently en múltiples procesadores.