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

  • Стоит ли сохранять примитивы?
  • Следует ли удалить все устаревшее?
  • Нужны ли нам 2 графических фреймворка?
  • ...

person Kai Huppmann    schedule 14.01.2009    source источник
comment
Я бы сказал, что это субъективно и аргументировано.   -  person nes1983    schedule 14.01.2009
comment
Не кажется мне аргументом. Бессмысленно, да; спорный, нет.   -  person Tom Hawtin - tackline    schedule 14.01.2009
comment
Этого не должно быть в stackoverflow. Может программисты?   -  person Malcolm    schedule 05.04.2013


Ответы (15)


Как я уже уже упоминал, даже в его Как и когда объявлять API устаревшими, ничего не говорится о политике, касающейся фактического удаления устаревшие API...

Количество приложений, основанных на старой JVM (например, 1.4), по-прежнему важно, отчасти из-за серверов приложений, которым требуется много времени для проверки себя с новыми версиями JVM...

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

person VonC    schedule 14.01.2009

Существует несколько типов обратной совместимости:

  1. Может ли старый исходный код скомпилироваться новым компилятором?

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

  2. Могут ли старые файлы классов работать в новой JVM?

    В моем мире это полное шоу-стоппер. Мы используем так много сторонних библиотек, что принудительное одновременное обновление всех из них было бы слишком дорогостоящим.

    Это также побуждает не удалять устаревшие классы и методы, но в меньшей степени.

  3. Могут ли старые файлы классов вызывать код, скомпилированный новым компилятором?

    Это важная часть # 2 из-за обратных вызовов.

  4. Может ли вновь скомпилированный код вызывать код из старых файлов классов?

    Еще одна важная часть № 2.

  5. Код выглядит существенно похожим на разработчиков?

    Это важно для обучения и для работы с большими кодовыми базами, которые не были полностью преобразованы. Более тонкий аспект заключается в том, какую часть новой функции можно использовать в смешанной кодовой базе. Если вы зайдете слишком далеко, у вас будет что-то вроде Scala вместо Java++.

Универсальные шаблоны были добавлены таким образом, чтобы сохранить все эти типы совместимости. Я думаю, что любое несовместимое изменение в Java должно сохранить по крайней мере 2, 3 и 4, чтобы иметь шанс быть принятым как Java. Инструменты для обработки № 1 также являются минимальным требованием.

person Darron    schedule 14.01.2009

Вы можете сделать это с помощью хобби (Ruby), языков с низкой реализацией (Python), но вы не можете себе представить, сколько приложений написано на Java по всему миру. Просто проверьте свежее мясо или sourceforge. И это только часть. Так что нет, это не очень хорошая идея. На самом деле, это была бы довольно глупая идея.

Не существует двух графических интерфейсов. Swing зависит и использует AWT в качестве основы.

person Eldelshell    schedule 14.01.2009

Мне бы очень понравилось, если бы некоторые устаревшие функции были удалены - например, если бы объект Date был действительно неизменяемым, я был бы очень счастлив. Как бы то ни было, если вы пишете неизменяемый класс, вы не можете предполагать, что даты неизменны, и должны, например, копировать их для защиты, и вы не можете надежно использовать их в качестве ключей в хэш-картах (поскольку в обоих случаях другой код может изменить дату независимо от того, помечены ли методы как устаревшие или нет).

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

Учитывая устаревшие приложения, разумно ли ожидать, что приложение, которое не обновлялось в течение 5 лет, будет отлично работать на последней версии JVM? Если организации все еще используют Java 1.4 и приложения, написанные для нее, действительно ли их волнует, что входит в Java 7? Нарушение обратной совместимости не означает, что все предыдущие версии JVM также будут сломаны. Если приложение предназначено для более ранней версии, его можно без проблем запустить на этой версии JVM.

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

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

person Andrzej Doyle    schedule 14.01.2009
comment
Когда фреймворк, на который опирается ваше приложение, не переносится на новую версию Java из-за несовместимости, оставляя вас в затруднительном положении 1.3.x (или хуже), вы поймете. Я был на нескольких проектах, где это было проблемой. И нет, сменить фреймворк было невозможно. - person Bill K; 08.12.2009

По соображениям совместимости они не могут сделать это со стандартными выпусками Java. В настоящее время существует так много программного обеспечения Java, что вы просто не можете сломать его новым выпуском, который удаляет все лишнее.

Однако я думаю, что Sun могла бы выпустить выпуск «Java X», в котором было бы удалено все, что было грубым, и добавлены все хорошие и полезные API-интерфейсы, которые существуют, но в настоящее время не включены (включая замену API-интерфейсов Java, которые имеют лучшие доступные альтернативы, например, log4j, и не будем начинать с даты и календаря). Этот выпуск не предназначен для замены Java, но может использоваться в качестве цели для новых программных проектов. Я предполагаю, что они также могли бы исправить язык, включив в него отсутствующие функции, из-за которых Java выглядит немного грубо по сравнению с последними версиями C# и т. д. Если бы они также сделали инструмент переноса кода, который мог бы исправить или, по крайней мере, добавить "ИСПРАВИТЬ" все проблемные области в кодовой базе...

Должен признать, Microsoft хорошо справляется с переводом людей на более новые версии .NET, когда они выходят. Sun полностью потерпела здесь неудачу, учитывая количество приложений, все еще работающих на 1.4, и вялую политику версий Java многих компаний (которые, кажется, рады позволить своим .NET-людям каким-то образом использовать самые последние и лучшие версии). Учитывая, что установить несколько установок Java на машине несложно, я думаю, что следует сделать больше, чтобы стимулировать компании и компании-производители программного обеспечения к более раннему обновлению.

