2008-11-20 14 views
14

En 2000 (cuando .NET se desató sobre nosotros IIRC) era un lenguaje de vanguardia innovador (la última vez que lo usé fue 2003).¿Qué pasó con Java (específicamente el lenguaje)?

Por lo que he leído, Sun solo ha evolucionado el lenguaje excesivamente lentamente. Incluso he leído que, donde el lenguaje ha evolucionado, como la adición de genéricos, los desarrolladores se han quejado de una mala implementación.

¿Son estas percepciones precisas, y si es así, alguna idea de por qué, particularmente con la competencia aparentemente obvia de C#?

+0

Voy a responder con otra pregunta. ¿Por qué Microsoft, poniendo tanto esfuerzo en las características de "lenguaje elegante" como linq, árboles de expresiones y todo eso, ¿por qué simplemente ignoran la experiencia del mundo de Java? Hace 5 años la gente en Java Hibernate hicieron ... – badbadboy

+0

ahora que salió con LINQ a las entidades que es algo no demasiado muy emocionante para ser honesto .... Son tan muy por detrás en algunas otras cosas ... La comunidad – badbadboy

+4

puede hacer bibliotecas, por ejemplo, NHibernate. Tiene sentido que MS haga un trabajo 'central' como el lenguaje y las mejoras de tiempo de ejecución. C# 3 es * mucho * más agradable de usar que Java 6 - y mucho mejor que C# 1. –

Respuesta

20

La mayoría de los lenguajes tienen una mano fuerte involucrada en su origen y evolución. Piense: Larry Wall/Perl, Guido/Python, Matz/Ruby, Odersky/Scala, Hickey/Clojure, etc. Estos tipos son todos tipos brillantes de lenguaje. Le doy mi brazo izquierdo a ser la mitad de inteligente que cualquiera de ellos.

Java ha tenido la distinción de tener no solo uno, sino una serie de tipos de lenguaje asombrosos a la cabeza, empezando por Gosling, pero también pienso en Guy Steele, Bill Joy, Gilad Bracha, Neal Gafter, etc. chicos increíbles Eso en realidad ha sido algo bueno (creo). Ha mejorado el lenguaje, pero ha impedido el estancamiento.

Pero en los últimos años, ha habido un vacío real de liderazgo lingüístico. Por el momento, a nadie le importa la tienda. Nadie toma las decisiones difíciles sobre qué se ajusta al molde de Java y tiene sentido agregar (o más importante, no agregar). No sé lo que eso significa. Tengo la esperanza de que la enorme popularidad y alcance de Java y la sólida base de la JVM signifiquen que este vacío es demasiado atractivo para no ser llenado y orientado en algún momento.Pero solo estoy cautelosamente esperanzado porque no sé quién será.

John Rose es ese tipo en el lado de JVM. Aunque si solo puedo obtener innovación en uno u otro, tomaría JVM en este momento de todos modos. :)

+0

Alex, Alex, Alex Terrocotta es una tecnología perfecta, única y avanzada. También me gustaría poder tener la versión .net. A veces, estoy pensando en la posibilidad de superar el rendimiento de la terracota integrada con el combo de hibernación en .net, pero no es posible. – sirmak

+0

Me gustaría señalar (3 años después) que Brian Goetz realmente ha surgido como la nueva guía en cómo evolucionará el lenguaje Java y que eso es lo mejor que podría haber pasado. –

11

Java ciertamente ha estado evolucionando muy lentamente, especialmente si lo comparas con C# y VB. Personalmente, creo que tomaron la decisión equivocada con los genéricos en términos de mantener la compatibilidad con versiones anteriores a costa de la seguridad y la eficacia en tiempo de ejecución. El enfoque .NET funciona mucho mejor en casi en todos los sentidos, IMO.

Java 7 tiene long list of potential features, tanto en lenguaje como en plataforma, pero ha tardado muchísimo tiempo en desarrollarse, y aún existen importantes signos de interrogación sobre muchas de las características.

Sin embargo, no me gustaría culpar a nadie por el motivo.

+0

Gracias por el complemento en la lista de funciones.También mantengo un blog de enlace de Java 7 en http://java7.tumblr.com si está interesado en hacer un seguimiento de las cosas de esa manera. Todo en el blog de enlaces termina en esa página de características (eventualmente). –

+0

Más de dos años después y la versión actual de Java todavía es "Versión 6 Actualización 24". – tiago2014

6

La evolución del lenguaje Java ha sido lenta, pero deliberadamente.

