Про Ruby

Цікавитеся, чому Ruby такий популярний? Його прихильники називають його красивою, витонченою мовою. І водночас кажуть, що він зручний і практичний. Як це можливо?

Ідеали творця Ruby

Ruby — мова тонкого балансу. Її творець, Yukihiro “Matz” Matsumoto, поєднав елементи своїх улюблених мов (Perl, Smalltalk, Eiffel, Ada та Lisp), щоб створити нову мову, яка врівноважує функціональне програмування з імперативним.

Він часто казав, що «намагається зробити Ruby природною, а не простою» мовою, що відображає життя.

Продовжуючи цю думку, він додає:

Ruby виглядає просто, але всередині дуже складний, як і наше людське тіло1.

Про зростання Ruby

Від моменту публічного релізу в 1995 році Ruby приваблює відданих розробників у всьому світі. У 2006 році Ruby став масово визнаним: у великих містах сформувалися активні групи користувачів, а конференції, присвячені Ruby, були заповнені до межі.

Ruby-Talk — основна поштова розсилка для обговорення Ruby — у 2006 році сягала в середньому 200 повідомлень на день. У наступні роки цей показник зменшився, оскільки спільнота зростала, а обговорення переходили з одного центрального списку до багатьох менших.

Ruby входить до топ-10 більшості індексів, що вимірюють зростання та популярність мов програмування у світі (наприклад, індексу TIOBE). Значна частина зростання пов’язана з популярністю програмного забезпечення, написаного на Ruby, зокрема вебфреймворку Ruby on Rails.

Ruby також повністю вільний. Він не лише безкоштовний, а й вільний для використання, копіювання, модифікації та поширення.

Бачити все як об’єкти

Спочатку Matz шукав ідеальний синтаксис в інших мовах. Згадуючи цей пошук, він сказав: «Я хотів скриптову мову, яка була б потужнішою за Perl і більш об’єктно-орієнтованою за Python2».

У Ruby все є об’єктом. Кожному шматку інформації та коду можна надати власні властивості й дії. В об’єктно-орієнтованому програмуванні властивості називають instance variables, а дії — methods. Чистий об’єктно-орієнтований підхід Ruby зазвичай демонструють простим прикладом, де до числа застосовується дія.

5.times { print "We *love* Ruby -- it's outrageous!" }

У багатьох мовах числа та інші примітивні типи не є об’єктами. Ruby, під впливом Smalltalk, надає методи та змінні екземпляра всім типам. Це спрощує використання Ruby, адже правила для об’єктів однаково застосовуються до всього Ruby.

Гнучкість Ruby

Ruby вважають гнучкою мовою, оскільки він дозволяє користувачам вільно змінювати його частини. Важливі частини Ruby можна видаляти або перевизначати за потреби. Можна також додавати нові. Ruby намагається не обмежувати розробника.

Наприклад, додавання виконується оператором плюс (+). Але якщо ви хочете використовувати читабельне слово plus, ви можете додати такий метод до вбудованого класу Numeric.

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

y = 5.plus 6
# y тепер дорівнює 11

Оператори Ruby — це синтаксичний цукор для методів. Їх також можна перевизначати.

Блоки: справді виразна можливість

Блоки Ruby також вважають джерелом великої гнучкості. Розробник може долучити замикання до будь-якого методу, описавши, як цей метод має працювати. Таке замикання називається block і стало однією з найпопулярніших можливостей для новачків у Ruby, які переходять з інших імперативних мов, як-от PHP або Visual Basic.

Блоки натхненні функціональними мовами. Matz казав: «У замиканнях Ruby я хотів зберегти культуру 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 вони називаються Categories). Модулі — це колекції методів.

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

class MyArray
  include Enumerable
end

Загалом Rubyists вважають цей підхід набагато зрозумілішим за множинне наслідування, яке є складним і може бути надто обмежувальним.

Візуальний вигляд 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, macOS, Windows, DOS, BeOS, OS/2 тощо.

Інші реалізації Ruby

Ruby як мова має кілька різних реалізацій. На цій сторінці йдеться про референсну реалізацію, яку в спільноті часто називають MRI («Matz’s Ruby Interpreter») або CRuby (оскільки написана на C), але існують і інші. Вони часто корисні в певних ситуаціях, дають додаткову інтеграцію з іншими мовами чи середовищами, або мають спеціальні можливості, яких немає в MRI.

Ось перелік:

  • JRuby — Ruby поверх JVM (Java Virtual Machine), який використовує оптимізувальні JIT-компілятори JVM, збирачі сміття, конкурентні потоки, екосистему інструментів і величезну колекцію бібліотек.
  • Rubinius — «Ruby, написаний на Ruby». Побудований на LLVM, Rubinius має віртуальну машину, на основі якої також будуються інші мови.
  • TruffleRuby — високопродуктивна реалізація Ruby поверх GraalVM.
  • mruby — легка реалізація мови Ruby, яку можна зв’язувати та вбудовувати в застосунки. Її розвиток очолює творець Ruby Yukihiro “Matz” Matsumoto.
  • IronRuby — реалізація, «тісно інтегрована з .NET Framework».
  • MagLev — «швидка, стабільна реалізація Ruby з інтегрованою персистентністю об’єктів і розподіленим спільним кешем».
  • Cardinal — «компілятор Ruby для віртуальної машини Parrot» (Perl 6).

Для повнішого списку див. Awesome Rubies.

Посилання

1 Matz, виступ на поштовій розсилці Ruby-Talk, 12 травня 2000.

2 Matz, у інтерв’ю з творцем Ruby, 29 листопада 2001.

3 Matz, у Blocks and Closures in Ruby, 22 грудня 2003.