person JeeBee    schedule 14.01.2009

Я бы сказал, что нарушение обратной совместимости — глупая вещь для java. Если это так, вы можете называть это Java++, это уже не Java. С другой стороны, для будущих версий Java следует учиться на динамическом языке для таких функций, как простота синтаксиса. Поскольку аппаратная мощность растет очень быстро, уровень абстракции должен быть выше для компилирующего языка. Сравнивая некоторые особенности текущих версий Java с динамическими языками, он слишком громоздкий и многословный, а значит, менее продуктивный для разработки. Кажется, C# становится динамическим языком?

person jscoot    schedule 14.01.2009
comment
А если это Java++, то, несомненно, существует целый ряд вещей, которые вы сейчас делали бы не так, как пятнадцать лет назад. Это была бы совсем не Java. - person Tom Hawtin - tackline; 14.01.2009

Учитывая множество отличных альтернативных языков на JVM, я действительно не вижу причин для этого. Я бы предпочел иметь стабильную Java и перейти к новым интересным вещам (и при этом оставаться совместимым с Java).

person Fabian Steeg    schedule 14.01.2009

Поскольку большая часть рынка по-прежнему использует старые версии jdk/jre, я не думаю, что было бы прагматично нарушать обратную совместимость.

person Epitaph    schedule 14.01.2009
comment
Я думаю, что раньше это было правдой, но сейчас это не так. - person jamesh; 14.01.2009

Как сказал Пэт, внедрение новейшей версии JDK происходит довольно медленно, и многие приложения в настоящее время работают с использованием старых (иногда очень старых) версий Java.

Таким образом, я не думаю, что есть реальная польза от отсутствия обратной совместимости.

Что касается ваших предложений, я не вижу смысла удалять примитивы. Конечно, начиная с Java 5 есть автобокс. Однако у примитивов все же есть свои интересы...

person Romain Linsolas    schedule 14.01.2009
comment
Примитивы были сделаны частью java по соображениям скорости и памяти, но с тех пор, как была изобретена java, компьютеры прошли через множество циклов удвоения производительности, поэтому я думаю, что реальной причины не осталось. С другой стороны, оставление примитивов означало бы, что каждый тип будет объектным — большой шаг! - person Kai Huppmann; 14.01.2009

Нарушение совместимости имело бы смысл, если бы JVM оставалась прежней. В этом случае «новая» Java станет новым, другим языком, работающим на JVM, например перечисленными там. К счастью, то, как устроена JVM, гарантирует совместимость между языками и версиями, поэтому я думаю, что влияние будет ограниченным.

person fbonnet    schedule 14.01.2009

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

person Daddy Warbox    schedule 14.01.2009

Причина, по которой я оставил PHP, заключается в том, что они меняют API/доступные функции между основными обновлениями версии. Настоящая проблема заключается в том, что PHP не может работать в режиме совместимости для старых скриптов. Я не хочу, чтобы меня ЗАСТАВЛЯЛИ обновлять мой код.

Java находится в том же месте. Просто убедитесь, что вы можете использовать старые версии 1.4 в новых версиях. Это нормально — требовать, чтобы новые программы использовали новый xyntax, но заставьте работать старые!

person Gerrit    schedule 14.01.2009

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

Обратная совместимость очень важна, и, как уже упоминалось здесь, многие пользователи все еще используют код 1.3 и 1.4. Сказав это, я думаю, что если кто-то все еще использует код Java 1.0 или 1.1 в какой-либо устаревшей системе, он вряд ли перейдет на Java 7 в ближайшее время, и даже если они это сделают, им, скорее всего, придется переписать свой код. код в любом случае. Я думаю, что устаревший API версий > 1.2 можно смело удалять.

Еще одним аспектом обратной совместимости является добавление ключевых слов, что всегда не рекомендуется. в Java 5 основные языковые изменения были реализованы за счет добавления одного нового ключевого слова «enum», и даже это вызвало возмущение, поскольку каждый фрагмент кода с переменной с именем «enum» теперь не соответствовал требованиям. Насколько я знаю, изменения в Java 7 планируются без новых ключевых слов (уф!).

Юваль =8-)

person Yuval    schedule 14.01.2009
comment
В Java 7 должно было быть ключевое слово «свойство», но да, похоже, оно было удалено. - person cletus; 14.01.2009
comment
Я считаю, что ваш комментарий о примитивах путает реализацию с метафорой языка программирования. Было бы здорово иметь возможность сделать 5.toPowerOf(3).equals(125). Это было бы синтаксическим сахаром или перегрузкой оператора, чтобы получить это из 5 ** 3 == 125 - person jamesh; 14.01.2009
comment
@jamesh Нет, я бы не хотел, чтобы .toPowerOf был частью моего целочисленного класса! Это очень хорошо в стране математики, и я счастлив оставить ее там! Я не совсем против переноса чисел, но это кажется довольно бессмысленным, количество раз, когда это было бы полезно, довольно минимально, если вы кодируете правильно. - person Bill K; 08.12.2009

Это будет хорошо, если Sun не будет распространять новые обновления JDK для всех своих клиентов. Те, кто использует старые API, не будут обновляться и какое-то время будут использовать JDK старой версии.

Или, возможно, внедрив режим обратной совместимости.

person Yoni Roit    schedule 14.01.2009

Я думаю, что некоторые API, например дату и время, следует переписать. Если текущая версия получает EOL, то старый API следует удалить. Наша статистика показывает, что 99,3 % наших клиентов используют Java 6 или новее. Нет необходимости в совместимости очень старого API. Но должны быть четкие временные рамки, если API будет удален.

person Horcrux7    schedule 25.07.2010