Яка основна увага в 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 - це насправді паралелізм? Чи можемо виправдати інші причини появи найдавніших хитрощів у книзі дотепер на Яві?


4
Все це може перетворитись на вогненну війну щодо відставання Java від часу.
Майкл К

5
The evidence suggests- поділіться, будь ласка, своїм дослідженням.

2
Жодна з функцій ні в Java, ні в JVM, ні в JRE ніколи не була новою. І навіть поєднання функцій не нове, Ейфель мав усі ці в 1985 році (GC, OO, безпека типу, навіть Generics, які Java не отримала до 2003 року). Насправді, ексклюзивною метою дизайнерів Java було не вводити нічого нового.
Йорг W Міттаг

2
@MichaelK - Я погоджуюся, що це може обернутися полум'яною війною. Це також може перетворитись на вагому відповідь щодо непростої історії Сонця; Придбання 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 не було, і це можна вважати перевагою.

Хайп

Так, на жаль, це фактор вибору технології, принаймні з того, що я бачу в своєму щоденному досвіді як програміста: інструмент повинен мати певну особливість, навіть якщо більшість членів команди не знають, як ним користуватися і тим, хто міг би ним скористатися, він не потребує більшості випадків.

Хайп може бути ще важливішим для не технічних людей, таких як менеджери, які можуть бути тими, хто вирішує платформу для певного проекту. Менеджери іноді запам'ятовують лише деякі ключові слова, такі як лямбда, паралелізм, багатоядерність, функціональне програмування, хмарні обчислення, ... Якщо наша технологія вибору має зелену позначку на кожному пункті списку, ми готові до цього.

Тож IMO деякий час Java потрапила між ними

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

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

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

Так, так, багато (всі) функції Java 8 вже були добре відомі, але чому і коли функція додається до мови, залежить від багатьох факторів: цільової аудиторії, існуючої спільноти, існуючої кодової бази, конкурентів, маркетингу тощо.

EDIT

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


+1 І я хотів би, щоб я міг дати вам більше балів, тому що це найкраща відповідь на це запитання.
edalorzo

На основі вашої відповіді я дослідив більше того, що сказав Марк Райнхолд, що я знайшов цікаву статтю. Я опублікую його тут з вашою відповіддю для подальшої довідки: Закриття для Java від Марка Рейнхолда .
edalorzo

І ця стаття фактично посилається на цю ще одну Закриття для Java .
edalorzo

1
За посиланням, яке ви надіслали, я знайшов це ibm.com/developerworks/java/library/j-jtp03048/index.html#4.0 , кажучи, що Java може використовувати анонімні внутрішні класи, але вони занадто багатослівні. Тим не менш, закриття Java 8 - це не просто синтаксичний цукор для анонімних внутрішніх класів. Отже, Java матиме ДВА (семантично) різного роду закриття: анонімні внутрішні класи та лямбда-вирази.
Джорджіо

11

Java з часом змінила фокус. Спочатку він був розроблений як проста потужна мова, як реакція на "потужний комплекс" C ++. Деякі функції, які були в C ++, були навмисно опущені, наприклад, перевантаження оператора, шаблони, перерахунки, які вважалися занадто складними або пережитками епохи С, і OOP був на піку своєї популярності, і все було зроблено Об'єктом у єдиному режимі, світогляд парадигми. Лямбди в цей час вважалися просто "не потрібними" з моменту введення анонімних / внутрішніх класів у Java 1.1. Те, що синтаксис був набагато більш багатослівним, майже вважалося особливістю .

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

Включення лямбдаз у Java обговорюється з того часу, і це лише посилилось поточною тенденцією функціонального програмування. Але такі речі є повільними, щоб зробити це правильно, і це має бути правильним з першого разу. На мій погляд, дженерики, які підтримують Java, стираються з типом стирання, тому що сумісність у зворотному періоді вважалася причиною її реалізації не більше ніж синтаксичний цукор. Закриття було продумано більш ретельно, воно з'являється, і це буде більше, ніж просто синтаксичний цукор.

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


"Лісп, можливо, лямбда з 1958 року, його популярність плаче вже десятиліттями, і лише останнім часом функціональне програмування вважається серйозним для" основного "програмування: Популярність мови не здається хорошим показником її ефективності. Функціональне програмування обстоюється вже багато років, але більшість людей у ​​цій галузі вважають таким видом, з яким дослідники люблять грати, щоб написати свою кандидатську дисертацію. Зараз раптом індустрія прокидається і дає їй шанс, можливо тому, що зараз, коли OOP є мейнстрімом, вони шукають наступну велику річ.
Джорджіо

1
Причина, чому закриття спочатку не було включено в Java відповідно до: Розуміння дискусії про закриття . Там Джеймс Госслінг сказав: "Закриття були залишені на Яві спочатку більше через тиск у часі, ніж будь-що інше. У перші дні Яви відсутність закриття була досить болючою, і тому народилися внутрішні класи: незручний компроміс, який намагалися уникнути цілий ряд важких питань. Але як це властиво для багатьох питань дизайну, спрощення насправді не вирішувало жодних проблем, вони просто їх пересували ".
edalorzo

"Включення лямбдав в Java обговорюється з того часу, і це лише посилилося внаслідок сучасної тенденції функціонального програмування". Мені цікаво, що в деяких спільнотах (C ++, Java, ...) "використання лямбда" часто означає " робити функціональне програмування ".
Джорджіо

8

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

Оскільки Java повинна пройти процес затвердження, який включає декілька зацікавлених сторін із високою видимістю у процесі, подібному до "проектування комітетом", і цей процес потребує часу, ось і все.

На противагу тому, що з іншими мовами ви знайдете або доброзичливого диктатора, або невеликий комітет дизайнерів мов, які тісно співпрацюють і не прив'язані до корпоративних інтересів.

Поєднайте це із встановленою базою коду з мільйонів рядків коду Java, яка повинна залишатися сумісною назад, і у вас є всі інгредієнти для зміни льодовиковим темпом.


1
ОТО, у вас також є інгредієнти для дійсно міцних і широко прийнятих стандартів. На противагу, наприклад, JPA ситуації з PHP, де кожен веб-фреймворк має власну напіввипробувану ORM.
Майкл Боргвардт

Я можу помилятися, але я розумію, що Haskell також є мовою "дизайн за комітетом", і це передова мова. То, може, це не те, що заважає Java?
Андрес Ф.

@AndresF. Так, але я думаю, що у вас немає великих монолітних компаній, які сидять у комітеті Хаскелла. Дивіться також розмову в коментарях тут .
Роберт Харві

1

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

І щоб відповісти на запитання, я вважаю, що Java адресована підприємству; у цій галузі речі повинні бути дуже стабільними та надійними; наприклад, Java 7 з'являється майже 2 роки, але я не знаю безпосередньо жодного проекту Java 7. Також важливою справою є зворотна сумісність, що дуже важливо для підприємства.


Я погоджуюся з вами (+1): Я дуже ціную Яву (як мову та її величезну екосистему), але мені здалося б більш доцільним заморозити мову на Java 6. Я не збираюся докладати жодних зусиль для вивчення Java 7 або 8, якщо я не змушений (якийсь дуже цікавий проект, в якому Java 7 або 8 є обов'язковим), я швидше витрачаю свій час на вивчення Scala та Clojure.
Джорджіо
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.