Помимо проблем с производительностью, почему Java по-прежнему предпочитается Groovy / JRuby и т. Д.?

[Это эмпирический вопрос о состоянии дел: я НЕ спрашиваю, является ли Java круче или менее крутой, чем динамические языки, которые работают в JVM.]

Помимо случаев, когда производительность является основным фактором принятия решения, предпочитают ли компании / разработчики по-прежнему Java вместо Groovy, JRuby или Jython?

Изменить: Если "да", почему?

Личное примечание: я спрашиваю, потому что, хотя я выполняю некоторую часть своей профессиональной работы в Ruby (пока не в JRuby), в своих личных проектах я использую Java. Хотя я писал нетривиальные приложения на Groovy, я предпочитаю Java, но мне интересно, стоит ли мне просто преодолеть это и делать все на Groovy. Мне нравится Java, потому что я считаю, что статическая типизация экономит мое время и помогает рефакторингу. (Нет, я не знаком со Scala.) Однако я чувствую, что этот очень эмпирический вопрос программирования по теме может повлиять на мое решение.


person Dan Rosenstark    schedule 10.05.2010    source источник
comment
Ваш вопрос звучит так, как будто вы думаете, что такие вещи, как Groovy, JRuby или Jython (не JPython), лучше, чем Java для всех целей. Это просто не так.   -  person Jesper    schedule 10.05.2010
comment
@Jesper, кроме того, где производительность вызывает беспокойство, когда еще это не так?   -  person Dan Rosenstark    schedule 10.05.2010
comment
Что ж, вы уже сами утверждаете, что статическая типизация - это преимущество. Я не видел каких-либо действительно крупных программных проектов, выполненных с использованием динамических языков, но подозреваю, что динамические языки хуже масштабируются (когда вы получаете много исходного кода, его будет очень трудно понять и поддерживать из-за отсутствия безопасности типов. ).   -  person Jesper    schedule 10.05.2010
comment
@Jesper - сторонники динамических языков сказали бы, что причина, по которой вы не видели действительно больших проектов динамического языка, заключается в том, что гибкость динамических языков означает, что вам не нужно столько кода для выполнения работы. Другими словами, большие проекты (в некоторой степени) вызваны выбором статически типизированного языка. Я не говорю, что на 100% согласен с этим, но это стандартный ответ на вопрос о том, что динамические языки не подходят для аргументов в пользу больших проектов.   -  person Dónal    schedule 10.05.2010


Ответы (6)


языки с нестатической типизацией плохо «масштабируются» с точки зрения обслуживания. Они обслуживаются до нескольких десятков тысяч строк кода. В прошлом им просто требовалось больше усилий для поддержания, изменения или обновления. Это верно для любого из языков нестатической типизации, Perl, Python, Groovy, Ruby и т. Д. Инструменты для работы с полмиллионом строк кода Python по сравнению с таким же количеством строк кода в C / C ++ / Java просто недоступны. нет там. Теперь верно, что Python составляет от 1/3 до 1/5 количества строк кода, как эквивалентная программа Java. Так что это никогда не будут яблоки и апельсины, но есть точка отсечения, когда количество строк кода на нестатическом языке будет иметь убывающую отдачу от обслуживания. И все знают, что обслуживание - это то место, где всегда была истинная стоимость программного проекта.

