Что является основным направлением деятельности Java? Почему для получения новых функций требуется так много времени?

11

Я изучал новые функции в JDK8, такие как лямбда-выражения, методы расширения и новый потоковый API.

Очевидно, что ни одна из этих функций не нова в мире программирования, и это заставляет задуматься, почему до сих пор все это получается в Java.

У нас были лямбда-выражения в Lisp (1958), SML (1973), Haskell (1990), Python (1991), JavaScript (1994), Ruby (1995), Scala (2003), C # (2007) и через 55 лет после Lisp и практически все остальные, на Java (2013).

И я читал о потоках в SIC (1996).

Мне было интересно, почему сейчас? Факты свидетельствуют о том, что конкуренция с другими языками не является мотивацией.

Казалось бы, все новые интересные функции в этом выпуске Java являются лишь побочным продуктом реализации параллелизма. У нас есть лямбды, потому что они упрощают написание параллельных алгоритмов, и у нас есть методы расширения, потому что они нужны нам для поддержки изменений, которые требуются лямбда-выражениями и т. Д., И т. Д.

Итак, мой вопрос: можем ли мы с уверенностью утверждать, что основной темой в следующем выпуске Java на самом деле является параллелизм? Или мы можем обосновать другие причины появления самых старых трюков в книге до сих пор на Java?

edalorzo
источник
4
Все это может превратиться в огненную войну из-за запоздалости Java.
Майкл К
5
The evidence suggests- пожалуйста, поделитесь своими исследованиями.
2
Ни одна из функций ни в Java, ни в JVM, ни в JRE никогда не была новой. И даже комбинация функций не нова, у Eiffel все они были в 1985 году (GC, OO, безопасность типов, даже Generics, которые Java не получила до 2003 года). На самом деле, цель разработчиков Java заключалась в том, чтобы не вводить ничего нового.
Йорг Миттаг
2
@MichaelK - Я согласен, что это может превратиться в пламенную войну. Это также может превратиться в верный ответ относительно сложной истории Sun; Приобретение Oracle Sun и Java; и как нынешние сопровождающие Java пытаются управлять языком. Я надеюсь, что ответы будут сосредоточены на конструктивных аспектах этого вопроса.
@MichaelT: Я надеюсь, что она не превратится в пламенную войну, и могут появиться некоторые интересные идеи. Например, часто мы предполагаем, что язык, который не постоянно развивается, отстает от времени. ИМО это не так, потому что предполагается, что эволюция языка линейна (что все новые функции, которые становятся популярными, хороши и должны быть приняты всеми современными языками). Но разработчики языка могут решить, что новая функция не соответствует остальной части языка. Также учтите, что существуют стандартизированные стабильные языки, которые точно не отстают от времени (например, Common Lisp).
Джорджио

Ответы:

12

Когда Java была впервые разработана, считалось целесообразным исключить анонимные функции. Я могу думать о двух причинах (но они могут отличаться от официальных):

  1. Java была разработана как объектно-ориентированный язык без функций, поэтому было не очень естественно иметь анонимные функции в языке без функций. Или, по крайней мере, это сильно повлияло бы на дизайн языка.
  2. Анонимные функции не были популярны в сообществах программистов, которых Java должна была привлекать (C, C ++, Pascal?). Даже сейчас многие программисты на Java, кажется, считают эти функции довольно экзотическими (но это, вероятно, изменится очень быстро с Java 8).

В последующие годы, как объяснил Роберт Харви, политика Sun всегда заключалась в том, чтобы поддерживать Java обратно совместимым и очень стабильным.

