Статьи Новости Контакты

15.04.2008
Александр Козлов

Ruby — сверкающий рубин программирования

заметка, посвященная языку программирования Ruby

Итак, Ruby.

Что из себя представляет данный язык программирования и почему, собственно, достаточно молодой язык пользуется не меньшей популярностью, чем такие гиганты, как Python и PHP. Начнем мы с определения и истории.
Ruby (англ. – рубин) — это интерпретируемый язык высокого уровня, рассчитанный на быстрое и удобное объектно-ориентированное программирование. Язык обладает независимой от ОС реализацией многопоточности, динамической типизацией, корзиной для сбора мусора и многими другими возможностями. По особенностям синтаксиса Ruby близок к языкам Perl и Eiffel, а по методам объектно-ориентированного подхода – к Smalltalk. Также в Ruby имеется множество заимствованных черт Python, CLU, Dylan, Lisp.
Реализация интерпретатора языка является кроссплатформенной и распространяется как Open Source Software.

Ruby был создан как истинно объектно-ориентированный язык программирования
Создатель языка Ruby – японец Юкихиро Мацумото (также известный как Matz), родился 14 апреля 1965 года. Еще будучи студентом, он интересовался языками программирования, однако идея о создании собственного языка пришла к нему гораздо позже – Ruby начал разрабатываться в 1993 году, а вышел в свет два года спустя.
Основной целью разработки Мацумото было создание, как он сам говорит, «настоящего объектно-ориентированного» интерпретируемого языка программирования, который, кроме всего прочего, был бы легким в разработке. Прошло несколько месяцев, прежде чем интерпретатор заработал, и в декабре 1995 года Ruby 0.95 был опубликован в японских новостных группах, что можно официально считать датой рождения этого популярного ныне языка программирования.
Однако отсутствие документации на каком-либо другом языке, кроме японского, сдерживало дальнейшее развитие языка. И только в 1997 году появилось описание Ruby на английском, а в 1998 открылся форум Ruby-Talk, что дало старт развитию языка во всем мире. Сейчас Ruby входит в практически все дистрибутивы GNU/Linux, однако доступен пользователям и других операционных систем.

Прежде чем я перейду к достаточно скромному перечню причин, по которым стоит посмотреть на Ruby с интересом, стоит сказать еще пару слов о философии, неотъемлемым атрибуте японской культуры.
Основное назначение Ruby – это создание простых, но в то же время эффективных и понятных программ, где важна не скорость ее работы, а малое время разработки и простота синтаксиса. Ruby следует принципу «наименьшей неожиданности» — т. е. программа ведет себя так, как ожидает работающий с ней программист. Однако это не значит, что знакомство с языком не вызывает удивление – скорее, наоборот. Но при основательном изучении языка он ведет себя так, как от него этого ожидают.
Ruby и Perl схожи в том, что предоставляют программисту несколько возможностей достижения одного и того же результата – свобода выбора. Также одной из основных целей разработки было освобождение программиста от рутинной работы, которую, по идее, должен выполнять компьютер (и он делает это быстрее и качественнее). Особое внимание уделялось таким рутинным занятиям, как обработка текстов, администрирование, и для выполнения этих задач Ruby настроен очень хорошо.
Как уже говорилось, Ruby отличается от большинства языков программирования. В противовес машинно-ориентированным языкам, работающим быстро, целью создания Ruby была разработка среды, максимально дружественной и близкой к человеку. Язык позволяет максимально быстро и просто, для человека, выполнить задачу, пусть это и требует дополнительного времени работы компьютера.

Говорят, что Ruby вырабатывает эффект плацебо — он работает так, как вы этого хотите
Исторический и философический экскурс закончен, перейдем к примерам работы языка, исследованию его возможностей, делающих Ruby легким для изучения и простым для работы. Ruby включает в себя множество полезных инструментов, заимствованных из других языков программирования.

Исключения – Ruby поставляется с блоками try/catch (или begin/rescue) и набором предопределенных, расширяемых исключений для удобной, простой и правильной обработки ошибок.
Пространства имен – то, что должно понравиться энтузиастам C++ и Java. Модули Ruby позволяют использовать пространство имен легко и непринужденно.
Встроенные регулярные выражения, для использования которых используется оператор “ =~”, подобно “/ /” в языке Perl.
Перезагрузка операторов – Ruby позволяет определять операторы типа +, -, > и многие другие для любого класса.
Пакеты Ruby, иначе называемые Gems (драгоценные камни), поддерживают зависимости, могут быть как кросс-платформенными, так и платформо-зависимыми.
Интерактивная консоль, подобно консоли языка Python, может использоваться для интерактивного тестирования кода.

Ruby очень нежен в своем подходе к программисту, язык не пытается использовать вас, а делает все возможное для упрощения его использования вами. Читабельность кода и понимание синтаксиса – это одно из неоспоримых достоинств данного языка.
Ruby позволяет равноценно использовать операторы if и unless в условных выражениях, однако использование unless приводит к меньшему числу ошибок. Кроме того, можно использовать операторы и в качестве условных модификаторов, ставя их после выражения: order.new unless order.exists
. Задать коду вопрос или прикрикнуть на него тоже возможно. Вопросительный и восклицательный знаки помогают понять суть метода: "?" используется, когда метод возвращает true или false, а знак "!" используется для необратимых методов наподобие удаления записи из базы данных, отщепления последнего символа строки и т. д.
Псевдонимы (alias) могут использоваться для уже созданных методов – таким образом, можно получить exist и exists без повторений.
В Ruby можно использовать директивы attr_reader, attr_writer, attr_accessor при автоматическом создании getter/setteer для членов класса.
Константы, классы и модули Ruby пишутся с заглавной буквы, методы и члены класса – с маленькой, глобальные переменные начинаются со знака $, имена переменных объекта – с @, а имена переменных класса — с @@, все это просто для понимания и легко запоминается.
При вызове методов совершенно не обязательно писать скобки, достаточно write File.open (“/home/user/test.txt”) или еще более простого File.open “/home/user/text.txt”. Это очень удобно при работе с методами без аргументов.
Нет необходимости использовать точку с запятой – если вы хотите написать следующую инструкцию, просто перейдите на новую строку. Enter — и готово. Как и в Python, новая линия разделяет инструкции.

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

