2010-04-04 25 views
11

Soy un estudiante. Aprendí java durante el segundo año. Ahora estoy en cuarto año. Me aburrí con java y comencé a aprender Scala. A medida que lo aprendo, me parece muy complejo (aunque me encanta). Mi pregunta puede aplicarse a todo nuevo lenguaje complejo.¿Por qué Scala es muy complejo?

¿Por qué scala es complejo?
¿es porque necesitamos crear softwares complejos?
o soy el único que piensa que es complejo?

+9

Por favor, proporcione ejemplos de lo que le parezca complejo. –

+1

@Thorbjorn vea esta pregunta http://bit.ly/a5Sqkf –

+4

Esa pregunta es sobre Scalaz. Es una biblioteca muy avanzada que "tiende mucho a Haskell" (como dijo Daniel en otro hilo). No deberías mirarlo en la etapa de principiante. – missingfaktor

Respuesta

33

@Anantha Durante los últimos diez años, la mayoría de las universidades han enseñado a sus alumnos Java como primer idioma. He oído hablar de un número sorprendentemente alto de casos en los que incluso sigue siendo el único idioma que los estudiantes aprenden mientras están en la universidad, a menos que escojan otra cosa por sí mismos, es decir.

Únicamente desde un punto de vista del lenguaje, tres rasgos más característicos de Java son

  1. es imperativo
  2. que está orientado a objetos
  3. que ha recolectado

Características 1 & 2 hacen que sea muy similar a una amplia gama de idiomas de la familia Algol/C y C++. Todos estos lenguajes comparten similitudes en su paradigma o incluso utilizan exactamente lo mismo.

C# por ejemplo, a pesar de sus diferencias sintácticas, Windows como sistema operativo objetivo principal y .NET framework como "biblioteca de clases", es muy fácil de obtener para un programador Java. Esto se debe a que ambos idiomas comparten el mismo paradigma de programación.

Scala, por otro lado, a pesar de que se ejecuta en la JVM, proporcionando una fácil interoperabilidad con las API de Java, es lo que comúnmente se conoce como un lenguaje multi-paradigma. El lenguaje proporciona una integración sintáctica profunda de las características del lenguaje de programación funcional, pero estructura el código de una manera orientada a objetos.

El concepto de programación funcional, especialmente una vez que ingresa en el código más allá de tutoriales triviales, resulta ser difícil para desarrolladores que solo tienen experiencia con lenguajes OO imperativos. Mi experiencia personal al ayudar a otros desarrolladores a ponerse al día con Scala y otros es que es de gran ayuda enseñarles Scheme primero;) Es un dialecto de Lisp agradable, pequeño y limpio. Ayuda a transmitir conceptos funcionales avanzados. Si decides darle una oportunidad, te recomiendo que eches un vistazo a "The Little Schemer" y "The Seasoned Schemer". Una vez que hayas terminado con ambos libros, apuesto a que será más fácil buscar en la sintaxis de Scala y ver sus conceptos con mayor claridad.

En pocas palabras: En mi humilde opinión no es Scala que es dura de aprender, el paradigma de programación funcional es la razón por la mayoría de los desarrolladores, que sólo ha estado expuesto de imperiosas idiomas, teniendo un tiempo difícil conseguir hasta velocidad.

+10

Ojalá mi universidad debería enseñar S cheme en lugar de J2EE. –

+1

Tal vez su universidad tenga que equilibrar la enseñanza de un idioma en el que los estudiantes sientan que hay un "punto" en el aprendizaje (es decir, pueden ver que hay un montón de empleos que requieren dicho lenguaje) y por lo tanto se sentirán atraídos por la universidad y enseñar un idioma para que las personas sean * mejores * programadores. Básicamente, es culpa de todos los estudiantes :-) –

+3

No creo que sea malo para una universidad centrarse en el conjunto actual de * idiomas de trabajo * - leer: Java y C# - en absoluto. No importa lo mucho que cualquiera de nosotros los fanáticos del prog lang se abanique sobre cualquier otro idioma, el éxito de los lenguajes imperativo, OO y GC muestra, que a pesar de sus deficiencias, mucho está bien con ellos. Afortunadamente, no es como si Java y, probablemente, aún más, C# se estuviera quieto. Además: ambos idiomas tienen un ecosistema vibrante, que es * muy * importante. Las universidades deberían enseñar muchos más idiomas y ofrecer un compilador obligatorio y/o una conferencia de diseño del lenguaje en sus planes de estudios. – codesurgeon

2

Es tan complejo como Java (o cualquier lenguaje de programación moderno). Solo puedo suponer que no ha visto programas grandes en Java.

