Я изучал новые функции в 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?
источник
The evidence suggests
- пожалуйста, поделитесь своими исследованиями.Ответы:
Когда Java была впервые разработана, считалось целесообразным исключить анонимные функции. Я могу думать о двух причинах (но они могут отличаться от официальных):
В последующие годы, как объяснил Роберт Харви, политика Sun всегда заключалась в том, чтобы поддерживать Java обратно совместимым и очень стабильным.
С другой стороны, появились другие конкурирующие языки (наиболее важным из которых является C #, который родился как клон Java, а затем взял свое собственное направление развития).
Конкурирующие языки подвергли Java давлению по двум причинам:
Выразительная сила
Новые функции могут облегчить написание определенных идиом программирования, делая язык более привлекательным для программистов. Обычно набор функций, предоставляемых языком, представляет собой компромисс между выразительной силой, сложностью языка и согласованностью дизайна: добавление большего количества функций делает язык более выразительным, но также более сложным и трудным в освоении.
В любом случае, за последние несколько лет конкуренты Java добавили много новых функций, которых у Java не было, и это можно считать преимуществом.
обман
Да, к сожалению, это является фактором выбора технологии, по крайней мере из того, что я вижу в своем ежедневном опыте программиста: инструмент должен иметь определенную функцию, даже если большинство членов команды не знают, как его использовать и тем, кто сможет его использовать, большую часть времени это не нужно.
Hype может быть даже более важен для нетехнических людей, таких как менеджеры, которые могут быть теми, кто выбирает платформу для определенного проекта. Менеджеры иногда запоминают только некоторые ключевые слова, такие как лямбда, параллелизм, многоядерность, функциональное программирование, облачные вычисления ... Если у нашей технологии выбора есть зеленая отметка на каждом элементе списка, то мы в курсе.
Таким образом, IMO в течение некоторого времени Java был пойман между
В итоге Oracle решила обновить Java, чтобы сделать ее более конкурентоспособной. На мой взгляд, новые функции адресованы в особенности программистам на Java, у которых может возникнуть желание переключиться на C # и которые считают, что другие языки, такие как Scala и Clojure, слишком отличаются от Java. С другой стороны, разработчики, которые имеют некоторый опыт функционального программирования и все еще хотят использовать JVM, вероятно, уже переключились на Scala, Clojure или другой язык.
Таким образом, новые функции Java 8 сделают Java более мощной в качестве языка, и заявленное внимание уделяется параллельному и параллельному программированию, но, похоже, обновление затрагивает и маркетинговые аспекты (Марк Рейнхольд, главный архитектор Java в Oracle, сказал: «Некоторые скажем, добавление лямбда-выражений просто для того, чтобы не отставать от крутых ребят, и в этом есть доля правды, но настоящая причина - многоядерные процессоры; лучший способ справиться с ними - с помощью лямбды »(см. эту статью ).
Итак, да, многие (все) функции Java 8 уже были хорошо известны, но почему и когда функция добавляется в язык, зависит от многих факторов: целевой аудитории, существующего сообщества, существующей кодовой базы, конкурентов, маркетинга и т. Д.
РЕДАКТИРОВАТЬ
Короткая заметка, касающаяся «... я читал о потоках в SIC (1996).»: Вы имеете в виду, что вам нужны лямбды Java 8 для реализации потоков? На самом деле вы можете реализовать их, используя анонимные внутренние классы.
источник
Ява изменила фокус со временем. Сначала он был задуман как простой мощный язык, как реакция на «мощный комплексный» C ++. Некоторые функции, которые были в C ++, были намеренно исключены, такие как перегрузка операторов, шаблоны, перечисления, которые считались слишком сложными, или пережитки эры C, и ООП, находящийся на пике своей популярности, все превратилось в объект в едином парадигма мировоззрения. В то время лямбды считались просто «ненужными» с момента появления анонимных / внутренних классов в Java 1.1. Тот факт, что синтаксис был гораздо более многословным, почти считался особенностью .
Java стала общедоступной, и не было никаких стимулов для изменений, пока Microsoft не представила C #, который извлек уроки из уроков ошибок проектирования Java и запустил ряд новых языковых функций. Они не были ограничены обратной совместимостью. Я думаю, что концептуалисты Java осознали опасность конкуренции C # и выпустили Java 5 с обобщениями, перечислениями и т. Д.
С тех пор обсуждается вопрос о включении лямбд в Java, и это только усугубляется современной тенденцией функционального программирования. Но такие вещи медленно, чтобы сделать правильно, и это должно быть правильно с первого раза. По моему мнению, Java испортила дженерики со стиранием типов, потому что обратная совместимость считалась причиной для ее реализации не более чем синтаксическим сахаром. Оказывается, замыкания были придуманы более тщательно, и это будет больше, чем просто синтаксический сахар.
В заключение, что является основной темой Java 8? Я не думаю, что у языковой версии есть тема. Как и C ++ 11, смысл Java 8 заключается в том, чтобы не отставать от конкурентов, вводя в язык то, что все больше и больше программистов воспринимают как должное сейчас. Лисп может иметь лямбду с 1958 года, его популярность падала на десятилетия, и только недавно функциональное программирование было серьезно рассмотрено для "основного" программирования (из-за отсутствия лучшего слова).
источник
Потому что Java должна пройти процесс утверждения, в котором участвуют несколько заинтересованных сторон, участвующих в процессе, похожем на «проектирование комитетом», и этот процесс требует времени, и все.
Сравните это с другими языками, и вы найдете либо доброжелательного диктатора, либо небольшой комитет языковых дизайнеров, которые тесно сотрудничают и не связаны с корпоративными интересами.
Объедините это с устоявшейся кодовой базой, состоящей из миллионов строк кода Java, которая должна поддерживать обратную совместимость, и у вас есть все компоненты для изменений в ледяном темпе.
источник
Я бы сказал, что наиболее важной целью языка программирования является использование; в настоящее время C и Java не имеют лямбда-выражений, и они являются наиболее используемыми языками (согласно TIOBE, например).
И чтобы ответить на вопрос, я считаю, что Java адресована предприятию; в этой области вещи должны быть очень стабильными и надежными; например, Java 7 появилась почти 2 года назад, но я не знаю напрямую ни одного проекта в Java 7. Также еще одна важная вещь - это обратная совместимость, которая очень важна для предприятия.
источник