четверг, 6 сентября 2012 г.

Знакомство с Ruby. Первые впечатления

В последнее время в различных публикациях (обычно в Интернете) всё чаще стали мелькать названия языков программирования типа 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:
  • Отсутствие логической стройности синтаксиса. Синтаксис C, C++, Pascal – логичен, Ruby – нет. Один неправильно поставленный пробел изменяет семантику выражения – это нормально? Одну и ту же семантическую конструкцию можно написать несколькими разными способами.
  • Следствием предыдущего пункта является сложность языка. (Хотя одной из отправных точек при создании Ruby была именно простота языка.) Даже если взять вышеупомянутую книгу «Язык программирования Ruby», в ней 492 страницы. Обычно книги «Язык программирования <название_языка>» (книги начального уровня, т.е. описание языка) имеют 300, плюс минус 50 страниц среднего формата, включая оглавление, предметный указатель и описание грамматики языка в РБНФ. На моей памяти только два языка имели более объёмные описания: Ada и Prolog.
  • Избыточное количество методов для встроенных классов. Например, зачем классу Integer нужно иметь три различных итератора upto, downto и times, да еще и step, унаследованный от Numeric?
  • «Опасность» языка или, лучше сказать, незащищённость от ошибок. Про Perl кто-то из корифеев сказал, что только сумасшедший будет писать на Perl без прагмы strict и ключа –w в командной строке интерпретатора. Видимо на Ruby пишут исключительно сумасшедшие.

Впрочем, пока это только мои первые впечатления. Возможно, что при дальнейшем изучении языка я в чём-то изменю свою точку зрения.

8 комментариев:

  1. Я с таким же ощущением отложил книжку на середине и забил на руби :)
    Хотя может конечно и зря -_-

    ОтветитьУдалить
    Ответы
    1. Обязательно дочитаю. Если я Руби и не приму, то хотя бы смогу это грамотно аргументировать ))

      Удалить
  2. - Отсутствие логической стройности синтаксиса. Синтаксис C, C++, Pascal – логичен, Ruby – нет.
    Что вам мешает написать вместо x = 10 if a<0
    if (a< 0)
    x = 10

    - Один неправильно поставленный пробел изменяет семантику выражения
    Это где такое вы видели ?)

    - Обычно книги «Язык программирования » (книги начального уровня, т.е. описание языка) имеют 300 страниц.
    Бред! Вы видели к примеру хоть одну книгу по java или c++ меньше 300 страниц ?
    Да что это за книга там должна быть в которой не должно быть более 300 страниц

    - Следствием предыдущего пункта является сложность языка.
    Он очень лёгок, вы просто заблуждаетесь, иной стиль не привычный вам

    ОтветитьУдалить
    Ответы
    1. Дело не в постфиксном использовании 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 страниц. Я сказал, что чем сложнее язык, тем толще книга. И _даже_ судя по _книге_, Руби - достаточно сложный язык.

      Я писал на нескольких языках программирования и, как правило (!), основная сложность была не в изучении самого языка, а в изучении "стандартных библиотек". В случае с Руби я пока столкнулся со сложностью изучения самого языка. А там война план покажет...

      Удалить
    2. Кстати еще одно интересное наблюдение. В вышеозначенной книге по Ruby нет ни одной диаграммы в РБНФ. Интересно, а вообще грамматика Руби поддаётся такой формализации? ;)

      Удалить
  3. вам напомнить сколько страниц в "programming perl" от Уолла ?

    ОтветитьУдалить
    Ответы
    1. Книги Уолла у меня к сожалению нет. А вот книга Рэндалл Шварц, Том Кристиансен "Изучаем Perl" - 320 страниц.

      Я с этой книгой начинал работать с Perl. Потом конечно были и другие, гораздо более объёмные книги, и огромный мануал по языку и по библиотекам от ActiveState. Но это уже другой уровень.

      PS. Perl, кстати, тоже не самый лёгкий язык ))

      Удалить
    2. "Изучаем perl" и "Язык ruby" - неподходящее сравнение. Второе позиционируется как "официальное руководство".

      В camelбуке 3-го издания рус. яз. 1152 страницы, в 4-том английском оригинале. 1176

      А в "Изучаем Ruby" те же 336.


      Удалить