El genérico es un buen ejemplo. La compatibilidad con versiones anteriores de Java era un requisito. Teniendo en cuenta los objetivos del proyecto, la implementación de genéricos realiza una función muy útil exactamente como se diseñó. Sin embargo, no cumple con las expectativas de muchos desarrolladores que esperaban el comportamiento de los genéricos reificados.

La innovación en la JVM, por otra parte, ha sido extremadamente rápida, a menudo liderando el camino para otras máquinas virtuales, y promoviendo la competencia en el ámbito del rendimiento.

En mi opinión, el lenguaje Java debe ser lo más estable posible. Me gusta la idea de cierres, pero no creo que Java sea el lenguaje para ellos. (Si algo debe entrar, preferiría la FCM conservadora). Trabajo con un equipo de desarrolladores que necesitan capacitación para crear y mantener una aplicación de producción compleja. El lenguaje Java nos da una buena combinación de poder y estructura tal como es.

Otros lenguajes, como Scala y Groovy, y puertos para JVM como Ruby y Python, seguirán dando vida a la plataforma Java, incluso después de que el lenguaje Java haya seguido el camino de COBOL.

1

Creo que Sun ahora está siendo conservador y se asegura de que tomen las decisiones correctas después de hacer unos pocos malos.

Además, hubo mucho politiqueo y caos antes de que saliera Java 1.5. Muchas empresas estaban usando hacks de terceros como Generic Java, porque estas características del lenguaje central no estaban disponibles, pero eran muy deseadas.

Creo que se han acelerado nuevamente desde 1.5, con 1.7 en el horizonte, y parece que cada uno de ellos ha entregado nuevas características muy útiles. La fuente abierta del lenguaje también es buena.

Y lo que algunas personas dicen, la retención de compatibilidad hacia atrás ha sido una característica muy importante en el lenguaje Java.

Yo diría eso.NET ha pateado el culo de Sun, y es bueno que ambos existan.

+3

Sun ha acelerado desde 1.5? Eso fue lanzado hace más de 4 años. Desde entonces hemos tenido C# 2, C# 3, y no estaría * completamente * sorprendido de ver a C# 4 enviarse antes que Java 7. Al menos tengo una idea bastante clara de lo que va a ser en C# 4: el la lista de funciones para Java 7 todavía parece estar muy arriba en el aire. –

+0

Habiendo dicho eso, estoy totalmente de acuerdo en que es bueno que Java y .NET existan :) –

+2

.NET 4.0 se ha enviado antes que Java 7. :) –

21

Desde un punto de vista empresarial, la evolución de un idioma no es algo bueno, en realidad es bastante malo.

Es por eso que escuchas lenguajes antiguos como cobol, fortran e incluso C escritos con los números del año después de ellos - muchas empresas se quedan con ese año.

Además de eso, los equipos más grandes significan más posibilidades de que alguien en su equipo haga cosas que otros no entienden, por lo que hay un valor importante pero subestimado para mantener un lenguaje simple y limpio. Esto significa no agregar demasiadas formas alternativas de hacer las cosas.

Trabajé con Ruby y tenía algo que ver con el idioma, pero al verlo desde un punto de vista empresarial, era un lenguaje absolutamente aterrador. No podía contar las formas en que un programador malo podría arruinar a un equipo grande, forzándolos a pasar días desenredando un desastre creado en minutos.

Hay empresas que se niegan a ir a Java 5.0 debido a la complejidad de los genéricos. (Todavía estamos trabajando en 1.3x, pero eso es por otra razón).

Y, sinceramente, la mayoría de las "mejoras" le compran muy poco. Algunos cambios de sintaxis, la capacidad de eliminar algunos niveles de llaves.

No puedo pensar en un solo caso en el que Java me haya obligado a repetir la lógica comercial (que es lo que me preocupa cuando trato de hacer que mi código sea "DRY"): es un lenguaje suficientemente limpio para sé completamente SECO si eres un buen programador.

Por ejemplo, todo lo que puede hacer con un cierre que puede hacer con una subclase sin repetir la lógica comercial: lo que termina tiene peor aspecto debido a capas de llaves/definiciones de clase adicionales, pero a menudo es más reutilizable (puede extender la clase que usa para implementar su devolución de llamada, pero no puede ampliar un método de cierre, tiene que volver a escribirlo)

No me sentí de esta manera sobre el código durante las primeras décadas de mi carrera (ME ENCANTEN los trucos del lenguaje, el más funky, mejor), pero ahora llevo mucho tiempo en esto: podría ser mi vejez infiltrándome, o podría ser experiencia, pero ahora veo grandes beneficios en lo simple, explícito, código estable (ofrecido por un lenguaje que no te deja jugar trucos) y realmente no puede encontrar una ventaja única para muchos métodos alternativos ds, incluso si guardan una o dos líneas de tipeo.

