Что случилось с Java (в частности, языком)?
Еще в 2000 году (когда .NET был выпущен на нас IIRC) это был инновационный передний край (последний раз я использовал его в 2003 году).
Из того, что я прочитал, Sun только развил язык чрезвычайно медленно. Я даже прочитал, что там, где язык развился, например, добавление Generics, разработчики жаловались на плохую реализацию.
Являются ли эти точные восприятия, и если да, то какие-то мысли о том, почему, особенно с кажущейся очевидной конкуренцией со стороны С#?
Ответы
Ответ 1
В большинстве языков есть одна сильная рука, вовлеченная в их происхождение и эволюцию. Подумайте: Larry Wall/Perl, Guido/Python, Matz/Ruby, Odersky/ Scala, Hickey/Clojure и т.д. Эти ребята - блестящие языковые парни. Я бы отдал свою левую руку наполовину умнее, чем любой из них.
На самом деле у Java было не только одно, но и ряд замечательных речевых парней у руля - начиная с Гослинга, но я также думаю о Гай Стил, Билле Джой, Гиладе Браке, Нила Гафтера и т.д. - все удивительно ребята. На самом деле это было хорошо (я думаю). Это сделало язык лучше, но предотвратило стагнацию.
Но за последние пару лет был настоящий вакуум языкового лидерства. На данный момент никто не обращает внимания на магазин. Никто не принимает жестких решений о том, что подходит для Java-формы, и имеет смысл добавить (или, что более важно, чтобы не добавлять). Я не знаю, что это значит. Я надеюсь, что огромная популярность и доступность Java и сильная база JVM означают, что этот вакуум слишком привлекателен, чтобы его не заполняли и не дали направление в какой-то момент. Но я только осторожно надеюсь, потому что не знаю, кто это будет.
Джон Роуз - этот чувак на стороне JVM. Хотя, если я могу только получить инновации в одном или другом, я бы взял JVM прямо сейчас.:)
Ответ 2
С точки зрения предприятия, развитие языка - это не очень хорошо, на самом деле это очень плохо.
Вот почему вы слышите старые языки, такие как cobol, fortran и даже C, написанные с номерами в году после них - многие предприятия придерживаются этого года.
Кроме того, более крупные команды означают больше шансов, что кто-то из вашей команды будет делать то, что другие не понимают, поэтому существует важная, но недооцененная ценность, чтобы держать язык простым и чистым. Это означает, что вы не добавляете слишком много альтернативных способов сделать что-то.
Я работал с Ruby и имел мяч с языком, но, глядя на него с точки зрения предприятия, это был ужасающий язык. Я не мог подсчитать, как плохой программист может испортить большую команду, заставляя их тратить дни, распутывая беспорядок, созданный за считанные минуты.
Есть компании, которые отказываются идти в java 5.0 из-за сложности дженериков. (Мы все еще работаем над 1.3x, но по другой причине).
И, честно говоря, большинство "Усовершенствований" покупают вас очень мало. Некоторое синтаксическое изменение, возможность удаления нескольких уровней фигурных скобок.
Я не могу придумать ни одного случая, когда Java заставила меня повторять бизнес-логику (о чем я беспокоюсь, когда пытаюсь сделать мой код "СУХОЙ" ) - это достаточно чистый язык, чтобы быть полностью DRY, если вы хороший программист.
Например, все, что вы можете сделать с закрытием, которое вы можете сделать с подклассом, не повторяя бизнес-логики, - то, что вы в конечном итоге выглядите хуже, из-за слоев привязок/дополнительных определений классов, но часто более многократно используется (вы можете расширьте класс, который вы используете для реализации обратного вызова, но вы не можете расширить метод закрытия, вы должны его переписать.)
Я так не думал о коде в течение первых нескольких десятилетий моей карьеры (я ЛЮБЛЮ языковые трюки, тем лучше, тем лучше), но теперь я был на этом долгое время. Это может быть мой старый возраста, или это может быть опыт, но теперь я вижу огромные преимущества для простого, явного, стабильного кода (предлагаемого языком, который не позволит вам играть в трюки) и не может действительно найти одно преимущество для многих альтернативных методов, даже если они сохраняют строку или два ввода.
Если вы ищете обновление Java, посмотрите Scala. Это довольно потрясающее, все еще работает на JVM, взаимодействует с Java и т.д.
Ответ 3
Java, безусловно, развивается очень медленно - особенно если сравнить его с С# и VB. Я лично считаю, что они приняли неправильное решение с помощью дженериков с точки зрения обеспечения обратной совместимости за счет безопасности и эффективности выполнения. Подход .NET работает намного лучше практически всеми способами, IMO.
В Java 7 есть длинный список потенциальных возможностей - как на языке, так и на платформе - но это было очень долгое время в процессе создания и все еще есть существенные вопросительные знаки во многих функциях.
Я бы не хотел поместить "вину" за то, почему это произошло.
Ответ 4
Эволюция языка Java была медленной, но преднамеренно.
Наглядным примером является Generics. Требование совместимости с предыдущими версиями Java. Учитывая цели проекта, реализация генериков выполняет очень полезную функцию точно так же, как она была разработана. Тем не менее, это не оправдывает ожиданий многих разработчиков, ожидающих поведения генерируемых дженериков.
Инновации в JVM, с другой стороны, были чрезвычайно быстрыми, часто приводящими путь для других виртуальных машин и способствуя конкуренции на арене производительности.
По-моему, язык Java должен быть как можно более стабильным. Мне нравится идея закрытия, но я не верю, что Java - это язык для них. (Если что-то должно войти, я бы предпочел консервативный FCM.) Я работаю с командой разработчиков, которые нуждаются в обучении, создании и обслуживании сложного производственного приложения. Язык Java дает нам хорошее сочетание власти и структуры, как есть.
Другие языки, такие как Scala и Groovy, и порты для JVM, такие как Ruby и Python, продолжат приносить жизнь платформе Java, даже после того, как сам язык Java перешел на COBOL.
Ответ 5
Java имеет разные проблемы, а затем .Net на данный момент, что приводит к различным вариантам.
.Net, будучи относительно новым и имеет шанс избежать некоторых ошибок Java, имеет шанс сделать что-то по-другому. Это дает два основных преимущества:
- MS смогла более четко различать платформы времени выполнения. С# 3.0 явно не будет работать в среде 1.1, а С# 1.1 не будет работать в среде 3.0. Конечно, есть какая-то нечеткость, но в целом у вас есть лучшая идея, где вы стоите. С другой стороны, JVM клиента автоматически обновляется по умолчанию в окнах. Так что это может быть намного сложнее, если работает старая система.
- Структура .Net, будучи моложе, накопила гораздо меньшую глубину и внутреннюю сложность. Эти вещи убьют скорость, с которой вы можете добавить новые функции. Мы также начинаем видеть некоторые из них в .Net. Например: существует ряд функций BCL, которые требуют, чтобы вы передавали или возвращали массив, который должен использовать IEnumerable. История этих функций делает практически невозможным их изменение.
Эти две вещи объединяются, чтобы сделать возможным (на данный момент) для языков .Net продвигаться быстрее. Однако, как я уже сказал, мы начинаем видеть, что эти эффекты догоняют .Net, а также.
Ответ 6
Я думаю, что Солнце сейчас консервативно и обеспечивает принятие правильных решений после создания нескольких бедных.
Кроме того, перед выпуском Java 1.5 появилось много политиканства и возиться. Многие компании использовали сторонние хаки, такие как Generic Java, потому что эти функции основного языка были недоступны, но были очень желанными.
Я думаю, что они ускорились с 1,5, с 1.7 на горизонте, и похоже, что каждая из них принесла очень полезные новые функции. Открытый источник языка также хорош.
И все, что говорят некоторые люди, сохранение обратной совместимости было очень важной особенностью на языке Java.
Я бы сказал, что .NET пнул Sun asses в механизм, и что хорошо, что они оба существуют.
Ответ 7
В течение долгого времени Java (к лучшему или худшему) предпочитает вводить новую функциональность через фреймворки, а не в язык.
Можно утверждать, что, например, кто-то, пишущий приложение Spring/Hibernate/Struts, на самом деле пишет на специализированном диалекте Java, поскольку их код будет в значительной степени неработоспособным без всякой магии отражения/инъекции/инструментария, выполняемой рамки.
Лично я предпочел бы, чтобы язык развивался немного больше, и для авторов фреймворка бросить обезьяну с семантикой языка с помощью манипуляции байт-кодом.
В качестве дополнительной заметки я также категорически не согласен с решением Sun использовать стирание стилей в их реализации Generics. Предположительно, они хотели обеспечить обратную совместимость, но для меня это кажется совершенно ложным, поскольку аннотации (добавленные точно в одно и то же время на Java 5) создали собственный набор несовместимостей. Во всяком случае, код, скомпилированный для Java 5, никогда не может быть выполнен на более ранней JVM, поэтому требование обратной совместимости кажется мне очень сомнительным.