В статье "Looking beyond Java technology for lightweight development" анализируются некоторые ограничения языка Java, успешно решенные в таком языке как Ruby.
opennet.ru
Статья из разряда:
"Чем Ruby лучше чем Java? Правильно - Ruby лучше чем Java"
Один мой знакомый утверждал, что Sun изобретая Java
сделал одну хорошую вещ и одну плохую.
Хорошая - разработал и воплатил Java API.
Плохая - разработал язык и vm java.
Он же утверждал, что Sun сделало бы великое благо,
если бы разработало и воплатило тот же API для C++.
Для Java есть Groovy, его синтаксис заметно компактнее и
тоже включает замыкания и лямбды
да глупости это. Язык хороший, простой, легко поддается рефакторингу, идеален для командной работы и ОО проектирования. По крайней мере он вполне заменил собой бимерский Smalltalk. А то что он не дает кульхацкерам левой пяткой кодировать, это плюс, пусть вытирают сопли и вместо кодирования проектированию учатся.
Насчет VM - простите, эту идею сейчас все кому не лень тащат у сантехников, начиная от .NET кончая Супер-Пупер Пайтоном.
мда...
И откуда столько идиотов критикующих статью, даже не прочитав ее!
Между тем Брюс абсолютно прав - все недостатки жабы, связанные со стремлением быть максимально похожим на С++ никуда не делись и иногда они здорово осложняют жизнь.
Конечно можно найти обходные пути через задницу, но проще выбрать лучший язык. Например - ruby.
бедный кодер...
ну ладно, давай я тебе по статье скажу чего-нить
Брюс ввергает кодеров в ужас, показывая как бедные жабобыдлокодеры итерируют массив:
for(i=0;i<array.size();i++) {
System.out.println(array[i]);
}
Поздравляю вас, гражданин соврамши, в жабе сейчас это пишется так:
for (String s: array) {
System.out.println(s);
}
Ух какая тема хорошая, к вечеру будет лидером по комментариям... ;-)
Вопрос к упомянувшим автора, как "известного": а чем Б.Тейт так уж известен? Bitter Java? Better, Faster, Lighter Java? Так ведь ничего особенного, кроме описаний того, как "мы с друзьями на наших каяках по порогам 5-й категории...". Много идей, мало смысла.
И кстати, тут товарищ был, ИМХО, абсолютно прав насчет "калаша". Кто использует такой хороший и мощный Руби?
>Конечно можно найти обходные пути через задницу, но проще выбрать лучший язык. Например - ruby.
Язык для написания чего?!
Lisp - очень неплохой язык, но что на нём написано?
Язык выбирают из многих соображений, краткость языка при этом не учитывается почти всегда. Я видел программы на perl, автор которых не мог понять как они работают через 2 месяца (так все было компактно написано).
PS. IMHO для написания систем масштаба предприятия альтернатив JAVA нету.
А язык java, да, не самый краткий. Русский тоже не самый краткий, why don't you flame in english?
> бедный кодер...
> ну ладно, давай я тебе по статье скажу чего-нить
Присоединяюсь. Кстати, у массивов в Яве нет метода size(), зато есть свойство length. Автор явно не прогонял примеры... ;-)
И еще хотелось бы знать, как после
> In Ruby, you'd type something like this:
> array.each {|element| puts element}
счастливый кодер обработает NullPointerException на неинициализированном массиве? Или у настоящих программистов эксепшнов не бывает? Или в этом и состоит стиль "lightweight" от герра Тейта?
В Яве это делается так (да-да, долго и некрасиво):
> Насчет VM - простите, эту идею сейчас все кому не лень тащат у сантехников,
Ты что, всерьез думаешь, что VM - это их изобретение?
AFAIR, первая рабочая VM сравнимого размера была как раз у Smalltalk.
Жалко его, кстати. Хорошая платформа была. Мой препод по жабке когда-то на ней писал, сейчас если его спросить, что он думает про жабку по сравнении со Smalltalk - можно весьма витиеватые матерные обороты услышать =)
> ну ладно, давай я тебе по статье скажу чего-нить
Если хочешь сказать по делу - распиши лучше пример с транзакцией.
Что забавно - в C# для подобных вещей сделали оператор using, и оно действительно очень помогает. RAII - великая вещь! А в жабке все, как всегда, ручками от и до...
> счастливый кодер обработает NullPointerException на неинициализированном массиве?
Что за бред? Если переменной array ничего не присвоено, то ее просто нет, какой null pointer? это не плюсово-жабские бредни... Если там не массив (а, например, явно присвоенный nil) - то у него просто не будет метода each.
Что касается передачи null функции, которая ждет массив... во-первых, возможность делать такие вещи - по сути своей дурацкая идея, показывающая степень проверки типов в строготипизированном языке (сравнить с ML). Во-вторых, для отлова таких вещей есть Design by Contract, которого в жабке... правильно, нет. И не предвидится, по причине невозможности расширять семантику программно.
>Что касается передачи null функции, которая ждет массив... во-первых, возможность делать такие вещи - по сути своей дурацкая идея, показывающая степень проверки типов в строготипизированном языке (сравнить с ML).
ну да, ну да, конечно... давайте все в рантайме ловить, и будет нам всеобщее динамическое счастье
>Во-вторых, для отлова таких вещей есть Design by Contract, которого в жабке... правильно, нет. И не предвидится, по причине невозможности расширять семантику программно.
не надо гнать, для таких вещей есть Aspect Java, которая не только предвидится, но и нормально работает у тех же бимеров.
Ок, принято. В Перле и "пых-пых" (PHP?) больше встроенных функций для работы со строками и массивами и они мощнее (кто бы спорил ;-)). Ява нужна НЕ для этого. Интерпретатор Перла можно впихнуть в мобильник? На нем (без С) можно сделать приличного толстого клиента? Есть аналоги Java Web Start? Про J2EE тихо умолчу... А для строк один раз пишется статический класс StringUtils с недостающими функциями. Или берется готовый из Apache Commons.
Кстати, вопрос был не про длину кода, а про то, что счастливый кодер на Руби/Перле/PHP будет делать с исключениями при передаче null в качестве массива: писать die "Sam durak"??
> А язык java, да, не самый краткий. Русский тоже не самый краткий, why don't you flame in english?
Because it's not my native language. Is jaba your native language? :)
And, besides, comparison for native languages in thread about programming languages is not honest isn't it?
> Кстати, вопрос был не про длину кода, а про то, что счастливый кодер на Руби/Перле/PHP будет делать с исключениями при передаче null в качестве массива: писать die "Sam durak"??
А что сделаешь ты? Скорее всего твой обработчик тоже сводится к выводу на экран сообщения о смерти и скоропостижной кончине приложения.
Он абсолютно неправ. Если юы он хотел показать отличия похвастался рубином и пожалел джаву его бы поняли. Но он на основании пары более продвинутых фич (closures/continuation) делает глобальный вывод что рубин продуктивнее java. Это бред.
Тем более что он скатывается вконце в фанатскую фигню про динамические и статические языки при чем фразой: "Static typing: You must declare every variable and every parameter which requires more time for much less benefit than you think" говорит о том что он не знает о чем говорит, да еще приводит необходимость декларировать типы как основной недостаток статической типизации, что вообще говоря бред сивой кобылы.
>> счастливый кодер обработает NullPointerException на неинициализированном массиве?
> Что за бред? Если переменной array ничего не присвоено, то ее просто нет, какой null pointer? это не плюсово-жабские бредни... Если там не массив (а, например, явно присвоенный nil) - то у него просто не будет метода each.
"Бред", "бредни"... Давайте, что ли, _наш_ язык поднимем на более высокий уровень, коль уж взялись обсуждать _высокоуровневые_ ЯП.
Объясните, пож-ста, что будет, если данный код из статьи:
array.each {|element| puts element}
вставить в метод, куда переменная array передается параметром? И передается null, nil или как оно там зовется в Руби. Ошибка в рантайме? Какая? Как ее отловить? Где найти информацию о ней (в Яве - @throws в комментарии к методу).
Если Руби настолько высокоуровневый, что все переменные в нем - глобальны, все программы - состоят из одной функции main() а 3-rd party библиотеки не используются, то я вопрос, конечно, снимаю.
Smalltalk слишком динамический. RTTI на каждом шагу. Так что для его VM создание таких замечательных, супер-эффективных JIT-ов, как для JVM, было бы просто нереально. Smalltalk - хорош, но уже и он - удел маргиналов. Java - рулит, за ней будущее!
>> Кстати, вопрос был не про длину кода, а про то, что счастливый кодер на Руби/Перле/PHP будет делать с исключениями при передаче null в качестве массива: писать die "Sam durak"??
> А что сделаешь ты? Скорее всего твой обработчик тоже сводится к выводу на экран сообщения о смерти и скоропостижной кончине приложения.
Зачем??? Я могу сделать все, что угодно. Для примера: отобразить пустой listbox в форме, пробросить исключение дальше, снабдив его локализованным сообщением для юзера и продолжить работу. Наконец, просто могу НИЧЕГО не делать: привел же пример, где цикл для null выполнится 0 раз - без исключений. Если бы Ява-приложения дохли от каждого NPE, Ява бы действительно была никому не нужна ;-)
До чего же убогий флейм. АСКСИОМА: пионерам не нужны дебагеры, обработчики исключений и документация. Если че-то работает не так - виноват пользователь требующий от программы странного.
>Зачем??? Я могу сделать все, что угодно. Для примера: отобразить пустой listbox в форме, пробросить исключение дальше, снабдив его локализованным сообщением для юзера и продолжить работу. Наконец, просто могу НИЧЕГО не делать: привел же пример, где цикл для null выполнится 0 раз - без исключений. Если бы Ява-приложения дохли от каждого NPE, Ява бы действительно была никому не нужна ;-)
Похоже, чел считает, что обработка исключений есть уникальное свойство Жабы. Ну-ну...
> Похоже, чел считает, что обработка исключений есть уникальное свойство Жабы. Ну-ну...
Отнюдь! Я искренне хочу увидеть пример, как это делается в Руби. Вот только подозреваю, что код уже не будет столь прозрачен и 3-4 раза короче явского.
Иначе говоря, давайте сравнивать _реальные_ приложения, а не очередную демку в две строки. Кстати, гневынх реплик вида "Вот могучее приложение XXX, писанное на Руби!" на свой вопрос, кто же его пользует, я тоже не вижу...
Sun-ch как всегда прав, просто здается мне что если в блоке операций над каждым елементом массива много кода + обработка исключений выигрыша мы не получим. На крайня в том же ИДЕ типа ДЖейДевелопера мошно на мышачить цикл в стиле 1.5.
>А что сделаешь ты? Скорее всего твой обработчик тоже сводится к выводу на экран сообщения о смерти и скоропостижной кончине приложения.
Гы! А он сбацает что-то вроде "void printArray( T[] array not null )" ... но только похоже что это будет в следующем тысячелетии ...
Да ладно, похоже товарисчь попытался таким образом апеллировать к статической строгой типизации в жабе, однако очень похоже, что жаба сама скатывается к динамической. Посмотрите на ХМЛ-ные конфиги - каждое уважающее себя приложение на жабе или сколь нибудь заметный фреймворк включает в себя километровые конфиги, которые (вместе с кодом, который придает им некий семантический смысл) в конечном счете не что иное как отдельный язычек, в котором и в помине никакой типобезопасности просто нет! Более того все это очень трудно потдается отладке. Представьте какого можно поиметь геморроя, используя спринговский аутовайэринг. То, что раньше считалось плохим стилем - типа модификации приложением своего кода на этапе выполнения или генерация нового кода, теперь считается нормой...
Забавно, теперь все говорят о замыканиях, аспектах, метапрограммировании, ДСЛ-ах ... похоже движемся назад, к 50-м, к Lisp - у? Ась?
> Чё тупим? Для объекта null метода each не существует.
> Поймаем исключение
> rescue SystemCallError ....
А-а-а! В рантайме, естественно...
А теперь давайте сравним код на Руби, перебирающий массив (из статьи) и _устойчивый_ к null, с приведенным кодом на Яве? Что, код на Руби по прежнему в разы проще и интуитивнее, как всех пытается убедить Тейт?
А создать свой класс с перегрузкой метода toString() религия не позволяет. Или вас смущает что он будет проверять массив на NPE и выводить информацию сошласно вашему представлению + локализация?
Я уже молчу про сортировку вашик елементов этого массива.
> Кстати, вопрос был не про длину кода, а про то, что счастливый кодер на Руби/Перле/PHP будет делать с исключениями при передаче null в качестве массива: писать die "Sam durak"??
На Perl с use strict; null-массивов как таковых не бывает. Бывают, разве что, пустые, и еще может быть undef в том месте, где мы ожидали arrayref. Но это все ловится влет. Да, эксепшены-в-стиле-явы к перлу прикручиваются (но через задницу, конечно - ну а вы чего хотели? ;)
По-моему очень поверхностная статья.
Все примеры разбирать не буду, но по первому - в Java есть куча способов правильно организовать цикл. И если его организовать правильно через Iterator, то синтаксис будет много понятнее. Вообще говоря код не должен быть очень коротким. Он должен быть непротиворечивым. Я не знаю Ruby, но мне по первому примеру с циклом не совсем понятно, куда здесь ставить тело цикла.
> счастливый кодер обработает NullPointerException на неинициализированном массиве? Или у настоящих программистов эксепшнов не бывает? Или в этом и состоит стиль "lightweight" от герра Тейта?
Кажется так можно:
array.each {|element| puts element} if array
чтобы ничего не печаталось если array.nil? (вопрос относится к методу, а не к предложению)
>в Java есть куча способов правильно организовать цикл. И если его организовать правильно через Iterator, то синтаксис будет много понятнее...
... но все равно хуже чем в ...(тут длинный перечень менее популярных языков). И это касается не только перебора элементов структуры. Об этом и статья.
Странно - такой резкий контраст между этой статьей и его книгой "Горький вкус Java" по уровню профессионализма... Может это подстава какая-нибудь? Типа первоапрельского розыгрыша? Особенно впечатлили сентенции про итерацию массивов... По книге ощущение, что он, мягко говоря, не первый год знает Java; читаешь статью - очередной журналюга с учебником для студентов на коленках... Нет, наверное розыгрыш :)
> Bruce Tate - весьма даже известная личность и к его критики стоит прислушаться.
Он сильно головой во время катания на каноэ, наверное, приложился.
Про "авторитеты" - спроси у Луговского. "Авторитеты" есть только в особых не столь отдаленных местах, в Науке авторитетов нет.
А у меня есть критика его книги Bitter Java - и что?
Бимики (из компании Idiots Become Managers) как-то народ хотели заставить на Java SP и UDF для DB2 писАть - дурная голова рукам покоя не даёт.
Java - это cool-язычок для мидлетов на маленьких телефончиках (без "Симбиана") и раньше ещё был для апплетов.
Что-то "хардкодеры" на PL/SQL и DB2 ANSI SQL99 снова появились после провала супер-пупер EJB-проектов вслед за провалом RMI/CORBA-"энтузазизма". Вот "кГрысы" типа Тэйта и начали метания.
Давно пора даже бимерам понять простую истину - НЕТ УНИВЕРСАЛЬНОГО ЯЗЫКА ПРОГРАММИРОВАНИЯ!