No es solo orientado a objetos sino también funcional, que es un paradigma de programación diferente.

No confundas tu dificultad con la Programación Funcional con el lenguaje siendo difícil. La Programación Funcional puede ser muy confusa para los que se usan para la programación Orientada a Objetos (o Procedural).

+0

+1 para contrarrestar el alboroto que puede causar diciendo que Scala no es OO! :) –

+8

-1: no es absolutamente cierto que todos los lenguajes modernos sean igualmente complejos, ni que la complejidad de los programas grandes tenga algo que ver con la complejidad del lenguaje en el que están escritos. –

+3

± 1: Un programa para realizar un una tarea particular tiene una complejidad característica particular que es inherente a la tarea en cuestión. La idoneidad de un idioma para esa tarea está determinada por la cantidad de complejidad * adicional que se agrega sobre ese nivel inherente. La manera en que se expresa esa complejidad es menos importante, como lo es si es parte del lenguaje o parte del programa explícitamente escrito. Son las máquinas de Turing, todo el camino hacia abajo. –

13

Hay dos cuestiones aquí:

  1. ¿Es más difícil de aprender Scala de Java?
  2. ¿El código escrito en Scala tiende a ser más complicado que el código escrito en Java?

La primera pregunta es más fácil de responder: el lenguaje Scala es más rico que Java. En particular, su sistema de tipo es más expresivo que Java, lo que significa que uno puede expresar más errores lógicos como errores de tiempo de compilación. Sin embargo, para explotar estas capacidades, es necesario conocer los diferentes constructos del lenguaje (tipos dependientes, clases de casos, anotaciones de varianza, vistas, por nombrar algunos). Dominar estos requiere tiempo y es por eso que Scala es más complicado de aprender que Java.

La segunda pregunta es más complicada. Los defensores de Scala afirman que estos nuevos constructos hacen que sea más fácil escribir programas correctos y que el código resultante sea más simple. Otros dicen que el poder adicional de Scala no supera la complejidad de comprender las sematnicas de sus construcciones (Por ejemplo, eche un vistazo a este talk. Busque "Scala"). Esta es una manifestación de una disputa más amplia: la de los lenguajes estáticos frente a los dinámicos.

+1

"las diferentes construcciones del lenguaje (tipos dependientes, [...]" ¿Desde cuándo Scala tiene tipos dependientes? – sepp2k

+1

http://programming-scala.labs.oreilly.com/ch12.html#PathDependentTypes –

+7

Creo que usar "tipos dependientes" para significar "tipos dependientes de la ruta" sería confuso para la mayoría de la gente (al menos para mí). – sepp2k

8

Scala es complejo porque le da flexibilidad. Una y otra vez, al no tener la flexibilidad suficiente, es difícil realizar algunas tareas, sin embargo, la demasiada flexibilidad es como demasiado dinero, lo faculta para cometer los grandes errores.

Scala es orientado a objetos y funcional. Ambos tipos de lenguaje alguna vez se consideraron bastante complejos aparte (aunque orientado a objetos ahora es más convencional) pero al juntarlos se abren todo tipo de puertas nuevas. ¡Algunas de esas puertas parecen atajos para "misión cumplida"! Algunas de esas puertas tienen leones detrás de ellas. La programación funcional le brinda toda la cuerda para hacer el trabajo, ahorcarse y amarrar a su vecindario durante años. Depende de usted no dañarse a sí mismo en un lenguaje de programación funcional.

La clave del éxito de Scala es reconocer que usted debe ser un programador orientado a objetos exitoso, un programador funcional exitoso, y luego aprender a mezclar los dos de manera que lo lleve a su meta. Eso es mucho trabajo. Quizás en el futuro, las personas sabrán cuál es el "mejor" enfoque para aprender Scala, pero por ahora, el único enfoque conocido es ser bueno en dos enfoques diferentes de programación, Y ser bueno al mezclarlos.

+5

Cada paradigma proporciona cuerda "suficiente". Las formas de ahorcarse varían solo. –

7

Qué es complejo sobre Scala es el sistema de tipos. Es muy flexible, pero desafortunadamente expone esta flexibilidad en firmas de tipos complejos.

O puede ser que esté encontrando el cambio de paradigma para usar complejas funciones de orden superior.

De cualquier manera, te recomiendo que te quedes con él. Ofrece un grado de poder sobre Java-the-language que no se puede pasar.

3