“YOU SHOULDN’T ALWAYS USE CAPITALS”.lowcase #, что даст вам “you shouldn’t always use capitals”

Это экономнее, проще и, в конце концов, логичнее, чем нечто вроде:

# PHP Code
strtolower(“YOU SHOULDN’T ALWAYS USE CAPITALS”)

В Ruby все имеет значение – больше не нужно использовать return для возврата значений. Все инструкции возвращают значение, даже присваивание переменных, поэтому не нужно использовать ключевое слово return в конце методов. Значение последнего присваивания всегда будет возвращено.
Представьте себе стандартную ситуацию: вы стали использовать системный класс или класс, написанный другим человеком, и вдруг осознали, что вам необходим дополнительный метод. В других языках программирования у вас есть несколько путей решения этой проблемы.

1. Вы изменяете исходный код класса, если у вас есть к нему доступ. Это плохая идея.
 2. Вы наследуете свой класс от того и добавляете к нему метод. Это хорошая идея, но стоит ли того из-за одного метода? Кроме того, придется править другой свой код в соответствии.
 3. Можно создать метод и вне класса. Это работает, но не изящно и идет вразрез с объектно-ориентированным программированием.

Ruby позаимствовал все самое вкусное из Python, C, Lisp других языков программирования
Ruby позволяет добавить метод в оригинальный класс без правки исходника. Даже для системного класса.
К примеру, мы хотим добавить метод для пересчета значений из метров в футы. Расширяем класс как Numeric, как показано в коде ниже:

class Numeric
def feet
self*3.2808399
end
end

С этого момента все числа будут иметь новый метод, который используется, как и любой другой:
 5.feet # возвратит 16.4041955M
Классы в Ruby никогда не закрываются и могут быть расширены в любой момент.

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

regexp: !ruby/regexp /a-zA-Z/
number: 4.
string: a string

Проще, не правда ли? Добро пожаловать в мир YAML, любимый, но далеко не единственный язык разметки Ruby, с помощью которого любой объект представлен в простом, но полном виде.
Хотя Ruby и способен работать с XML, простота YAML подкупила многих разработчиков, перешедших на него для, например, файлов конфигурации. Фрагмент, написанный выше, был получен исполнением кода:

{“string” => “a string”, “number” => 4.7, “regexp” => /a-zA-Z/}.to_yaml

Метод to_yaml определен для класса Object, который является прародителем всех остальных объектов, а потому доступен для всех объектов Ruby. Это позволяет преобразовывать любые объекты в YAML и обратно.

Из Lisp и Perl наш Ruby заимствовал объекты и блоки Proc. Proc – это блок кода, цитирую, «связанный с набором локальных переменных. Однажды связанные, они могут вызываться в различных контекстах и все еще обращаться к тем переменным». Взгляните:

def gen_times (factor)
return Proc.new {|n| n*factor }
end

times3 = gen_times (3)
times5 = gen_times (5)

times3.call (12) #=> 36
times5.call (5) #=> 25
times3.call (times5.call(4)) #=> 60


Это знакомо людям, работающим на Perl, Python или Lisp. Это можно сделать даже на PHP. Но кроме того, в Ruby используются блоки типа "несозданные Proc", например для итерации по содержимому объекта и исполнения некоторого кода, подобно методу each, доступному для класса Array: [1, 2, 4, 6, 8].each {|c| puts c*2} #=>, что возвратит каждый элемент, умноженный на 2.

Однако, кроме огромного количества перечисленных «вкусностей» языка, есть и неоспоримые минусы:
 — уже упомянутая невысокая скорость работы программ, написанных на Ruby, что является естественной расплатой за простое написание сложных программ;
 — отсутствие поддержки потоков операционной системы (однако для Unix/Linux-систем есть поддержка процессов ОС);
 — отсутствие компиляции в байткод. Есть возможность компилирования Ruby в Java (с помощью JRuby) и .NET в байткод (используя Ruby.NET). Однако в версию 2.0 будет включена виртуальная машина YARV, компилирующая код в байткод и существенно ускоряющая исполнение.

Рубисты очень любят фразу Альберта Эйнштейна: Everything should be made as simmple as pissoble, but not simpler
И последнее по счету, но далеко не по важности. Вы всегда можете использовать фреймворк Ruby on Rails, написанный на Ruby, для использования веб-приложений. Возможно, это будет сложнее, чем на PHP, однако Rails были написаны на Ruby не просто так. Подробнее об этом в статье, всецело посвященной Ruby on Rails.



Скоро на сайте

  • Wordpress

    Серия статей о плагинах к движку WordPrress
  • AJAX

    Проекты и продукты, ориентированные на AJAX
  • Новые сервисы Google

    Обзор новых сервисов Google
 

Copyright © 2003—2018 Все права защищены

При использовании материалов сайта ссылка на hostinfo.ru обязательна

  • хостинг от .masterhost
  • Rambler's Top100