С другой стороны, появились другие конкурирующие языки (наиболее важным из которых является C #, который родился как клон Java, а затем взял свое собственное направление развития).

Конкурирующие языки подвергли Java давлению по двум причинам:

Выразительная сила

Новые функции могут облегчить написание определенных идиом программирования, делая язык более привлекательным для программистов. Обычно набор функций, предоставляемых языком, представляет собой компромисс между выразительной силой, сложностью языка и согласованностью дизайна: добавление большего количества функций делает язык более выразительным, но также более сложным и трудным в освоении.

В любом случае, за последние несколько лет конкуренты Java добавили много новых функций, которых у Java не было, и это можно считать преимуществом.

обман

Да, к сожалению, это является фактором выбора технологии, по крайней мере из того, что я вижу в своем ежедневном опыте программиста: инструмент должен иметь определенную функцию, даже если большинство членов команды не знают, как его использовать и тем, кто сможет его использовать, большую часть времени это не нужно.

Hype может быть даже более важен для нетехнических людей, таких как менеджеры, которые могут быть теми, кто выбирает платформу для определенного проекта. Менеджеры иногда запоминают только некоторые ключевые слова, такие как лямбда, параллелизм, многоядерность, функциональное программирование, облачные вычисления ... Если у нашей технологии выбора есть зеленая отметка на каждом элементе списка, то мы в курсе.

Таким образом, IMO в течение некоторого времени Java был пойман между

  • оригинальная политика языковой стабильности и простоты дизайна, огромная база кода и сообщество разработчиков с одной стороны, и
  • давление конкурирующих языков, которое могло бы привлечь программистов на Java, сначала C #, а затем Scala, Clojure, F # (я называю те, которые мне известны, могут быть и другие).

В итоге Oracle решила обновить Java, чтобы сделать ее более конкурентоспособной. На мой взгляд, новые функции адресованы в особенности программистам на Java, у которых может возникнуть желание переключиться на C # и которые считают, что другие языки, такие как Scala и Clojure, слишком отличаются от Java. С другой стороны, разработчики, которые имеют некоторый опыт функционального программирования и все еще хотят использовать JVM, вероятно, уже переключились на Scala, Clojure или другой язык.

Таким образом, новые функции Java 8 сделают Java более мощной в качестве языка, и заявленное внимание уделяется параллельному и параллельному программированию, но, похоже, обновление затрагивает и маркетинговые аспекты (Марк Рейнхольд, главный архитектор Java в Oracle, сказал: «Некоторые скажем, добавление лямбда-выражений просто для того, чтобы не отставать от крутых ребят, и в этом есть доля правды, но настоящая причина - многоядерные процессоры; лучший способ справиться с ними - с помощью лямбды »(см. эту статью ).

Итак, да, многие (все) функции Java 8 уже были хорошо известны, но почему и когда функция добавляется в язык, зависит от многих факторов: целевой аудитории, существующего сообщества, существующей кодовой базы, конкурентов, маркетинга и т. Д.

РЕДАКТИРОВАТЬ

Короткая заметка, касающаяся «... я читал о потоках в SIC (1996).»: Вы имеете в виду, что вам нужны лямбды Java 8 для реализации потоков? На самом деле вы можете реализовать их, используя анонимные внутренние классы.

Джорджио
источник
+1 И я бы хотел дать вам больше очков, потому что это лучший ответ на этот вопрос.
edalorzo
Основываясь на вашем ответе, я изучил больше о том, что, по словам Марка Рейнхольда, я нашел интересную статью. Я опубликую его здесь с вашим ответом для использования в будущем: Closures for Java от Mark Reinhold .
edalorzo
И эта статья на самом деле ссылается на эту другую Closures for Java .
edalorzo
1
По отправленной вами ссылке я нашел этот ibm.com/developerworks/java/library/j-jtp03048/index.html#4.0 , в котором говорится, что Java может использовать анонимные внутренние классы, но они слишком многословны. Тем не менее, закрытие Java 8 не просто синтаксический сахар для анонимных внутренних классов. Так что теперь Java будет иметь ДВА (семантически) различных вида замыканий: анонимные внутренние классы и лямбда-выражения.
Джорджио
11

Ява изменила фокус со временем. Сначала он был задуман как простой мощный язык, как реакция на «мощный комплексный» C ++. Некоторые функции, которые были в C ++, были намеренно исключены, такие как перегрузка операторов, шаблоны, перечисления, которые считались слишком сложными, или пережитки эры C, и ООП, находящийся на пике своей популярности, все превратилось в объект в едином парадигма мировоззрения. В то время лямбды считались просто «ненужными» с момента появления анонимных / внутренних классов в Java 1.1. Тот факт, что синтаксис был гораздо более многословным, почти считался особенностью .

Java стала общедоступной, и не было никаких стимулов для изменений, пока Microsoft не представила C #, который извлек уроки из уроков ошибок проектирования Java и запустил ряд новых языковых функций. Они не были ограничены обратной совместимостью. Я думаю, что концептуалисты Java осознали опасность конкуренции C # и выпустили Java 5 с обобщениями, перечислениями и т. Д.

С тех пор обсуждается вопрос о включении лямбд в Java, и это только усугубляется современной тенденцией функционального программирования. Но такие вещи медленно, чтобы сделать правильно, и это должно быть правильно с первого раза. По моему мнению, Java испортила дженерики со стиранием типов, потому что обратная совместимость считалась причиной для ее реализации не более чем синтаксическим сахаром. Оказывается, замыкания были придуманы более тщательно, и это будет больше, чем просто синтаксический сахар.

В заключение, что является основной темой Java 8? Я не думаю, что у языковой версии есть тема. Как и C ++ 11, смысл Java 8 заключается в том, чтобы не отставать от конкурентов, вводя в язык то, что все больше и больше программистов воспринимают как должное сейчас. Лисп может иметь лямбду с 1958 года, его популярность падала на десятилетия, и только недавно функциональное программирование было серьезно рассмотрено для "основного" программирования (из-за отсутствия лучшего слова).

Сирил Ка
источник
«У Lisp может быть лямбда с 1958 года, его популярность снижалась на протяжении десятилетий, и только недавно функциональное программирование стало серьезно рассматриваться как« основное »программирование: популярность языка не кажется хорошим индикатором его эффективности. Функциональное программирование защищалось в течение многих лет, но большинство людей в отрасли считали, что исследователи любят играть с такими диссертациями. Внезапно индустрия приходит в себя и дает ей шанс, возможно, потому, что теперь, когда ООП является мейнстримом, они ищут следующую большую вещь.
Джорджио
1
Причина, по которой замыкания изначально не были включены в Java: « Понимание дебатов замыканий» . Там Джеймс Госслинг сказал: «Изначально замыкания были исключены из Java из-за нехватки времени, чем что-либо еще. В первые дни Java отсутствие замыканий было довольно болезненным, и так родились внутренние классы: неудобный компромисс, который пытался избежать ряд трудных вопросов. Но, как это обычно бывает во многих вопросах проектирования, упрощения на самом деле не решали никаких проблем, они просто перемещали их ».
edalorzo
«Включение лямбда-выражений в Java обсуждается с того времени, и оно только усугубляется современной тенденцией функционального программирования.»: Мне интересно, что в некоторых сообществах (C ++, Java, ...) «использование лямбда-выражений» часто означает « занимаюсь функциональным программированием ".
Джорджио
8

Очевидно, что ни одна из этих функций не нова в мире программирования, и это заставляет задуматься, почему до сих пор все это получается в Java.

Потому что Java должна пройти процесс утверждения, в котором участвуют несколько заинтересованных сторон, участвующих в процессе, похожем на «проектирование комитетом», и этот процесс требует времени, и все.

Сравните это с другими языками, и вы найдете либо доброжелательного диктатора, либо небольшой комитет языковых дизайнеров, которые тесно сотрудничают и не связаны с корпоративными интересами.

Объедините это с устоявшейся кодовой базой, состоящей из миллионов строк кода Java, которая должна поддерживать обратную совместимость, и у вас есть все компоненты для изменений в ледяном темпе.

Роберт Харви
источник
1
OTOH, у вас также есть ингредиенты для действительно сильных и широко принятых стандартов. Сравните, например, JPA с ситуацией для PHP, где у каждого веб-фреймворка есть своя недооцененная ORM.
Майкл Боргвардт
Я могу ошибаться, но я понимаю, что Haskell также является языком «проектирование комитетом» и является передовым языком. Так может быть, это не то, что мешает Java?
Андрес Ф.
@AndresF. Да, но я представляю, что в комитете Хаскелла нет крупных монолитных компаний. Смотрите также разговор в комментариях здесь .
Роберт Харви,
1

Я бы сказал, что наиболее важной целью языка программирования является использование; в настоящее время C и Java не имеют лямбда-выражений, и они являются наиболее используемыми языками (согласно TIOBE, например).

И чтобы ответить на вопрос, я считаю, что Java адресована предприятию; в этой области вещи должны быть очень стабильными и надежными; например, Java 7 появилась почти 2 года назад, но я не знаю напрямую ни одного проекта в Java 7. Также еще одна важная вещь - это обратная совместимость, которая очень важна для предприятия.

m3th0dman
источник
Я согласен с вами (+1): я очень ценю Java (как язык и его огромную экосистему), но я бы посчитал более целесообразным заморозить язык в Java 6. Я не собираюсь прикладывать никаких усилий к обучению Java 7 или 8, если я не вынужден (какой-то очень интересный проект, в котором Java 7 или 8 обязательна), я скорее трачу свое время на изучение Scala и Clojure.
Джорджио