Ruby
Материал из Википедии — свободной энциклопедии
| Семантика: | мультипарадигменный |
|---|---|
| Класс языка: | {{{paradigm}}} |
| Тип исполнения: | интерпретатор |
| Появился в: | 1995 г. |
| Автор(ы): | Юкихиро Мацумото |
| Последняя версия: | {{{latest_release_version}}} |
| Тестовая версия: | {{{latest_test_version}}} |
| Типизация данных: | строгая, динамическая |
| Основные реализации: | Ruby, JRuby, IronRuby, Rubinius, YARV |
| Диалекты: | отсутствуют |
| Создан под влиянием: | Smalltalk, Лисп, Перл, Эйфель, Ада, Dylan, Python, CLU, C++ |
| Оказал влияние на: | Groovy, Amber |
Ruby (англ. «Рубин», читается ['ɹu:bɪ]) — интерпретируемый язык высокого уровня для быстрого и удобного объектно-ориентированного программирования. Язык обладает независимой от операционной системы реализацией многопоточности, строгой динамической типизацией, «сборщиком мусора» и многими другими возможностями. Ruby близок по особенностям синтаксиса к языкам Перл и Эйфель, по объектно-ориентированному подходу к Smalltalk. Также некоторые черты языка взяты из Python, Лисп, Dylan и CLU.
Кроссплатформенная реализация интерпретатора языка является полностью свободной[1]. Последней является версия 1.9.0, вышедшая 25 декабря 2007.
Содержание |
[править] История создания и развития
Создатель Ruby — Юкихиро Мацумото (Matz) — интересовался языками программирования ещё будучи студентом, но идея о разработке нового языка появилась позже. Ruby начал разрабатываться 24 февраля 1993 года и вышел в свет в 1995 году. Название навеяно языком Перл, многие особенности синтаксиса и семантики из которого заимствовано в Ruby: англ. pearl — «жемчужина», англ. ruby — «рубин».
Целью разработки было создание «настоящего объектно-ориентированного», лёгкого в разработке, интерпретируемого языка программирования. Из письма автора[2]:
Ruby родился 23 февраля 1993 года. В тот день я беседовал со своим коллегой о возможности существования объектно-ориентированного сценарного языка. Я знал Перл (Perl4, а не Perl5), но он мне не нравился — был в нем некий привкус игрушечного языка (да и поныне есть). А объектно-ориентированный интерпретируемый язык казался многообещающим. В то время я знал Пайтон. Но он мне не нравился потому, что я не считал его настоящим объектно-ориентированным языком. Его OO свойства казались надстройкой над языком. Мне, как языковому маньяку и фанату объектно-ориентированного программирования с пятнадцатилетним стажем, очень, очень хотелось, чтобы был истинно объектно-ориентированный, простой в использовании язык. Я пытался найти такой язык, но его не было.
Тогда я решил его создать. Прошло несколько месяцев, прежде чем интерпретатор заработал. Я добавил в мой язык то, что мне хотелось — итераторы, обработку исключений, автоматическую сборку мусора. Затем я переорганизовал свойства Перла и реализовал их как библиотеку классов. В декабре 1995 года я опубликовал Ruby 0.95 в японских новостных группах. С тех пор появились сайты, списки рассылок. В списках рассылок идут жаркие обсуждения. Самый старый, ruby-list, сейчас содержит 14789 писем.
В Японии Ruby стал популярным с момента появления первой общедоступной версии в 1995 году, однако наличие документации только на японском языке сдерживало его дальнейшее распространение. Лишь в 1997 году появилось описание Ruby на английском языке, а в 1998 году открылся форум «ruby-talk». Это положило начало росту известности языка в остальном мире. Издано несколько книг на различных языках, в том числе на русском. Сейчас Ruby входит в большинство дистрибутивов ОС GNU/Linux, доступен пользователям других операционных систем.
[править] Философия
Мацумото, фанат объектно-ориентированного программирования, мечтал о языке, более мощном, чем Перл, и более объектно-ориентированном, чем Python. Основное назначение Ruby — создание простых и в то же время понятных программ, где важна не скорость работы программы, а малое время разработки, понятность и простота синтаксиса.
Язык следует принципу «наименьшей неожиданности»: программа должна вести себя так, как ожидает программист. Однако, в контексте Ruby это означает наименьшее удивление не при знакомстве с языком, а при его основательном изучении. Сам Мацумото утверждает, что целью разработки была минимизация неожиданностей при программировании для него, но после распространения языка он с удивлением узнал, что мышление программистов похоже и для многих их принцип «наименьшей неожиданности» совпал с его принципом.
Ruby также унаследовал идеологию языка программирования Перл в части предоставления программисту возможностей достижения одного и того же результата несколькими различными способами. Люди различны, и им для свободы необходима возможность выбирать. «Я предпочитаю обеспечить много путей, если это возможно, но поощрять или вести пользователей, чтобы выбрать лучший путь, если это возможно»[3].
Одной из основных целей разработки было освобождение программистов от рутинной работы, которую компьютер может выполнять быстрее и качественнее. Особое внимание, в частности, уделялось будничным рутинным занятиям (обработка текстов, администрирование), и для них язык настроен особенно хорошо.
В противовес машинно-ориентированным языкам, работающим быстрее, целью этой разработки был язык, наиболее близкий к человеку. Любая работа с компьютером выполняется людьми и для людей, и необходимо заботиться в первую очередь о затрачиваемых усилиях людей. Язык позволяет максимально быстро и просто для человека выполнить задачу, хотя, возможно, это и потребует дополнительного времени работы компьютера.
Принципы программирования и дизайна языка иногда выделяются в термин «Путь Руби» (англ. Ruby Way). Хэл Фултон выделяет[4] такие принципы, как «просто, но не слишком просто», «принцип наименьшего удивления», вторичность скорости работы программы, динамичность, простые строгие правила, выполнение которых не доходит до педантизма, потребность создавать полезные и красивые программы как причина программирования. В целом они не имеют точной формулировки и иногда этот термин используется для критики[5].
[править] Семантика
Ruby — полностью объектно-ориентированный язык. В нём все данные являются объектами, в отличие от многих других языков, где существуют примитивные типы. Каждая функция — метод.
Переменные Ruby содержат не сами объекты, а ссылки на них. Присваивание — это не передача значения, а копирование ссылки на объект. Для программиста, привычного к распространённым гибридным языкам программирования, некоторые эффекты такого решения могут показаться неожиданными. Например:
a = "abcdefg" => "abcdefg" b = a => "abcdefg" b => "abcdefg" a[3] = 'R' => "R" b => "abcRefg"
то есть при изменении значения переменной a неявно изменилось и значение b, так как они содержат ссылку на один объект. С другой стороны, это более логично, чем ситуация, когда для переменных разных типов присваивание действует по-разному (как, например, в Object Pascal).
Ruby не поддерживает множественное наследование, но вместо него есть мощный механизм примесей. Все классы (напрямую или через другие классы) выведены из класса , следовательно, любой объект может использовать определённые в нем методы (например, , , ). Процедурный стиль также поддерживается, но все глобальные процедуры неявно являются закрытыми методами класса Object.
Ruby является мультипарадигменным языком: он поддерживает процедурный стиль (определение функций и переменных вне классов), объектно-ориентированный (всё — объект), функциональный (анонимные функции, замыкания, возврат значения всеми инструкциями, возврат функцией последнего вычисленного значения). Он поддерживает отражение, метапрограммирование, информацию о типах переменных на стадии выполнения.
[править] Возможности Ruby
- Имеет лаконичный и простой синтаксис, частично разработанный под влиянием Ада, Эйфель, Python.
- Позволяет обрабатывать исключения в стиле Java и Python.
- Позволяет переопределять операторы, которые на самом деле являются методами.
- Полностью объектно-ориентированный язык программирования. Все данные в Ruby являются объектами в понимании Smalltalk. Единственное исключение — управляющие конструкции, которые в Ruby в отличие от Smalltalk не являются объектами. Например, число «1» — это экземпляр класса . Также поддерживается добавление методов в класс и даже в конкретный экземпляр во время выполнения программы.
- Не поддерживает множественное наследование, но вместо него может использоваться концепция «примесей», основанная в данном языке на механизме модулей.
- Содержит автоматический сборщик мусора. Он работает для всех объектов Ruby, в том числе для внешних библиотек.
- Создавать расширения для Ruby на Си очень просто частично из-за сборщика мусора, частично из-за несложного и удобного API.
- Поддерживает замыкания с полной привязкой к переменным.
- Поддерживает блоки кода (код заключается в
{…}илиdo…end). Блоки могут использоваться в методах или преобразовываться в замыкания. - Целые переменные в Ruby автоматически конвертируются между типами (32-разрядные) и (больше 32 разрядов) в зависимости от их значения, что позволяет производить целочисленные математические расчёты с бесконечной точностью.
- Не требует предварительного объявления переменных, но для интерпретатора желательно, чтобы переменным присваивалось пустое значение nil (тогда интерпретатор знает, что идентификатор обозначает переменную, а не имя метода). Язык использует простые соглашения для обозначения области видимости. Пример: просто
var— локальная переменная,@var— переменная экземпляра (член или поле объекта класса),@@var— переменная класса,$var— глобальная переменная. - В Ruby непосредственно в языке реализованы многие шаблоны проектирования, так, например, «одиночка» (singleton) может быть (хотя и не обязан) реализован добавлением необходимых методов к одному конкретному объекту (см. ниже).
- Может динамически загружать расширения, если это позволяет операционная система.
- Имеет независимую от ОС поддержку невытесняющей многопоточности.
- Перенесён на множество платформ. Он разрабатывался на GNU/Linux, но работает на многих версиях Unix, DOS, Microsoft Windows (в частности, Win32), Mac OS, BeOS, OS/2 и т. д.
[править] Примеры
В Ruby есть немало оригинальных решений, редко или вообще не встречающихся в распространённых языках программирования. Можно добавлять методы не только в любые классы, но и в любые объекты. Например, вы можете добавить к некоторой строке произвольный метод.
# всё: от символа # и до конца строки — комментарий
# = является оператором присваивания,
# символы в «"» - строка, которой можно манипулировать средствами языка
str = "Привет" # здесь создаётся переменная str, типа [[строковый тип|String]]
# def - ключевое слово для объявления функции
def str.bye # str. указывает, кому принадлежит метод (по умолчанию Object)
# bye - имя метода, за ним может следовать необязательный, заключённый в
# круглые скобки список параметров функции
"Пока!" # из метода возвращается последнее вычисленное значение (здесь - строка)
end # ключевым словом end заканчиваются практически все инструкции Ruby
# puts - метод,
# str.bye - обращение к методу bye объекта str
# значение, полученное из метода bye передаётся методу puts
# который выводит на экран информацию
puts str.bye #=> Пока!
Этот пример также демонстрирует, как в Ruby можно использовать синглтон. В этом примере синглтоном является объект str.
Любая конструкция в Ruby возвращает значение. Например:
# конструкция if вычисляет выражение после него, и, если оно истинно,
# возвращает результат выражения между then и else, иначе между else и end
puts( if 5 > 3 then "Одно" else "Другое" end ) #=> Одно
# происходит присваивание значения переменной var, и операция присваивания
# возвращает значение переменной var, которая выводится на экран
puts( var = 5 ) #=> 5
[править] Контейнеры
Работа с массивами — одна из сильных сторон Ruby. Они автоматически изменяют размер, могут содержать любые элементы и язык предоставляет мощные средства для их обработки.
# создаём массив
a = [1, 'hi', 3.14, 1, 2, [4, 5] * 3]
# => [1, "hi", 3.14, 1, 2, [4, 5, 4, 5, 4, 5]]
# обращение по индексу
a[2] # => 3.14
# «разворачиваем» все внутренние массивы, удаляем одинаковые элементы
a.flatten.uniq # => [1, 'hi', 3.14, 2, 4, 5]
# пытаемся найти индекс элемента со значением 4
a.index(4) # => nil
# предыдущая попытка найти элемент неудачна - все предыдущие функции
# возвращают копии, но Ruby почти для всех функций предоставляется аналог
# с тем же названием, но заканчивающийся на «!»,
# который модифицирует контейнер
a.flatten! # => [1, "hi", 3.14, 1, 2, 4, 5, 4, 5, 4, 5]
a.index(4) # => 5
[править] Процедурные объекты и итераторы
В языке есть 2 эквивалентных способа записи блоков кода:
{ puts "Hello, World!" } do puts "Hello, World!" end
Сопрограммы применяются с большинством встроенных методов:
File.open('file.txt', 'w') { |file| # открытие файла «file.txt» для записи («w» - write) file.puts 'Wrote some text.' } # Конструкция устраняет неопределённость с закрытием файла: закрывается здесь при любом исходе
Следующий пример показывает использование сопрограмм и итераторов для работы с массивами, который показывает краткость записи на Ruby многих достаточно сложных действий (случайно выбираем из последовательности квадратов чисел от «0» до «10» и распечатываем вместе с индексами):
(0..10).collect{|v| v ** 2 }.select{ rand(2) == 1 }.each_with_index{|v,i| printf "%2d\t%2d\n", i, v }
[править] Классы, примеси, методы, перегрузка операторов
Следующий пример определяет класс с именем Person, предназначенный для хранения информации о имени и возрасте некоторой персоны.
class Person # объявление класса начинается с ключевого слова class, за которым # следует имя include Comparable # [[b:Ruby/Справочник/Comparable|Comparable]] подмешивается к классу # и добавляет методы <, <=, ==, >=, > и between? # с использованием нижеопределённого # в классе <=> # @@count_obj = 0 # переменная класса для подсчёта числа созданных объектов # # конструктор для создания объектов с помощью new def initialize(name, age) # name, age - параметры метода # название переменных объекта начинается с @ @name, @age = name, age # cоздаём объекты и увеличиваем счётчик на 1 @@count_obj += 1 end def <=>(person) # переопределение оператора <=> # (это даёт возможность использовать метод sort @age <=> person.age # из метода возвращается последнее вычисленное выражение, end def to_s # для форматированного вывода информации puts "#{@name} (#{@age})" # конструкция #{x} в 2-х кавычках замещается в Ruby значением x end def inspect # похож на to_s, но используется для диагностического вывода "<#{@@count_obj}:#{to_s}>" end # пример метапрограммирования: добавляет методы для доступа к # переменным объекта attr_reader :name, :age end # создаём массив объектов group = [ Person.new("John", 20), Person.new("Markus", 63), Person.new("Ash", 16) ] # => [<3:John (20)>, <3:Markus (63)>, <3:Ash (16)>] # здесь при работе с irb автоматически вызывается метод inspect # вызываем методы массива сортировка и разворачивание его в обратном порядке puts group.sort.reverse # Печатает: # Markus (63) # John (20) # Ash (16) # обращаемся к функции, которая была добавлена # автоматически(используя <=>) при включении Comparable group[0].between?(group[2], group[1]) # => true
[править] Исключения
Исключения возбуждаются с помощью конструкции raise (или fail), опционально могут быть добавлены текст с сообщением, тип исключения и информация о стеке вызовов:
raise ArgumentError, "Неверный аргумент", caller # caller - метод возвращающий текущий стек выполнения
Обрабатываются исключения с использованием конструкции rescue. Опционально можно указать тип обрабатываемого исключения (по умолчанию обрабатываются все) и получение информации. Также можно добавлять блоки else (выполняется если исключения отсутствовали) и ensure (выполняется в любом случае).
begin # ... rescue RuntimeError => e # обрабатываем конкретный тип ошибок puts e # напечатаем сообщение об ошибке rescue # можно писать rescue => e чтобы получить объект исключения # обрабатываем все исключения else # сработает если исключений не было ensure # сработает в любом случае end
[править] Реализация
Для Ruby существуют несколько реализаций: официальный интерпретатор, написанный на Си, JRuby — реализация для Java, интерпретатор для платформы .NET IronRuby (находится в стадии разработки), Rubinius — написанная в основном на Ruby и базирующаяся на Smalltalk-80 VM.
Официальный интерпретатор портирован под большинство платформ, включая Unix, Microsoft Windows (в том числе Windows CE), DOS, Mac OS X, OS/2, Amiga, BeOS, Syllable, Acorn RISC OS и другие.
[править] Интерактивный Ruby
С официальной версией интерпретатора Ruby поставляется интерактивный интерпретатор языка. Запускаемый командой irb в консоли, он позволяет тестировать текст программы очень быстро (построчно):
$ irb irb(main):001:0> "Hello, World" => "Hello, World" irb(main):002:0> 2 ** 256 # ** - оператор возведения в степень => 115792089237316195423570985008687907853269984665640564039457584007913129639936
Программа irb выводит результат каждой строки после символов =>. В приведённых выше примерах для наглядности применяется аннотирование — результаты строк программы записываются в комментариях после =>. Имитацию irb можно запустить непосредственно в браузере.
В поставке дистибутива One-Click Installer для Windows, начиная с версии 1.8.2-15, поставляется утилита fxri, которая включает в себя справочную систему (ri) и интерактивный интерпретатор (irb).
[править] Поддержка IDE
Базовые возможности редактирования добавляются к многим редакторам (Emacs, vim, jEdit, nano, SciTE и др.), здесь перечислены только IDE, то есть предоставляющие обширный набор функций.
| Название | Лицензия | Платформы | Ссылка |
|---|---|---|---|
| ActiveState Komodo IDE | Проприетарная | GNU/Linux, Mac OS X, Solaris, Windows | http://activestate.com/Products/komodo_ide/ |
| Arachno Ruby IDE | Проприетарная | Win 2000/XP, GNU/Linux | http://www.ruby-ide.com |
| Aptana (RadRails+RDT) | CPL | Java | http://www.aptana.com/ |
| Eclipse + RDT | CPL | Java | RDT Homepage |
| FreeRIDE | Ruby License | Windows, OS X, POSIX | http://freeride.rubyforge.org/ |
| IntelliJ IDEA + Ruby plugin | Проприетарная (на IDEA), Apache 2.0 (на сам plugin) | Java, JRuby | Ruby plugin |
| KDevelop | GNU GPL | Linux | http://kdevelop.org/ |
| Mondrian Ruby IDE | MIT | Ruby ( + FOX toolkit) | http://www.mondrian-ide.com/ |
| NetBeans IDE | CDDL | Java | http://www.netbeans.org/features/ruby/ |
| RDE | Ruby License | Windows | http://homepage2.nifty.com/sakazuki/rde_en/ |
| Ruby in steel | Проприетарная | Visual Studio 2005 | http://www.sapphiresteel.com/ |
| Xcode 3.1 | Проприетарная | Mac OS X 10.5 | http://developer.apple.com/tools/xcode/ |
[править] Библиотеки
[править] Стандартная библиотека
Кроме мощных возможностей, встроенных в язык, Ruby поставляется с большой стандартной библиотекой. Это, прежде всего, библиотеки для работы с различными сетевыми протоколами на стороне сервера и клиента, средства для работы с различными форматами представления данных (XML, XSLT, YAML, PDF, RSS, CSV, WSDL). Кроме встроенных в язык средств отладки с Ruby поставляются библиотеки для юнит-тестирования, профилирования. Также есть библиотеки для работы с архивами, датами, кодировками, матрицами, средства для системного администрирования, распределенных вычислений, поддержки многопоточности и т. д..
| Название | Описание | Версия[6] |
|---|---|---|
|
|
Вершина иерархии классов Ruby. | 1.0 |
| Динамический массив для хранения произвольных объектов, индексируемый с 0. | 1.0 | |
|
|
Объекты сохраняют контекст выполнения некоторого участка кода (значение переменных, методов и т. д.). Может позже использоваться для выполнения вычислений в этом контексте. | 1.2 |
|
|
Объект сохраняет адрес возврата и контекст выполнения, позволяя выполнить переход в точку создания из любого места программы (т. н. нелокальный переход). | 1.4 |
|
|
Обёртка вокруг указателя Си, используется в основном при написании расширений. | 1.0 |
|
|
Директория файловой системы. Предоставляет возможности для просмотра директорий и их атрибутов. | 1.0 |
|
|
Базовый класс всех исключений (образует вершину иерархии более чем 30 исключений) | 1.0 |
Глобальная переменная false является единственной переменной этого класса и представляет логическую ложь в булевских выражениях. |
1.0 | |
|
|
Коллекция пар ключ-значение; порядок обхода не зависит от порядка вставки. | 1.0 |
|
|
Базовые возможности ввода-вывода. | 1.0 |
|
|
Класс для доступа к файлам. | 1.0 |
|
Результат применения регулярного выражения. Обычно используется не напрямую, а через специальные переменные $&, $', $`, $1, $2 и т. д. |
1.0 |
|
|
Метод, асоциированный с конкретным объектом (не с классом). Может использоваться для вызова этого метода без наличия объекта. | 1.2 |
|
|
Класс модулей. | 1.0 |
| Класс классов; классы в Ruby являются объектами, а Class является классом этих объектов (метаклассом). | 1.0 | |
Единственным экземпляром класса является переменная nil. nil и false представляют ложь в программах. Любой другой обьект представляет собой истину. |
1.0 | |
|
|
Абстрактный класс чисел. | 1.0 |
|
|
Абстрактный класс целых чисел. Может трактоваться как бесконечная битовая строка для битовых операций. | 1.0 |
|
|
Целые числа ограниченные только количеством памяти. Конвертируется в Fixnumавтоматически, если значение может быть размещено в них и наоборот. |
1.0 |
|
|
Целые числа, которые могут быть размещены в машинном слове (32 бита для большинства машин). Если результат операции выходит за рамки, автоматически преобразуется в Bignum. | 1.0 |
|
|
Числа с плавающей запятой. | 1.0 |
| Блок кода со связанным с ним контекстом (замыкание), который может выполняться неоднократно в других контекстах. | 1.0 | |
| Интервал: множество значений, заданных с начальным и конечным элементами. | 1.0 | |
|
|
Регулярное выражение. | 1.0 |
|
|
Строка байт произвольной длины. | 1.0 |
| Предоставляет простой способ связывания атрибутов вместе без написания кода класса напрямую; генерирует специальные классы, содержащие множество переменных и методов доступа. | 1.0 | |
|
|
Представляет имя и создаётся при использовании синтаксиса :name. Все объекты с данным именем созданные в программе — ссылки на один объект. |
1.6 |
|
|
Инкапсулирует информацию о потоке, включая основной поток скрипта Ruby. | 1.0 |
|
|
Предоставляет способ управления группой потоков. Поток может принадлежать только к одной ThreadGroup. Добавление потока к новой группе удаляет его из любой предыдущей. |
1.6 |
|
|
Дата и время. | 1.0 |
Глобальная переменная true является единственной переменной класса и представляет логическую истину в булевских выражениях. |
1.0 | |
|
|
Метод, не связаный с конкретным объектом. Может привязываться к объекту и вызываться как Method.. |
1.6 |
[править] Расширения
В языке Ruby реализован простой и удобный механизм для расширения языка с помощью библиотек, написанных на Си, позволяющий легко разрабатывать дополнительные библиотеки[7][8].
Для унифицированного доступа к базам данных разработана библиотека Ruby DBI (поддерживает SQLite, Oracle, ODBC, MySQL, DB2, MS SQL, InterBase, ADO и др.). Также существуют библиотеки для конкретных баз данных, поддерживающих специфические для них операции.
Из графических библиотек следует отметить FxRuby — интерфейс к графической библиотеке FOX, графический пакет разработчика wxRuby (интерфейс к кросcплатформенному пакету wxWidgets на C++), QtRuby/Korundum — привязка к Qt и KDE соответственно, графические библиотеки для работы с Tk и Gtk. Также реализована библиотека для работы с OpenGL, позволяющая программировать трёхмерную графику.
Win32utils — позволяет обращаться к специфическим возможностям Win32 API.
Rmagick — библиотека для работы с изображениями, поддерживающая более 90 форматов (основана на ImageMagick и GraphicsMagick).
Библиотека Ruport (Ruby reports) предназначена для легкой реализации отчетов и создания диаграмм на основе данных из БД или прямо из текстовых файлов CSV. Причем результаты можно сохранять в форматах PDF, HTML, CSV и TXT.
RuTils — обработчик русского текста на Ruby. Позволяет реализовать сумму прописью и выбор числительного. Например 231.propisju(2) => «двести тридцать одна» или 341.propisju_items(1, «чемодан», «чемодана», «чемоданов») => «триста сорок один чемодан». А также перевод в транслит и работу с датами.
Для управления библиотеками и программами Ruby в виде самодостаточных пакетов предназначена система управления пакетами RubyGems[1] (англ. gems, gem — драгоценный камень).
Существует всемирный репозиторий программного обеспечения Ruby RAA (Ruby Application Archive) [2]. Репозиторий по состоянию на сентябрь 2007 года насчитывает более полутора тысяч проектов. Большое количество программного обеспечения, написанного на Ruby, пользуются хостингом проекта RubyForge[3], созданного специально с этой целью.
Большинство расширений распространяются под свободными лицензиями (LGPL, лицензия Ruby) и могут быть использованы в любом проекте практически без ограничений.
[править] Документация
Система RDoc предназначена для автоматического извлечения документации из исходных кодов и программ на Ruby и её дальнейшей обработки. Является стандартом де-факто для подготовки документации по программному обеспечению, написанному на Ruby.
Для доступа к документации Ruby из командной строки Unix разработана программа ri. С её помощью можно получить информацию о модулях, классах и методах Ruby. Онлайн-документация доступна на сайте http://www.ruby-doc.org.
[править] Использование
Ruby используется в NASA, NOAA (национальная администрация по океану и атмосфере), Motorola и других крупных организациях[9]. Следующие программы используют Ruby как скриптовый язык для расширения возможностей программы или написаны на нём (частично или полностью).
- RPG Maker (RPG Maker XP) — RGSS (Ruby Game Scripting System)
- Amarok — [4]
- SketchUp — [5]
- XChat
- Для KOffice разрабатывается Kross[6], механизм для поддержки скриптов, который включает Ruby [7].
- WATIR[8] (англ. Web Application Testing in Ruby) — свободное средство для автоматического тестирования веб-приложений в браузере.
[править] Недостатки языка и интерпретатора
К недостаткам интерпретатора Ruby сегодня можно отнести следующие:
- Невысокая скорость работы (естественная расплата за быстрое написание сложных программ). Ruby является одним из самых медленных из используемых в практике веб-разработки языков программирования[10].
- Отсутствие поддержки потоков операционной системы (для Unix-подобных операционных систем есть поддержка процессов ОС).
- Отсутствие встроенной поддержки юникода (возможна работа с использованием дополнительных библиотек, планируется добавить в версии 1.9).
- Отсутствие компиляции в байткод. (При этом есть возможность компилировать Ruby в Java и .NET байткод, используя компилятор JRuby и Ruby.NET[11]). В версию 2.0 запланировано включение виртуальной машины YARV, компилирующей Ruby в байткод и существенно ускоряющей исполнение.
[править] См. также
- Ruby on Rails — каркас для создания веб-приложений
- RubyGems — менеджер пакетов для Ruby
- Сравнение возможностей Ruby с другими языками см. в статье Сравнение языков программирования