О Ruby

Удивляетесь, почему Ruby так популярен? Его поклонники называют его красивым, искусным языком. И в то же время они говорят, что он удобный и практичный. Что же перевешивает?

Идеалы создателя Ruby

Ruby – это тщательно сбалансированный язык. Его создатель Юкихиро Мацумото (так же известный как “Matz”), объединил части его любимых языков (Perl, Smalltalk, Eiffel, Ada и Lisp) чтобы сформировать новый язык, в котором парадигма функционального программирования сбалансирована принципами императивного программирования.

Он часто повторял, что он “пытается сделать Ruby естественным, но не простым” языком, который отражает жизнь.

Основываясь на этом, он добавляет:

Ruby прост на вид, но очень сложен внутри, подобно человеческому телу1.

Рост популярности Ruby

Со времени выпуска публичной версии в 1995 году, Ruby привлек внимание программистов со всего мира. В 2006 году Ruby завоевал массовое признание. В крупнейших городах по всему миру активно действуют группы пользователей Ruby, а конференции, посвященные Ruby, заполнены до предела.

Graph courtesy of
Gmane.

Ruby-Talk, основная рассылка для обсуждения языка Ruby, содержала в среднем 200 сообщений ежедневно в 2006 году. В последние годы это количество уменьшилось, так как сообщество стало использовать несколько тематических рассылок вместо одной общей.

Индекс TIOBE, который измеряет рост популярности языков программирования, помещает Ruby на 9 место среди общепризнанных языков программирования. Во многом, рост популярности языка приписывается популярности программного обеспечения, написанного на Ruby, в особенности – Ruby on Rails, среде разработки веб-приложений.

Ruby также абсолютно открыт. Открыт для бесплатного использования, изменений, копирования и распространения.

Всё в Ruby – объекты.

Вначале Matz рассматривал другие языки в поисках идеального синтаксиса. Вспоминая свои изыскания, он говорил: “Мне нужен был скриптовый язык, который был бы более мощным, чем Perl, и более объектно-ориентированным, чем Python.”2.”

В Ruby всё – объект. Для каждой частицы информации или кода могут быть определены собственные свойства и действия. В объектно-ориентированном программировании свойства называются переменными объекта, а действия – методами. Чистейший объектно-ориентированный подход Ruby может быть продемонстрирован парой строк кода, в которых производится действие над числом.

5.times { print "Мы любим Ruby! Ruby – это замечательно!" }

Во многих языках числа и другие примитивные типы данных не являются объектами. Ruby под влиянием языка Smalltalk позволяет задать методы и переменные объекта всем типам данных. Это упрощает использование Ruby, так как правила применимые к объектам – применимы ко всему Ruby.

Гибкость Ruby

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

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

class Numeric
  def plus(x)
    self.+(x)
  end
end

y = 5.plus 6
# y теперь равно 11

Операторы в Ruby – синтаксический сахар для методов. Вы также можете переопределить их.

Блоки, по-настоящему выразительная конструкция

Блоки в Ruby также являются отличным источником гибкости. Программист может добавить замыкание к любому методу, описывая, как этот метод должен действовать. Замыкание называется блок и является одной из наиболее популярных конструкций для пришедших в мир Ruby из мира императивных языков программирования, таких как PHP или Visual Basic.

Создание блоков было вдохновлено функциональными языками программирования. Matz говорил, “замыканиями в руби я хотел отдать дань уважения культуре языка Lisp3.”

search_engines =
  %w[Google Yahoo MSN].map do |engine|
    "http://www." + engine.downcase + ".com"
  end

В коде выше блок описан внутри конструкции do ... end. Метод map применяет блок кода к представленному списку слов. Многие другие методы в Ruby оставляют путь, открытый для программиста, чтобы тот написал собственный блок кода, детально говорящий методу, что тот должен сделать.

Ruby и примеси