Scala proporciona la capacidad de crear bibliotecas que se pueden utilizar de forma muy concisa. Las bibliotecas Java a menudo tienen una interfaz prolija y engorrosa. Esto suena como una ventaja para Scala, pero no necesariamente. En Scala, dos funciones pueden funcionar completamente diferentes y, sin embargo, tienen un uso muy similar: la sintaxis no es una guía para el comportamiento. Mientras que en Java ciertas cosas siempre se vuelven obvias por la sintaxis.

Suponga que tiene una función foo en Java y se llama así:

foo(v > 5); 

Así que estamos pasando parecer que un valor boolean. ¡No tan rapido! Supongamos que Java tiene una característica que permite que la función foo capture la expresión y la evalúe más tarde (quizás en un hilo diferente). Entonces, en lugar de aceptar un valor de boolean, foo acepta una función que no toma parámetros y devuelve boolean. No se puede decir lo que sucede simplemente mirando el sitio de llamadas; debe conocer los detalles de cómo funciona foo para saber cuándo se evaluará la expresión v > 5. Mientras que en Java hoy, la expresión siempre se evaluará antes de que se ejecute foo.

Para los programadores de Java esto probablemente parezca bastante desconcertante. Pero Scala tiene esta característica exacta.

Esta ruptura del vínculo entre la sintaxis y el comportamiento es algo que hace que Scala sea más susceptible de confundir a los incautos. Por otro lado, permite la creación de lenguajes específicos de dominios incrustados, donde el punto es que existe una notación concisa y eficiente adecuada para un dominio de problema específico.

5

Scala es complejo por varias razones:

Trae paradigmas de programación funcional. La biblioteca de Scala Collection es mucho más accesible que Java debido a esto.

Permite crear API modulares y fluidas. Por ejemplo, en Scala, el método #map se implementa en TraversableLike, (una de las clases raíz en la biblioteca de colecciones), sin embargo, su tipo de resultado es el tipo de la colección concreta más apropiada (para BitSet, devolverá un BitSet si la asignación convierte un Int a un Int y un Set de otra manera). Esto es posible gracias al lenguaje, no al engaño del compilador.

Está estáticamente tipado. Es más fácil crear un lenguaje dinámico que tenga las características anteriores, pero el tipado estático le brinda soporte y rendimiento IDE.

En mi humilde opinión todas estas características son muy importantes y vale la pena la complejidad adicional.

Estuve una vez en el punto donde se encuentra. Cuando me encontré con Scala en 2006, lo abandoné después de un tiempo de tratar de aprenderlo, por su complejidad. Tuve que aprenderlo para un proyecto que estoy haciendo y estoy muy feliz de haberlo hecho. Considero que no aprender en 2006 uno de los mayores errores en mi vida profesional.

7

¿Soy el único que no piensa que es complejo? Puedes escribir cosas complejas con eso, claro. Pero la alternativa sería no pudiendo escribir cosas complejas, lo que no es exactamente una mejora. Pero creo que el lenguaje en sí es muy simple.

Lo que sí creo que está pasando es la conmoción de aprender un segundo idioma. Probablemente encuentres a C con su puntero aritmético muy complejo.

+5

Estoy de acuerdo. Scala es simple cuando quieres escribir cosas simples. C es probablemente un perfecto poster para el "opuesto de Scala": es complejo cuando quieres escribir cosas simples, haciéndote rascarte la cabeza preguntándote sobre la diferencia entre un signo "delante" de 'const' y un símbolo después de' const' . –

6

Sugiero que no vea Scala como complejo, solo avanzado. Scala representa un avance amplio y sorprendentemente coherente en casi todos los aspectos de los lenguajes de programación imperativos convencionales, sin embargo, cada uno de estos avances se absorbe y aplica fácilmente.Intentar adoptar demasiadas mejoras de Scala a la vez probablemente genere confusión y una confianza dañada.

Scala merece la adopción generalizada pero parece sufrir sus propios efectos embriagadores. Tratar de contentarse con la aplicación de pequeñas mejoras es muy difícil en un entorno tan rico, pero no se desanime.

1

Es más complejo porque necesita tener todo el poder que tiene. Java es más simple, pero Java tampoco tiene la misma cantidad de capacidades que Scala.

Java:

  • + menos para aprender
  • -closures
  • inferencia de tipo
  • -traits
  • declaraciones ASUNTO
0

Como se ha indicado anteriormente, la razón por la cual Scala es tan complejo es debido a su sistema de tipos. Es una pieza impresionante de ingeniería, pero incluso los programadores expertos de Scala se tropiezan con ella. Recomiendo encarecidamente que cualquiera que esté considerando aprender y usar Scala mire primero a Clojure. Ofrece prácticamente todas las características y beneficios de Scala sin la pesadilla actual de tener que luchar con el sistema de tipos.