person Community    schedule 10.05.2010
comment
+1 какие инструменты есть для Java, позволяющие работать с полмиллионом строк кода (которых нет для Python)? - person Dan Rosenstark; 10.05.2010
comment
зачем кому-то еще создавать 50 проектов KLoC +? - person Dan; 10.05.2010
comment
любая IDE рефакторинга, такая как Intellij IDEA, которая может выполнять рефакторинг всей базы кода на основе типа, чего не может ни один инструмент Python, потому что во время выполнения отсутствует информация о типе. И 50lk LOC - это не большой объем кода в решениях операторского уровня, большинству людей не нужно работать в проблемной области, где у них есть миллионы пользователей и миллионы одновременных пользователей, поэтому большинство людей не видят необходимости в масштаб кода, который я привык использовать в качестве примера. - person ; 10.05.2010
comment
@fuzzy lollipop, это интересно, но я не знаю, какой процент проектов это будет. С другой стороны, вы высказываете более глубокую мысль: рефакторинг НИКОГДА не будет возможен без информации о типе. Интересно, правда ли это. Я спросил об этом однажды - stackoverflow.com/questions/2317579 - но вопрос был взят на себя ответами SmallTalk и никогда не принимал выключенный :) - person Dan Rosenstark; 10.05.2010
comment
Большинство проектов, над которыми я работаю, укладываются в 100-тысячный SLOC, поэтому пропорция для меня не проблема, все, над чем я работаю, масштабно, и я должен уметь проектировать для поддержки решений такого размера. - person ; 11.05.2010
comment
Я не сомневаюсь, что есть еще люди, пишущие монолитные приложения, мне просто интересно, почему? - person Dan; 11.05.2010
comment
ничего монолитного ни в чем, я работаю. У меня более десятка различных сервисов, которые работают в кластерах без сохранения состояния, просто в них много бизнес-логики. В них много логики графического интерфейса, много кода графического интерфейса. Проекты вертикальной интеграции особенно сложны из-за систем логического сопоставления друг с другом. То, что SLOC много, ничего не говорит об архитектуре. - person ; 11.05.2010
comment
многоуровневые приложения также могут быть монолитными, например, сотни сущностей (или сервисов) в одном приложении. Кстати, grails упрощает создание модульных веб-приложений благодаря своей архитектуре плагинов. В стандартном J2EE вам нужно много сантехники, чтобы объединить несколько войн в одну. - person Dan; 12.05.2010
comment
но он сказал, кроме соображений производительности и преформ Groovy УЖАСНО по сравнению с простой Java. - person ; 12.05.2010
comment
@fuzzy lollipop, относительно производительности ознакомьтесь с этой статьей: ibm.com/developerworks/library/ j-jtp12214 Groovy скомпилирован в байт-код, и на современных виртуальных машинах измерить производительность не так просто. - person Dan; 12.05.2010
comment
вы говорите, что groovy скомпилирован в байт-код, как будто это что-то значит, это не значит, groovy имеет много уровней косвенности, чтобы включить синтаксический сахар, который он использует, и все они складываются во множество дополнительных циклов, чтобы сделать все косвенные действия, чтобы сделать то же самое вещь на прямом Яве. Groovy медленнее Java по большинству вещей, это просто факт. Эта статья, на которую вы ссылаетесь, посвящена Java, многие из этих JIT-оптимизаций не могут быть выполнены с помощью groovy из-за всех промежуточных классов, а также косвенности и отражения, которые выполняются с помощью groovy. отличный байт-код! = байт-код Java. - person ; 12.05.2010
comment
Groovy медленнее, чем java, без сомнения, но разница, как правило, преувеличена. Ознакомьтесь с другой статьей: wiki.jvmlangsummit.com/images/8/8c/Theodorou_Groovy .pdf Для Groovy требуется больше времени. - person Dan; 13.05.2010
comment
Актуальное сравнение производительности современных реализаций Groovy и Java. обратите внимание, что при правильном использовании производительность Groovy не является проблемой, неправильное использование нанесет вред вашему приложению. - person ; 29.10.2013

Статический набор по-прежнему важен.

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

Я не хочу спорить, верен ли этот аргумент, поэтому я предполагаю, что это так, для этого ответа.

В этом случае остается одна проблема: многие магазины не имеют процедур / ноу-хау / правил / управления для проведения достаточного количества высококачественных модульных тестов.

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

Аналогичная проблема существует с двойной отправкой:

В Groovy вызовы методов отправляются на основе фактических типов аргументов во время выполнения (что почти необходимо, поскольку статический тип неизвестен и / или Object большую часть времени). Это означает, что не существует надежного способа узнать, какой метод вызывается в любой заданной точке кода при столкновении с расширяемыми иерархиями классов.

