В последнее время в различных публикациях (обычно в Интернете) всё чаще стали мелькать названия языков программирования типа Haskell, Lua, Python, Erlang, Ruby и пр. Естественно мне захотелось посмотреть в каком направлении идёт развитие, и что ожидает программирование в ближайшем будущем.
Я остановился на Ruby. Выбор был сделан достаточно случайно, основываясь на характеристике из Википедии. Цитирую:
…динамический, рефлективный, интерпретируемый высокоуровневый язык программирования для быстрого и удобного объектно-ориентированного программирования. Язык обладает независимой от операционной системы реализацией многопоточности, строгой динамической типизацией, сборщиком мусора и многими другими возможностями. Ruby близок по особенностям синтаксиса к языкам Perl и Eiffel, по объектно-ориентированному подходу — к Smalltalk. Также некоторые черты языка взяты из Python, Lisp, Dylan и CLU.
Привлекло, что это язык, ориентированный на ООП, близок к Perl (который я неплохо знаю), а также, что он «некоторыми чертами» пересекается с тем же Питоном. И вообще, судя по статье, очень интересный язык.
Установочный пакет (Ruby ver. 1.9.3 под Windows) был взят с официального сайта Ruby, а в качестве основного путеводителя я выбрал книгу Д.Флэнаган, Ю.Мацумото «Язык программирования Ruby», поскольку лучше, чем автор, про язык всё равно никто не расскажет. Установка прошла без проблем, и я начал осваивать новый для себя язык.
Самое первое впечатление (или ожидание?) от языка, что это Perl с нормально организованным ООП: т.е. с системой классов, наследованием, инкапсуляцией и пр. Отсутствие нормального ООП мне всегда досаждало в Perl. Однако в последствии оказалось, что Ruby – это скорее нечто среднее между Perl и JavaScript с примесью ООП в духе C++. Что вроде бы и неплохо.
Второе ожидание было навеяно цитатой из письма Мацумото (из статьи в Википедии): «Я знал Perl (Perl4, а не Perl5), но он мне не нравился — был в нём некий привкус игрушечного языка (да и поныне есть)». Из этого я сделал вывод, что Ruby по сравнению с Perl, должен быть логически более стройным и более строгим. Пока это ожидание, мягко говоря, не оправдалось.
У меня сложилось впечатление, что Ruby не проектировался, как например Pascal или Modula. За основу был явно взят Perl, а потом разработка языка шла примерно так: это мне не нравится – выкинем, а вот такая штука мне нравится – вставим. Т.е. в итоге получился некий салат из различных концепций и возможностей, в котором «привкус игрушечного языка» чувствуется гораздо сильнее, чем в Perl.
Что мне сильно не понравилось в Ruby:
Впрочем, пока это только мои первые впечатления. Возможно, что при дальнейшем изучении языка я в чём-то изменю свою точку зрения.
Я остановился на Ruby. Выбор был сделан достаточно случайно, основываясь на характеристике из Википедии. Цитирую:
…динамический, рефлективный, интерпретируемый высокоуровневый язык программирования для быстрого и удобного объектно-ориентированного программирования. Язык обладает независимой от операционной системы реализацией многопоточности, строгой динамической типизацией, сборщиком мусора и многими другими возможностями. Ruby близок по особенностям синтаксиса к языкам Perl и Eiffel, по объектно-ориентированному подходу — к Smalltalk. Также некоторые черты языка взяты из Python, Lisp, Dylan и CLU.
Привлекло, что это язык, ориентированный на ООП, близок к Perl (который я неплохо знаю), а также, что он «некоторыми чертами» пересекается с тем же Питоном. И вообще, судя по статье, очень интересный язык.
Установочный пакет (Ruby ver. 1.9.3 под Windows) был взят с официального сайта Ruby, а в качестве основного путеводителя я выбрал книгу Д.Флэнаган, Ю.Мацумото «Язык программирования Ruby», поскольку лучше, чем автор, про язык всё равно никто не расскажет. Установка прошла без проблем, и я начал осваивать новый для себя язык.
Самое первое впечатление (или ожидание?) от языка, что это Perl с нормально организованным ООП: т.е. с системой классов, наследованием, инкапсуляцией и пр. Отсутствие нормального ООП мне всегда досаждало в Perl. Однако в последствии оказалось, что Ruby – это скорее нечто среднее между Perl и JavaScript с примесью ООП в духе C++. Что вроде бы и неплохо.
Второе ожидание было навеяно цитатой из письма Мацумото (из статьи в Википедии): «Я знал Perl (Perl4, а не Perl5), но он мне не нравился — был в нём некий привкус игрушечного языка (да и поныне есть)». Из этого я сделал вывод, что Ruby по сравнению с Perl, должен быть логически более стройным и более строгим. Пока это ожидание, мягко говоря, не оправдалось.
У меня сложилось впечатление, что Ruby не проектировался, как например Pascal или Modula. За основу был явно взят Perl, а потом разработка языка шла примерно так: это мне не нравится – выкинем, а вот такая штука мне нравится – вставим. Т.е. в итоге получился некий салат из различных концепций и возможностей, в котором «привкус игрушечного языка» чувствуется гораздо сильнее, чем в Perl.
Что мне сильно не понравилось в Ruby:
- Отсутствие логической стройности синтаксиса. Синтаксис C, C++, Pascal – логичен, Ruby – нет. Один неправильно поставленный пробел изменяет семантику выражения – это нормально? Одну и ту же семантическую конструкцию можно написать несколькими разными способами.
- Следствием предыдущего пункта является сложность языка. (Хотя одной из отправных точек при создании Ruby была именно простота языка.) Даже если взять вышеупомянутую книгу «Язык программирования Ruby», в ней 492 страницы. Обычно книги «Язык программирования <название_языка>» (книги начального уровня, т.е. описание языка) имеют 300, плюс минус 50 страниц среднего формата, включая оглавление, предметный указатель и описание грамматики языка в РБНФ. На моей памяти только два языка имели более объёмные описания: Ada и Prolog.
- Избыточное количество методов для встроенных классов. Например, зачем классу Integer нужно иметь три различных итератора upto, downto и times, да еще и step, унаследованный от Numeric?
- «Опасность» языка или, лучше сказать, незащищённость от ошибок. Про Perl кто-то из корифеев сказал, что только сумасшедший будет писать на Perl без прагмы strict и ключа –w в командной строке интерпретатора. Видимо на Ruby пишут исключительно сумасшедшие.
Я с таким же ощущением отложил книжку на середине и забил на руби :)
ОтветитьУдалитьХотя может конечно и зря -_-
Обязательно дочитаю. Если я Руби и не приму, то хотя бы смогу это грамотно аргументировать ))
Удалить- Отсутствие логической стройности синтаксиса. Синтаксис C, C++, Pascal – логичен, Ruby – нет.
ОтветитьУдалитьЧто вам мешает написать вместо x = 10 if a<0
if (a< 0)
x = 10
- Один неправильно поставленный пробел изменяет семантику выражения
Это где такое вы видели ?)
- Обычно книги «Язык программирования » (книги начального уровня, т.е. описание языка) имеют 300 страниц.
Бред! Вы видели к примеру хоть одну книгу по java или c++ меньше 300 страниц ?
Да что это за книга там должна быть в которой не должно быть более 300 страниц
- Следствием предыдущего пункта является сложность языка.
Он очень лёгок, вы просто заблуждаетесь, иной стиль не привычный вам
Дело не в постфиксном использовании if. К этому, кстати, я отношусь спокойно. Мне не понравилась "неряшливость" синтаксиса. Например, при вызове итератора с блоком, блок может быть оформлен либо с помощью begin...end, либо с помощью {...}. Зачем такое разнообразие? И далее пометка: "_по соглашению_ однострочные блоки...". Вот это "по соглашению" встречается достаточно часто, т.е. одно и то же можно написать по разному, да ещё с учётом неких соглашений, не являющихся частью языка. К этому же: опциональные (), причём иногда они обязательны!;опциональный then в if; опциональный do в for, while, until; циклы begin ... end until ... и ( ... ) until ... - это вообще песня. Вообще в _синтаксисе_ слишком много "особых случаев использования". Этого, в идеале, не должно быть вообще.
УдалитьИз всего этого следует сложность изучения языка. Надо помнить слишком много всяких оговорок и исключений.
О пробелах. FAQ по Ruby: "a +b выдает ошибку!" http://ruby.inuse.ru/content/b-vydaet-oshibku
Про книги. У меня достаточно большая библиотека книг по языкам программирования. Я эти 300 +/-50 страниц не с потолка взял. У меня книга Стауструпа по С++ маленького формата - страниц на 450, т.е. на средний формат будет как раз 300-350. Вот с java вы меня уели, забыл я про эту книку - она на 700 с лишним тянет. Perl "Lama book" - 320. Виртовские Pascal и Modula - примерно в том же объёме.
Потом я не говорил, что в книге _должно_ быть меньше 300 страниц. Я сказал, что чем сложнее язык, тем толще книга. И _даже_ судя по _книге_, Руби - достаточно сложный язык.
Я писал на нескольких языках программирования и, как правило (!), основная сложность была не в изучении самого языка, а в изучении "стандартных библиотек". В случае с Руби я пока столкнулся со сложностью изучения самого языка. А там война план покажет...
Кстати еще одно интересное наблюдение. В вышеозначенной книге по Ruby нет ни одной диаграммы в РБНФ. Интересно, а вообще грамматика Руби поддаётся такой формализации? ;)
Удалитьвам напомнить сколько страниц в "programming perl" от Уолла ?
ОтветитьУдалитьКниги Уолла у меня к сожалению нет. А вот книга Рэндалл Шварц, Том Кристиансен "Изучаем Perl" - 320 страниц.
УдалитьЯ с этой книгой начинал работать с Perl. Потом конечно были и другие, гораздо более объёмные книги, и огромный мануал по языку и по библиотекам от ActiveState. Но это уже другой уровень.
PS. Perl, кстати, тоже не самый лёгкий язык ))
"Изучаем perl" и "Язык ruby" - неподходящее сравнение. Второе позиционируется как "официальное руководство".
УдалитьВ camelбуке 3-го издания рус. яз. 1152 страницы, в 4-том английском оригинале. 1176
А в "Изучаем Ruby" те же 336.