+1

No estoy seguro de por qué se votó negativamente. No habiendo programado en esquema, creo lo que he escuchado. Es decir, es un lenguaje pequeño y agradable para aprender y se presta para aprender programación funcional. Probablemente, no puede ir mal esquema de aprendizaje. Sin embargo, estoy de acuerdo con esta respuesta [sobre el aprendizaje de Clojure], porque al ser un lenguaje JVM, pone a Scala, Java y Clojure en la misma mesa que los idiomas "primos". Lo que sabes sobre Java puede y te ayuda en Clojure (y probablemente también en Scala). – octopusgrabbus

+0

Supongo que la votación negativa proviene de la baja proporción de información a publicidad, el anuncio no llamado y la afirmación no probada de que "[Clojure] ofrece prácticamente todas las características y beneficios de Scala [...]". – soc

3

Java es distintivo al fomentar fuertemente un estilo específico de escritura. Si toma ejemplos de código de dos programadores profesionales, Java es tal vez el único idioma en el que probablemente no pueda diferenciarlos. Una razón para esto es que Java es relativamente inflexible, por lo que para muchos problemas solo hay una forma de hacer las cosas.

Scala es mucho más flexible, pero eso resulta en muchas formas de hacer las mismas cosas. Por ejemplo, para poblar un Mapa de otro Mapa puede iterar (Java, estilo imperativo) o puede aplicar un cierre (estilo funcional). Es probable que este último sea más compacto, pero más críptico si está acostumbrado a los idiomas imperativos. Para empeorar las cosas, Scala tiene muchos accesos directos para hacer que el estilo funcional sea aún más compacto, potencialmente más legible para los expertos, pero más críptico para los no expertos.

Para decirlo de otra manera, Scala es un lenguaje para escribir lenguajes específicos de dominio. Le brinda las herramientas para agregar palabras clave para su dominio particular. Puede, por ejemplo, convertir fácilmente a Scala en un excelente lenguaje para contabilidad o física de partículas. Pero luego los contadores y los físicos tendrán problemas para leer los programas de los demás.

Lamentablemente, uno de esos dominios son las colecciones. Puede escribir un mapa, un conjunto y un código de lista de estilo Java. O puede usar un código críptico más que puede ser mucho más claro y conciso, una vez que haya aprendido todos los trucos.

No creo que ningún idioma lo pueda tener en ambos sentidos.

1

mis hijos les puede andar en bicicleta, mi madre no puede

Mi mamá puede conducir un coche, mis hijos no puede

Scala no es compleja - se diferente

+1

Scala no le pide que conduzca un automóvil en lugar de una bicicleta, le pide que conduzca ambos. –

+0

Scala tiene muchísimas más características y conceptos para comprender. Es mucho más complejo. – Dici

7

Si crees que el lenguaje es complejo, entonces podrías considerar aprenderlo por etapas.

Esta guía para dividir Scala en diferentes partes es lo que muchas personas hacen instintivamente y por lo general necesariamente, pero esta guía está escrita por Martin (el creador de Scala) por lo que tiene su perspectiva única. http://www.scala-lang.org/node/8610

Observe que la mayoría de las construcciones que asustan a las personas están en los niveles de diseñador de la biblioteca. El desarrollador de la aplicación intermedia puede hacer mucho sin tener demasiados conceptos de CS de la escuela de posgrado.

** 
      Level A1: Beginning application programmer 
       Java-like statements and expressions: standard operators, 
        method calls, conditionals, loops, try/catch 
       class, object, def, val, var, import, package 
       Infix notation for method calls 
       Simple closures 
       Collections with map, filter, etc 
       for-expressions 

      Level A2: Intermediate application programmer 

       Pattern matching 
       Trait composition 
       Recursion, in particular tail recursion 
       XML literals 

      Level A3: Expert application programmer 

       Folds, i.e. methods such as foldLeft, foldRight 
       Streams and other lazy data structures 
       Actors 
       Combinator parsers 

      Level L1: Junior library designer 

       Type parameters 
       Traits 
       Lazy vals 
       Control abstraction, currying 
       By-name parameters 

      Level L2: Senior library designer 

       Variance annotations 
       Existential types (e.g., to interface with Java wildcards) 
       Self type annotations and the cake pattern for dependency injection 
       Structural types (aka static duck typing) 
       Defining map/flatmap/withFilter for new kinds of for-expressions 
       Extractors 

      Level L3: Expert library designer 

       Early initializers 
       Abstract types 
       Implicit definitions 
       Higher-kinded types 
**