Si está buscando una actualización de Java, sin embargo, mire Scala. Es bastante increíble, todavía se ejecuta en la JVM, interactúa con Java, etc.

+5

Los beneficios de la mayoría de las mejoras de lenguaje se pueden resumir en una palabra única: legibilidad. Compare la legibilidad de filtrar, ordenar y proyectar una colección usando LINQ to Objects con el código equivalente en Java ... –

+1

Posiblemente, pero mirando a LINQ parece estar muy por detrás de Active Record - MUCHO menos legible/usable. ¿Eso lo hace mal? No estoy seguro de cómo se compara con las anotaciones Java + Hibernate. –

+0

Además, un buen programador debe poder expresarse de forma legible en cualquier lenguaje decente. En Java me doy cuenta de que se necesita un poco de talento de programación para hacerlo, en Ruby mucho menos. –

3

Java tiene diferentes problemas luego .Net por el momento, dando lugar a diferentes opciones.

.Net, que es relativamente nuevo y con la oportunidad de evitar algunos de los errores de Java tiene la oportunidad de hacer algo diferente. Esto le da dos ventajas principales:

  1. MS fue capaz de distinguir más claramente entre las plataformas en tiempo de ejecución. C# 3.0 claramente no se ejecutará en el marco 1.1, y C# 1.1 no se ejecutará en el marco 3.0. Por supuesto, hay cierta confusión, pero en general tienes una mejor idea de dónde estás parado. Por otro lado, el cliente JVM se actualiza automáticamente de forma predeterminada en Windows. Entonces puede ser mucho más complicado mantener un sistema viejo funcionando.
  2. El framework .Net, siendo más joven, ha acumulado una complejidad interna y mucho menos cruzada. Esas cosas matarán la velocidad con la que puede agregar nuevas características. Ahora estamos empezando a ver algo de esto en .Net también. Por ejemplo: hay una serie de funciones de BCL que requieren que transfiera o devuelva una matriz que debería usar un IEnumerable. La historia de esas funciones hace que sea casi imposible cambiarlas alguna vez.

Esas dos cosas conspiran juntas para hacer posible (por el momento) que los idiomas .Net avancen más rápido. Sin embargo, como ya he dicho, estamos comenzando a ver que estos efectos también se ponen al día con .Net.

+0

El código de C# 1.1 * se ejecutará en el marco 3.0. Si bien la compatibilidad no es perfecta, es bastante buena. Si tiene un programa creado con .NET 1.1, es probable que se ejecute si tiene instalado .NET 3.0. –

+0

de ahí la observación de 'borrosidad' :) –

+0

También vale la pena señalar que puede tener múltiples versiones de .NET instaladas y puede enlazar a versiones específicas. Los sistemas prácticamente antiguos no deberían dejar de funcionar cuando se producen actualizaciones. –

1

Durante mucho tiempo, ha de Java (para bien o para mal) preferido para introducir una nueva funcionalidad a través de marcos, en lugar de en la propia lengua.

Podría argumentar que, por ejemplo, alguien que escribe una aplicación Spring/Hibernate/Struts está escribiendo en un dialecto especializado de Java, ya que su código será inoperable sin toda la magia de reflexión/inyección/instrumentación realizada por el marcos.

Personalmente, preferiría para el lenguaje evolucione un poco más, y para los autores marco para dejar de fumar monerías con la semántica del lenguaje a través de la manipulación de código de bytes.

Como nota al margen, también en desacuerdo con la decisión de Sun para utilizar el tipo de borrado en la aplicación de los genéricos. Supuestamente, querían asegurar la compatibilidad con versiones anteriores, pero para mí eso parece totalmente falso, ya que Annotations (agregado exactamente al mismo tiempo, en Java 5) creó su propio conjunto de incompatibilidades. En cualquier caso, el código compilado para Java 5 no se puede ejecutar en una JVM anterior, por lo que el reclamo de compatibilidad con versiones anteriores me parece muy dudoso.

+0

La borradura de tipo se trata de compatibilidad directa. Se consideraron otras soluciones para el problema, pero se seleccionó el borrado como una forma limpia de permitir que el código compilado para Java 1.4 siga trabajando sin modificaciones en un tiempo de ejecución 1.5. – erickson

+0

Ah, sí. No había pensado en eso. Cuando .NET introdujo tipos genéricos, lo hizo al agregar un espacio de nombres completamente nuevo y diferenciar las clases de colección paramétrica de las antiguas clases de colección de vanilla. Ambas soluciones son bastante feas. – benjismith