В статье "Looking beyond Java technology for lightweight development" анализируются некоторые ограничения языка Java, успешно решенные в таком языке как Ruby.
opennet.ru
По поводу WebSphere. Что-то как-то снова для MOM использовать IBM WS MQ Broker (в ядре своем Си-шный), который НИКАКОГО отношения к JMS WS MQ на тормозах EJB MDB не имеет, кроме как эклипсовой оболочки. Вот и дали команду "фас" бывшим своим коллегам. К skills Тэйта эта статейка тоже никакого отношения не имеет - чистА PR-заказ, подготовка обЧественного мнения.
> Если она может быть выражена через цикл, то она по определению сводится к хвостовой рекурсии, ламер.
Если кто и ламер, то это ты: любая задача может быть решена через последовательный оператор и цикл while. Так что, обойдемся без хвостовой рекурсии и прочих лишних сущностей.
>Если кто и ламер, то это ты: любая задача может быть решена через последовательный оператор и цикл while. Так что, обойдемся без хвостовой рекурсии и прочих лишних сущностей.
:))))))))))))))))))))))))))))
2All: не, таких кадров нужно в цырке показывать и кино о них снимать:)
> 2All: не, таких кадров нужно в цырке показывать и кино о них снимать:)
Ну ясно, ты, мальчик, книжек классических не читал и теперь умничаешь. Ладно, иди дальше лови хвостовую рекурсию, новый фетиш "мастеров" от программирования ;)
> You must declare every variable and every parameter, which requires more time for much less benefit than you think, if you accept the idea that automated unit tests should catch many of your mistakes.
То есть, теперь контролировать типы данных на этапе компиляции не модно. Юнит-тесты, видите ли, все поймают. Однако "many" не есть "all", и вот оставшиеся ошибки будут ловиться вручную, долго и увлекательно.
> То есть, теперь контролировать типы данных на этапе компиляции не модно.
Это интересный вопрос. Вообще я пришел к выводу, что явная типизация параметров - это хорошо и правильно, но, строго говоря, должно входить в precondition метода в терминах DbC, а не являться частью сигнатуры. Т.е. ограничение типа 'x is Integer' по сути своей не отличается от 'x != 0', а когда эти проверки выполнять, compile-time или run-time - это отдать на откуп компилятору. Перегрузка функций по типу аргументов - зло, вызванное отсутствием именованных параметров у функций (см. Smalltalk и Objective C для показательного примера, как оно должно бы выглядеть).
А вот нафиг явно типизировать локальные переменные, я вообще не понимаю. О какой-либо доп. безопасности там речь идти не может, тело метода - это вещь в себе. Оптимизация - что, компилятор такой тупой, не выведет тип переменной при ее инициализации?
Кстати, необходимость явной типизации параметров и возвращаемого значения private-методов тоже вызывает сильные сомнения, по схожим причинам.
> любая задача может быть решена через последовательный оператор и цикл while
Не с того конца заходишь. Любой цикл может быть организован последством рекурсии (не обязательно хвостовой), если нет ограничений на размер стека. Рекурсия нынче наличествует в любом хоть сколько-то популярном ЯП. Поэтому как раз всякие for и while - это лишние _базовые_ сущности в языке. Однако они бывают удобны, поэтому их наличие в виде функций или макр полезно. Наглядный пример - Nemerle, где while и for имеют один в один сишный синтаксис, но на самом деле это макры, разворачивающиеся в рекурсивный вызов функции.
А хвостовая рекурсия - это всего лишь оптимизация, имитирующая бесконечную глубину стека для одного наиболее часто используемого случая.
Пожалуйста, оставьте в покое for и while. Если мне понядобится в теле метода два и более небольших циклов, мне очень не захочется делать для этого две и более ЛИШНИХ в моей программе СУЩНОСТИ в виде методов. Если нравится хвостовая рекурсия, отстаивайте ее идею в Сети, чтобы разработчики javac/eclipse включили соответствующие оптимизации в компиляторы. Но зачем удалять то, что используется давно и эффективно?
Расскажите, мне пожалуйсата, как запустить, Tomcat на мобильнике(у меня java + 512mb flash) должно хватить.
Вы ведиь такой умный и видимо научились переносить программы между j2ee и j2me.
А циклы читать не тяжело когда они в большинстве своем предаставляют собой синтаксическую мишуру вокруг групповой модификации набора данных каким либо кодом или отбором из этого набора по какому либо условию?
* JavaTM 2 SDK, Standard Edition (J2SE SDK), version 1.4.2 - if you plan to do actual development, or JavaTM 2, Standard Edition Runtime Environment (JRE), version 1.4.2 - if you only plan to run the demonstration applications."
Заметим! * Microsoft Windows XP - и никаких Ляликсов или Соплярисов. Бета-тестер должен работать на стабильной ОС. Кстати, в релизе 2.2 Линукс юзается на свой страх и риск, причём рекомендуется только RH9:
" One of the following operating environments:
* Microsoft Windows XP
* Linux (unsupported)
...
NOTE: The Linux version of the toolkit is unsupported and has undergone only limited testing on the Red Hat 9.0 distribution. "
Достаточно посмотреть, насколько CLDC 1.1 более убога по коллекциям, чем даже J2SE 1.4.2.
Так что место Джавы == это место её родителя Оука. То есть пульты, мобильнички среднего класса и т.п.. Начиная с коммуникаторов - .NET 2.0 будет. Ну и T-SQL, PL/SQL для enterpriZe.
Так что прав B.A.Tate, хочешь баксов - будешь конъюктурщиком.
> Если мне понядобится в теле метода два и более небольших циклов, мне очень не захочется делать для этого две и более ЛИШНИХ в моей программе СУЩНОСТИ в виде методов.
Млин, ну хоть читай посты внимательно, а?
Да пусть они там будут, ваши циклы. В стандартной библиотеке, сделанные макрами или еще чем и разворачивающиеся в рекурсию. И пиши себе на здоровье. А вот плодить лишние сущности в семантике языка - нефиг.
И еще раз повторюсь: сходи и почитай о Nemerle. Очень наглядный пример, как из функций и рекурсии можно сделать практически один в один сишный синтаксис, котоый вы все (да и я сам, чего уж там...) так любите.
> Вообще я пришел к выводу, что явная типизация параметров - это хорошо и правильно, но, строго говоря, должно входить в precondition метода в терминах DbC, а не являться частью сигнатуры. Т.е. ограничение типа 'x is Integer' по сути своей не отличается от 'x != 0', а когда эти проверки выполнять, compile-time или run-time - это отдать на откуп компилятору. Перегрузка функций по типу аргументов - зло, вызванное отсутствием именованных параметров у функций (см. Smalltalk и Objective C для показательного примера, как оно должно бы выглядеть).
Это всё воплощено в Perl6. Насколько я знаю, там статические предусловия для параметров функций, как "x is Integer" или "x + y > 2" проверяются в compile-time когда возможно, а когда невозможно, то в run-time.
Вообще, Perl6 делает Ruby менее актуальным, хотя, конечно же, Ruby - язык достойный (в частности, потому как основан на Perl5).
> Это всё воплощено в Perl6. Насколько я знаю, там статические предусловия для параметров функций, как "x is Integer" или "x + y > 2" проверяются в compile-time когда возможно, а когда невозможно, то в run-time.
Я знаю. В Perl6 однако много новых фич весьма сомнительного характера. В частности, местный подход к ООП и мультиметодам мне не очень нравится (хотя, в Ruby их вообще нет - так что...).
> Вообще, Perl6 делает Ruby менее актуальным, хотя, конечно же, Ruby - язык достойный (в частности, потому как основан на Perl5).
С каких пор Ruby основан на Perl? =) Синтаксис разве что кое-где (регэкспы и magic variables), а семантически оно очень похоже на Smalltalk.
O'Reilly Interview: What bits of Perl did you incorporate in Ruby?
Matz: A lot. Ruby's class library is an object-oriented reorganization of Perl functionality--plus some Smalltalk and Lisp stuff. I used too much, I guess. I shouldn't have inherited $_, $&, and the other, ugly style variables.
Matz имел в виду всякого рода стилистические примочки типа $1..$9, %r{}, %w{}, //, etc.. конечно на более глубоком уровне от перла там нет ничего. с тем же успехом можно утверждать что руби от паскаля наследует.
а перл 6.. не берусь судить насколько он хорош или плох по семантике -- апокалипсы внимательно не читал (хотя нагородили они там.. ой-е..). проблема в том что у него есть один фундаментальный недостаток -- его нет, и при нашей жизни его наверное уже не будет.
"Ruby's class library is an object-oriented reorganization of Perl functionality" что на русском означает, "Ruby - это объектная реализация/реорганизация функциональности Perl".
Зная все 3 языка, я полностью согласен с автором. Несмотря на то, что Ruby имеет синтакс схожий с Python, идеологически он далек от Python и близок к Perl, TMTOWTDI. Достаточно сказать, что на Ruby можно такие же one-liners писать как и на Perl (програмки в одну строку; да и command line options у них схожи). Python намерено урезан, дабы быть TOORWTDI.
> у [perl6] есть один фундаментальный недостаток -- его нет, и при нашей жизни его наверное уже не будет
pugs можно и сегодня запускать, базисный perl6 определён и осуществлен, хоть и частично, но есть шансы, что при нашей жизни... :)
> Зная все 3 языка, я полностью согласен с автором.
зная еще и схему, я-то знаю откуда ноги растут :-)
> Ruby's class library is an object-oriented reorganization of Perl functionality
ну взял и засунул Matz практически целиком perldoc perlfunc в набор из Kernel, File, Dir, сотоварищи. именно так эту фразу и следует читать, и больше из нее решительно ничего не следует.
> pugs можно и сегодня запускать
мнээ.. вот так сильно оно мне неинтересно. хотя.. есть в районе строгофункциональных языков пробел в моем образовании. может и до хаскеля дело дойдет..
> зная еще и схему, я-то знаю откуда ноги растут :-)
И откуда же? :) Что лиспового есть в Ruby чего он не взял из Perl?
> ну взял и засунул Matz практически целиком perldoc perlfunc в набор из Kernel, File, Dir, сотоварищи. именно так эту фразу и следует читать, и больше из нее решительно ничего не следует
Подозреваю, что ты не знаешь Perl на высоком уровне, иначе бы перловый look-and-feel просто бросался бы тебе в глаза, абсолютно во всем, от синтаксиса и флагов, до функциональности, идиом и идеологии. :)
Так ведь Matz и не скрывает, прямо говорит, что ему кое-что в Perl не понравилось в 1993 и он решил его улучшить.
> И откуда же? :) Что лиспового есть в Ruby чего он не взял из Perl?
lisp != schema
по существу. самое главное свойство по которому можно классифицировать языки скриптовые -- то как хранятся переменные и как передаются параметры. я имею в виду не то как оно в синтаксисе выглядит, а то как оно с памятью общается. к примеру, в php по умолчанию все передается по значению. то есть если я сделаю func(array(1, 2, ... 100000)) функция получит не тот же экземпляр массива, а его копию. то есть func($a) {$a[0] = 'aaa';} сделает совсем не то что следовало бы ожидать человеку, который знает о строгом, в стиле схемы, разделении между контейнерными типами и иммедиатами (как блин это по русски?). правильно, в перле та же фигня -- что бы передать указатель на объект, это надо указывать специально.
в отличие от, в руби такое строгое различие есть. все что не помещается в Fixnum передается как указатель (включая Bignum). и если честно, не так уж много есть кандидатов на отцовство для руби по этому признаку.
еще: строгая динамическая типизация.
еще: first-class functions.
еще: call-ec (исключения и catch/throw)
еще: call-cc
относительно уровня знания perl-а -- нуу.. хитрозадые клозурки в перемешку с егойными объектами я как-то (давно правда) довольно плотно пользовал. :-)
а что касается поверхностного look&feel -- это, применительно к языкам дело десятое.
кстати, есть такая вещь, которая есть в перле и схеме, но отсутствует в (базисном) руби -- флюиды. так что можешь начинать утверждать что перл от схемы произошел :-)
> в перле та же фигня -- что бы передать указатель на объект, это надо указывать специально
Почему ты так решил? Вовсе даже наоборот. Всё, кроме базисных типов (string, number) передаётся как reference. Как и в Ruby.
> еще: строгая динамическая типизация
Приведи пример, что именно ты имеешь ввиду.
> еще: first-class functions
Ты имеешь ввиду: my $func = sub { $_[0] + 1 }; или что-то другое?
> исключения
die/eval :)
> можешь начинать утверждать что перл от схемы произошел
Так ведь Larry Wall и не скрывает этого, как и "man perlsyn" (хоть ты и не приравниваешь Lisp и Scheme).
Perl borrows syntax and concepts from many languages: awk, sed, C, Bourne Shell, Smalltalk, Lisp and even English. Other languages have borrowed syntax from Perl... :-)
Ну, вот эта разница как раз и не важна, мы же про объекты говорили? Ну ладно, в perl ты можешь и на оригинальное значение воздействовать и на копию, даже если это и базисные string/number.
Ты бы всё-таки уточнил, что именно я не понимаю, хотелось бы подучить, если так. :)
Просто в Perl есть понятия, не существующие в Ruby (и даже Scheme), и, мне кажется, ты путаешься в них.
Например, в Perl есть array @a и arrayref $a, а в Ruby лишь arrayref a. В Perl есть листовые и скаларные контексты выражений (почти нигде такого нет, хотя в Ruby есть некоторые приведения при инитиализации array). В Perl всё кроме undef, string и number есть reference, а в Ruby всё есть объект, хотя FixNum и исключение при работе с функциями. В функцию Perl, параметры передаются через магический @_, при присваивании через который изменяется все lvalue параметры, даже базисные. При копировании, references или объекты Perl ведут себя как объекты Ruby, нужно делать dereference, чтобы они вели себя иначе.