В отличие от многих объектно-ориентированных языков, Ruby намеренно предоставляет лишь одиночное наследование. Но Ruby также предоставляет концепцию модулей (называемых Категориями в Objective-C). Модули – это коллекции методов.

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

class MyArray
  include Enumerable
end

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

Визуальное представление Ruby

Так как в Ruby зачастую пунктуация встречается довольно редко и обычно используются английские слова в качестве ключевых, некоторые знаки препинания используются для украшения Ruby. Ruby не нуждается в объявлении переменных. В нем используются простые конвенции именования, для того чтобы разделить области видимости переменных.

  • var может быть локальной переменной.
  • @var переменная объекта.
  • $var глобальная переменная.

Данная символика повышает читабельность, позволяя программисту легко идентифицировать роль каждой переменной. Это также позволяет не использовать утомительное self. для каждого объекта.

Помимо основ

Ruby полон другими особенностями и конструкциями, и вот некоторые из них:

  • В Ruby есть конструкции для обработки исключений, как в Java или Python, которые позволяют проще работать с ошибками.

  • В Ruby представлен настоящий mark-and-sweep (пометь и отчисти) сборщик мусора для всех Ruby объектов. Не нужно вручную отслеживать количество ссылок в сторонних библиотеках. Как говорит Matz, “Это полезней для вашего здоровья.”

  • Писать расширения на C в Ruby проще чем в Perl или Python при помощи очень элегантного API для вызова Ruby из C. Он включает в себя вызовы для встраивания Ruby в программное обеспечение, чтобы использовать его как скриптовый язык. Также доступен интерфейс SWIG.

  • Ruby может подгружать сторонние библиотеки динамически, если позволяет операционная система.

  • В Ruby реализованы независимые от операционной системы потоки. Таким образом, на любых платформах, где вы запускаете Ruby, вы также имеете возможность использовать многопоточность, не зависимо от того, поддерживает ли данная система потоки или нет. Вы можете использовать возможности многопоточности даже в MS-DOS!

  • Ruby отличается высокой переносимостью: он был разработан большей частью на GNU/Linux, но работает на многих типах UNIX, Mac OS X, Windows, DOS, BeOS, OS/2, и так далее.

Другие имплементации Ruby

Ruby как язык имеет несколько разных имплементаций. Данный сайт посвящен имплементации MRI (“Matz’s Ruby Interpreter” – Ruby интерпретатор Матца) или CRuby, но также существует несколько других. Они бывают очень полезны в различных ситуациях, предоставляют большую интеграцию с другими языками или окружениями, или имеют возможности, которых нет в MRI.

Список имплементаций:

  • JRuby это Ruby реализованный на JVM (Java Virtual Machine), использует оптимизированный JIT компилятор, сборщик мусора, нативные потоки, инструментальную экосистему и огромное количество библиотек JVM.
  • Rubinius это “Ruby написанный на Ruby”. Реализован на основе LLVM – изящной виртуальной машине, на который созданы и другие известные языки.
  • MacRuby это Ruby, который тесно интегрирован с библиотеками Cocoa от Apple для Mac OS X. Позволяет вам проще писать приложения для Mac OS X.
  • mruby это легковесная реализация Ruby, которая может быть слинкована и встроена в приложение. Возглавляет разработку mruby создатель языка Ruby, Yukihiro “Matz” Matsumoto.
  • IronRuby это имплементация “тесно интегрированная с .NET Framework”.
  • MagLev это “быстрая, стабильная имплементация Ruby с интегрированным постоянством объектов и распределенным открытым кешем”.
  • Cardinal это “компилятор Ruby для виртуальной машины Parrot” (Perl 6).

Ссылки

1 Matz, сообщение в списке рассылок Ruby-Talk, 12 мая 2000 года.

2 Matz, в Интервью с Создателем Ruby, 29 ноября 2001 года.

3 Matz, в Блоки и Замыкания в Ruby, 22 декабря 2003 года.