Любой код, который большую часть времени вызывает метод с подписью foo(String), может внезапно вызвать foo(Integer) или foo(SomethingElseEntirely) в зависимости только от фактического типа аргумента во время выполнения. В языке Java этого никогда не произойдет, потому что точная сигнатура вызываемого метода определяется во время компиляции.

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

person Joachim Sauer    schedule 10.05.2010
comment
Это правда, но разве код с модульными тестами не является неизбежным будущим для всех, даже на Java? Стандартный ответ для примера использования кода Java Collections см. В модульных тестах. - person Dan Rosenstark; 10.05.2010
comment
@yar: в идеальном мире: правда. В реальном мире: я боюсь, что мы никогда не достигнем этой утопии. Также: все еще остается вопрос, действительно ли модульные тесты сводят на нет все проблемы динамического связывания, на который, на мой взгляд, еще нет однозначного ответа. - person Joachim Sauer; 10.05.2010
comment
Написание модульных тестов должно быть обязательным независимо от используемого языка программирования, но зачем отказываться от дополнительной безопасности, которую обеспечивает компилятор? Идея, что нам не нужна безопасность типов, мы просто пишем модульные тесты! звучит глупо для меня ... - person Jesper; 10.05.2010
comment
@Jesper: Я не согласен с аргументом, что модульные тесты могут заменить проверки статического типа, но я слышал это много раз. Я просто хотел избежать обсуждения и показать, почему модульные тесты не являются достаточным решением, даже если мы предполагаем, что аргумент верен. - person Joachim Sauer; 10.05.2010
comment
@Joachim - я думаю, вы переоцениваете значение двойной отправки. Это проблема, только если у вас есть перегруженные методы в том же классе, которые принимают одинаковое количество аргументов, а аргументы в эквивалентных позициях имеют отношение родитель-потомок. Это довольно редкое явление. Более того, полиморфизм имеет точно такую ​​же проблему, т.е. до времени выполнения вы не знаете, какая реализация метода будет вызвана. - person Dónal; 10.05.2010
comment
@ Дон: правда, это не обычная проблема. Что еще больше усугубляет проблему, потому что люди не склонны задумываться об этой разнице. Кроме того, с однократной отправкой проблема совершенно иная: когда метод переопределяет другой, хорошо известно, что он должен быть совместим с удалением. - person Joachim Sauer; 10.05.2010
comment
@Joachim Sauer, хотя проблема двойной отправки - это просто еще один пример перемещения проблем из времени компиляции во время выполнения (и, следовательно, не собираюсь изменять мнение никого, кто считает Groovy отличным), это также цена, которую вы платите за желание сделать Dynamic Ява. В Ruby просто нет перегрузки операторов, и я думаю, что это не имеет смысла в динамических языках. Плохой Groovy, как и любой другой язык, страдает неязыковыми факторами (желанием взаимодействовать с Java). Извините, что в этом длинном комментарии нет смысла :) - person Dan Rosenstark; 10.05.2010
comment
@yar: лично я считаю Groovy отличным языком, и мне нравится писать на нем код. Я просто думаю, что Groovy - это всего лишь еще один инструмент в моем наборе инструментов, и он не вытеснит полностью Java, потому что для многих вещей я предпочитаю (или даже нуждаюсь) в более явном и подробном подходе Java. - person Joachim Sauer; 10.05.2010
comment
@JoachimSauer извините, что в 2010 году у меня не было достаточно глубины, чтобы понять этот ответ, и я не оценил, насколько хорошо он написан. Это на 100% верно: модульные тесты не могут решить проблему (потому что они не могут, если бы могли, из-за людей), а двойная отправка делает код менее детерминированным с небольшой выгодой. ... сложнее читать, понимать и рассуждать о коде, изложенном идеально. Спасибо. - person Dan Rosenstark; 07.10.2012

Помимо случаев, когда производительность является основным фактором принятия решения, предпочитают ли компании / разработчики по-прежнему Java вместо Groovy, JRuby или JPython?

Да, и я считаю, что основная причина - инертность со стороны разработчика или компании:

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

Отсутствие доступных ресурсов, вероятно, является другой причиной, хотя это что-то вроде проблемы курицы и яйца (или мексиканского противостояния, или самореализующегося пророчества, или чего-то еще). Я полагаю, что многие компании следят за Groovy, Jython и т. Д., Но ждут, пока они получат более широкое распространение, прежде чем решиться. Очевидно, что сами откладывая внедрение, они усугубляют проблему нехватки ресурсов.

Личное замечание

Последний год я работал разработчиком Groovy / Grails. Недавно я сменил работу и сейчас работаю разработчиком Java 1.4, и (по сравнению с программированием на Groovy) это так же приятно, как выдолбить себе глаза ржавой ложкой.

Статическая типизация хороша тем, что облегчает проверку во время компиляции и инструменты анализа кода, такие как FindBugs, но никоим образом не компенсирует огромное количество (шаблонного) кода, необходимого для выполнения простейших задач при написании Java (особенно если вы: (если вы используете более раннюю версию, чем 1.5).

person Dónal    schedule 10.05.2010
comment
спасибо за это, +1. Интересно, но это не сулит ничего хорошего для развития Java: выбирает ли кто-нибудь Java из-за особенностей языка? - person Dan Rosenstark; 10.05.2010
comment
Что касается Groovy и Java 1.4: я чувствую вашу боль, но было бы несправедливо сравнивать такую ​​старую версию, как Java 1.4 (которая уже довольно долгое время находится на завершающем этапе), с таким молодым языком, как Groovy. - person Joachim Sauer; 10.05.2010
comment
+1 за указание на инерцию. Это важный фактор в принятии решений, изменения небезопасны, а использование новых технологий заставляет менеджеров нервничать. В то время как некоторые компании преуспевают в реальных инновациях, большинство предпочитают копировать формулу (язык, платформу), которая работает где-то еще, и чувствуют себя более комфортно, если отстают. - person Etienne; 10.05.2010
comment
@Yar - Единственный способ, которым я мог бы увидеть выбор Java на основе ее характеристик, - это если отсутствие функций считается положительным моментом. Некоторые могут назвать это отсутствие функций простотой, но я называю это разочарованием. - person Dónal; 10.05.2010

Да, конечно.

Почему компании по-прежнему «охотно» используют Java?

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

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

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

Java предлагает:

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

  2. Узнаваемость бренда и подтвержденный послужной список успешно реализованных проектов. Это не повод для насмешек: если я скажу высшему руководству, что начинаю проект на каком-то отличном новом языке, о котором они никогда не слышали, я должен обучить их этому, и они сочтут это риском. На любом «устоявшемся» языке я могу пропустить этот шаг.

  3. Хорошо зарекомендовавшие себя инструменты поддержки и сторонняя поддержка.

Эти преимущества проявляются в любом сравнении давно установившегося языка с новым, а не только между Java и вашим списком. Я ожидаю, что однажды Groovy и др. Станут устоявшимся языком, и будут люди, которые зададут тот же вопрос о каком-нибудь более новом, более ярком языке. Это цикл. Так было дольше, чем я занимался этим бизнесом.

person CPerkins    schedule 10.05.2010
comment
Отлично, +1. Спасибо за размышление над этим вопросом объективного и эмпирического программирования. Итак, если бы вам пришлось сделать совершенно безумное предположение, могли бы вы сказать, что динамические языки заменят статические языки в долгосрочной перспективе? - person Dan Rosenstark; 10.05.2010
comment
@yar Я ожидал бы, что мои предположения будут иметь даже меньшую ценность в объективном обсуждении, чем анекдотические свидетельства, но мое не совсем умозрительное предположение состоит в том, что нет, динамические языки не заменят статические. Я так считаю, потому что языки не заменяются. Они становятся менее используемыми, менее крутыми и даже устаревшими, но их не заменяют. Подумайте: люди все еще пишут кобол. - person CPerkins; 10.05.2010
comment
Совершенно верно, @CPerkins. Лично я жду своего поезда, чтобы найти язык, который может рефакторинг / автозаполнение так же, как Java, но динамичный и увлекательный, как Ruby. В последнее время в обсуждениях постоянно возникают темы о SmallTalk и Scala. Возможно, мне скоро придется попробовать Obj-C, так как это предпочтительный язык для iPad, который является родственником. Но да, плюралистическая вселенная, это звучит правильно, учитывая то, что мы видели до сих пор. - person Dan Rosenstark; 10.05.2010
comment
@Daniel 'yar' Rosenstark Извините, я как-то пропустил этот комментарий. Я тоже жду свой дирижабль, по крайней мере, для следующей эволюции. - person CPerkins; 17.07.2010
comment
@Yar, тебе действительно стоит попробовать scala. Я чувствую, что это своего рода язык, к которому все может привести. Он статически типизирован, но компилятор намного сложнее, чем все, что я использовал раньше. Он использует такие вещи, как вывод типов и неявные преобразования типов, чтобы предоставить набор функций, которые позволяют вам писать код, который выглядит и ощущается как динамически типизированный код, с преимуществом возможности явно вводить вещи, когда вам нужно или нужно. Это не идеально, и вам нужно указать тип в определенных ситуациях, но похоже, что вам это действительно может понравиться - person grinch; 06.10.2012
comment
Спасибо @grinch, сейчас я делаю только Objective-C, язык, который мне очень не нравится. Тем не менее, есть определенный покой в ​​обучении на высших уровнях абсурда, например, когда приходится иметь дело с пулами автозапуска и т. Д. Тем не менее, я скоро проверю Scala ради любопытства. Насколько сложно было бы настроить сценарий для командной строки или невозможно, потому что он скомпилирован? - person Dan Rosenstark; 07.10.2012
comment
@Yar Вы можете использовать его для скриптов, потому что для него есть интерпретатор. Я не очень много писал сценарии с помощью scala, но, похоже, на форумах есть много подобных. Я все же использую интерпретатор командной строки - действительно приятно просто быстро что-то протестировать или сидеть и по-настоящему играть с вещами, чтобы попытаться почувствовать компилятор и то, как он обрабатывает определенные ситуации. - person grinch; 08.10.2012
comment
Спасибо @grinch, проверю. stackoverflow.com/questions/6230511/ наверное есть и ссылки получше - person Dan Rosenstark; 08.10.2012

Я могу рассказать вам, что происходит в моей компании. Наше текущее приложение написано на java, но мы начали переход на grails / groovy, и это, скорее всего, станет платформой для следующего поколения наших продуктов.

person Dan    schedule 10.05.2010
comment
анекдотические свидетельства не так уж интересны, но в любом случае +1, поскольку они действительно помогают, спасибо. - person Dan Rosenstark; 10.05.2010

Поскольку вы задаете эмпирический вопрос, и я предполагаю, что ищете эмпирические ответы:

Помимо случаев, когда производительность является основным фактором принятия решения, предпочитают ли компании / разработчики по-прежнему Java вместо Groovy, JRuby или JPython?

да.

Не думаю, что есть что еще сказать.

person matt b    schedule 10.05.2010
comment
Так почему же они все еще выбирают Java? Это инерция (что для меня означает, что она когда-нибудь изменится) или основано на языковых особенностях? - person Dan Rosenstark; 10.05.2010
comment
вам придется задать вопрос каждой отдельной компании и разработчику, это действительно безответный / субъективный вопрос. 1) знакомство 2) знания 3) комфорт 4) и т. Д. - person matt b; 10.05.2010
comment
это не субъективно, хотя данные, необходимые для ответа, предполагают знание того, что думают разработчики и компании. Но если бы вам пришлось строить предположения, основываясь на опыте и ваших знаниях, вы бы сказали, что инерция (знакомство, знания, комфорт) объясняет выбор Java там, где производительность не является проблемой большую часть времени в 2010 году? - person Dan Rosenstark; 10.05.2010
comment
Да, но я не думаю, что это обязательно плохо. Кроме того, производительность часто вызывает беспокойство. - person matt b; 11.05.2010