Язык программирования Рубин

Язык программирования Рубин
Ruby
Семантика:

мультипарадигмальный

Тип исполнения:

интерпретатор

Появился в:

1995 г.

Автор(ы):

Юкихиро Мацумото

Последняя версия:

1.9.1

Типизация данных:

динамическая с явным приведением типов

Основные реализации:

MRI Ruby, Испытал влияние:

Лисп, Эйфель, Ада, Dylan, C++

Повлиял на:

Ruby (англ. «Рубин», читается ['ɹu:bɪ]) — динамический, рефлективный, интерпретируемый язык высокого уровня для быстрого и удобного объектно-ориентированного программирования. Язык обладает независимой от операционной системы реализацией многопоточности, строгой динамической типизацией, сборщиком мусора и многими другими возможностями. Ruby близок по особенностям синтаксиса к языкам Перл и Эйфель, по объектно-ориентированному подходу к Python, Лисп, Dylan и CLU.

Кроссплатформенная реализация интерпретатора языка является полностью свободной.[1]

Содержание

История создания и развития

Создатель Ruby — Юкихиро Мацумото (Matz) — интересовался языками программирования ещё будучи студентом, но идея о разработке нового языка появилась позже. Ruby начал разрабатываться 24 февраля 1993 года и вышел в свет в 1995 году. Название навеяно языком Перл, многие особенности синтаксиса и семантики из которого заимствовано в Ruby: англ. pearl — «жемчужина», англ. ruby — «рубин».

Целью разработки было создание «настоящего объектно-ориентированного», лёгкого в разработке, интерпретируемого языка программирования. Из письма автора[2]:

Ruby родился 23 февраля 1993 года. В тот день я беседовал со своим коллегой о возможности существования объектно-ориентированного сценарного языка. Я знал Перл (Perl4, а не Perl5), но он мне не нравился — был в нём некий привкус игрушечного языка (да и поныне есть). А объектно-ориентированный интерпретируемый язык казался многообещающим. В то время я знал

Тогда я решил его создать. Прошло несколько месяцев, прежде чем интерпретатор заработал. Я добавил в мой язык то, что мне хотелось — итераторы, обработку исключений, автоматическую сборку мусора. Затем я переорганизовал свойства Перла и реализовал их как библиотеку классов. В декабре 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"
  b = a
  b             #=> "abcdefg"
  a[3] = 'R'
  b             #=> "abcRefg"

то есть при изменении значения переменной a неявно изменилось и значение b, так как они содержат ссылку на один объект. Т.е. механизм присваивания действует одинаково для всех объектов, в отличие от языков типа C, Object Pascal, где присваивание может означать как копирование значения, так и копирование ссылки на значение.

Ruby не поддерживает множественное наследование, но вместо него есть мощный механизм примесей. Все классы (напрямую или через другие классы) выведены из класса Object, следовательно, любой объект может использовать определённые в нём методы (например, class, to_s, nil?). Процедурный стиль также поддерживается, но все глобальные процедуры неявно являются закрытыми методами класса Object.

Ruby является мультипарадигменным языком: он поддерживает процедурный стиль (определение функций и переменных вне классов), объектно-ориентированный (всё — объект), функциональный (анонимные функции, замыкания, возврат значения всеми инструкциями, возврат функцией последнего вычисленного значения). Он поддерживает отражение, метапрограммирование, информацию о типах переменных на стадии выполнения.

Возможности Ruby

  • Имеет лаконичный и простой синтаксис, частично разработанный под влиянием Ада, Эйфель и исключения в стиле Python.
  • Позволяет переопределять операторы, которые на самом деле являются методами.
  • Полностью объектно-ориентированный язык программирования. Все данные в Ruby являются объектами в понимании Smalltalk не являются объектами. Например, число «1» — это экземпляр класса Fixnum. Также поддерживается добавление методов в класс и даже в конкретный экземпляр во время выполнения программы.
  • Не поддерживает множественное наследование, но вместо него может использоваться концепция «примесей», основанная в данном языке на механизме модулей.
  • Содержит автоматический сборщик мусора. Он работает для всех объектов Ruby, в том числе для внешних библиотек.
  • Создавать расширения для Ruby на Си очень просто частично из-за сборщика мусора, частично из-за несложного и удобного API.
  • Поддерживает замыкания с полной привязкой к переменным.
  • Поддерживает блоки кода (код заключается в {} или doend). Блоки могут использоваться в методах или преобразовываться в замыкания.
  • Целые переменные в Ruby автоматически конвертируются между типами Fixnum (32-разрядные) и Bignum (больше 32 разрядов) в зависимости от их значения, что позволяет производить целочисленные математические расчёты со сколь угодно большой точностью.
  • Не требует предварительного объявления переменных, но для интерпретатора желательно, чтобы переменным присваивалось пустое значение nil (тогда интерпретатор знает, что идентификатор обозначает переменную, а не имя метода). Язык использует простые соглашения для обозначения области видимости. Пример: просто var — локальная переменная, @var — переменная экземпляра (член или поле объекта класса), @@var — переменная класса, $var — глобальная переменная.
  • В Ruby непосредственно в языке реализованы многие шаблоны проектирования, так, например, «одиночка» (singleton) может быть (хотя и не обязан) реализован добавлением необходимых методов к одному конкретному объекту (см. ниже).
  • Может динамически загружать расширения, если это позволяет операционная система.
  • Имеет независимую от ОС поддержку невытесняющей многопоточности.
  • Перенесён на множество платформ. Он разрабатывался на GNU/Linux, но работает на многих версиях Unix, Microsoft Windows (в частности, Win32), Mac OS, 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 # создаём объекты и увеличиваем счётчик на 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 существуют несколько реализаций: официальный интерпретатор, написанный на Си, Java, интерпретатор для платформы .NET Smalltalk-80 VM.[6], MagLev — другая базирующаяся на Smalltalk разработка от компании Gemstone [7], Blue Ruby — реализация Ruby для виртуальной машины ABAP[8], MacRuby — реализация для Mac OS с фокусом на максимальную интеграцию с возможностями операционной системы[9]

Официальный интерпретатор портирован под большинство платформ, включая Unix, Microsoft Windows (в том числе Windows CE), Mac OS X, OS/2, BeOS,

Интерактивный 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

Базовые возможности редактирования добавляются к многим редакторам (vim, nano, 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
RadRails+RDT) CPL Java http://www.aptana.com/
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, Ruby plugin
RubyMine Проприетарная (на базе IDEA) Java http://www.jetbrains.com/ruby
GNU GPL Linux http://kdevelop.org/
Mondrian Ruby IDE MIT Ruby (+ FOX toolkit) http://www.mondrian-ide.com/
NetBeans IDE 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 поставляется с большой стандартной библиотекой. Это, прежде всего, библиотеки для работы с различными сетевыми протоколами на стороне сервера и клиента, средства для работы с различными форматами представления данных (XSLT, PDF, CSV, юнит-тестирования, профилирования. Также есть библиотеки для работы с архивами, датами, кодировками, матрицами, средства для системного администрирования, распределенных вычислений, поддержки многопоточности и т. д..

Расширения

В языке Ruby реализован простой и удобный механизм для расширения языка с помощью библиотек, написанных на Си, позволяющий легко разрабатывать дополнительные библиотеки.[11][12]

Для унифицированного доступа к базам данных разработана библиотека Ruby DBI (поддерживает Oracle, MySQL, DB2, MS SQL, ADO и др.). Также существуют библиотеки для конкретных баз данных, поддерживающих специфические для них операции. Для реализации ActiveRecord, DataMapper или Sequel.

Из графических библиотек следует отметить FxRuby — интерфейс к графической библиотеке FOX, графический пакет разработчика wxRuby (интерфейс к кроссплатформенному пакету C++), QtRuby/Korundum — привязка к KDE соответственно, графические библиотеки для работы с Gtk. Также реализована библиотека для работы с трёхмерную графику.

Win32utils — позволяет обращаться к специфическим возможностям Win32 API.

Rmagick — библиотека для работы с изображениями, поддерживающая более 90 форматов (основана на GraphicsMagick).

Библиотека Ruport (Ruby reports) предназначена для легкой реализации отчетов и создания диаграмм на основе данных из БД или прямо из текстовых файлов PDF, CSV и TXT.

RuTils — обработчик русского текста на Ruby. Позволяет реализовать сумму прописью и выбор числительного. Например 231.propisju(2) => «двести тридцать одна» или 341.propisju_items(1, «чемодан», «чемодана», «чемоданов») => «триста сорок один чемодан». А также перевод в транслит и работу с датами.

Для управления библиотеками и программами Ruby в виде самодостаточных пакетов предназначена система управления пакетами англ. gems, gem — драгоценный камень).

Существует всемирный репозиторий программного обеспечения Ruby RAA (Ruby Application Archive) [1]. Репозиторий по состоянию на сентябрь 2007 года насчитывает более полутора тысяч проектов. Большое количество программного обеспечения, написанного на Ruby, пользуются хостингом проекта RubyForge[2], созданного специально с этой целью.

FreeRIDE — IDE для Ruby, реализованая с использованием библиотеки FxRuby.

Большинство расширений распространяются под свободными лицензиями (LGPL, лицензия Ruby) и могут быть использованы в любом проекте практически без ограничений.

Документация

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

Для доступа к документации Ruby из командной строки Unix разработана программа ri. С её помощью можно получить информацию о модулях, классах и методах Ruby. Онлайн-документация доступна на сайте http://www.ruby-doc.org.

Использование

Ruby используется в NASA, NOAA (национальная администрация по океану и атмосфере), [13] Следующие программы используют Ruby как скриптовый язык для расширения возможностей программы или написаны на нём (частично или полностью).

  • RPG Maker (RPG Maker XP) — RGSS (Ruby Game Scripting System)
  • [3]
  • [4]
  • KOffice разрабатывается Kross[5], механизм для поддержки скриптов, который включает Ruby [6].
  • [7] (англ. Web Application Testing in Ruby) — свободное средство для автоматического тестирования веб-приложений в браузере.

Недостатки языка и интерпретатора

Большинство перечисленных здесь недостатков реализации языка Ruby относятся к старой ветки языка — Ruby 1.8. Новая ветка, Ruby 1.9, использующая для интерпретации опкода новую виртуальную машину обратная совместимость нарушена, поэтому полный переход на неё в настоящее время вряд ли возможен. Интерпретатор Ruby на сегодняшний день имеет следующие недостатки, большинство из которых устранены в экспериментальной версии Ruby 1.9:

  • Невысокая скорость работы. Ruby 1.8 является одним из самых медленных из используемых в практике веб-разработки языков программирования.[14] Эта проблема решена в Ruby Core 1.9 и в JRuby. Быстродействие других альтернативных реализаций языка также несколько лучше чем у Ruby 1.8.[15]
  • Отсутствие поддержки потоков операционной системы (для Unix-подобных операционных систем есть поддержка процессов ОС), есть в версии 1.9.
  • Отсутствие встроенной поддержки Юникода (возможна работа с использованием дополнительных библиотек, есть в версии 1.9).
  • Отсутствие компиляции в байткод. (При этом есть возможность компилировать Ruby в .NET байткод, используя компилятор [16]). В в версию 1.9 входит виртуальная машина

См. также

Примечания

  1. LICENSE (англ.) (TXT). — лицензия Ruby. Проверено 14 августа 2006., Лицензия Ruby — перевод
  2. Письмо Юкихиро Мацумото в рассылку ruby-talk ruby-talk:00382 от 4 июня 1999 года. Есть перевод всего письма на русский
  3. Интервью Юкихиро Мацумото(англ.)
  4. Хэл Фултон Программирование на языке Ruby. — 2-е изд. — М.: ДМК Пресс, 2007. — С. 24-27.
  5. 5 things I hate about Ruby (англ.) (25 октября 2005). Проверено 30 июля 2007.
  6. Rubinius Home
  7. MagLev /măg-lĕv/
  8. Blue Ruby — New Exploratory Research
  9. MacRuby
  10. Из-за слабой документированности Ruby в ранних версиях информация получена напрямую из исходников (helium.ruby-lang.org/ftp://ruby (англ.). Проверено 16 августа 2006.). Указаны только стабильные (чётные) версии.
  11. Thomas, Dave Extending Ruby (англ.). Programming Ruby - The Pragmatic Programmer's Guide. Addison Wesley Longman, Inc.. Проверено 30 октября 2006.
  12. Rooney, Garrett Extending Ruby with C (англ.). O'Reilly Media (18 ноября 2004). Проверено 30 октября 2006.
  13. Хэл Фултон Программирование на языке Ruby. — 2-е изд. — М.: ДМК Пресс, 2007. — С. 21.
  14. Computer Language Benchmarks Game — сравнение производительности языков программирования.
  15. Сравнение производительности девяти реализаций языка Ruby
  16. Ruby.NET (англ.). Queensland University of Tehnology. Проверено 25 января 2008.

Ссылки

Форумы

IRC

  • Ruby-ru(рус.) — русскоязычный канал посвященный программированию на Ruby.

Документация, справочники, примеры и информация

Программы

Реализации языка и расширения к нему

  • JRuby Home(англ.) — реализация интерпретатора Ruby на Java.
  • RubyForge(англ.) — сайт расширений для Ruby (аналог CPAN для языка Перл).

Литература


Wikimedia Foundation. 2010.

Игры ⚽ Поможем сделать НИР

Полезное


Смотреть что такое "Язык программирования Рубин" в других словарях:

  • Рубин (язык программирования) — Ruby Семантика: мультипарадигмальный Тип исполнения: интерпретатор Появился в: 1995 г. Автор(ы): Юкихиро Мацумото Последняя версия: 1.9.1 …   Википедия

  • Ruby — Класс языка: мультипарадигмальный: динамический, объектно ориентиров …   Википедия

  • Руби IDE — Ruby Семантика: мультипарадигмальный Тип исполнения: интерпретатор Появился в: 1995 г. Автор(ы): Юкихиро Мацумото Последняя версия: 1.9.1 …   Википедия

  • «… для чайников» — Office 2003 для «чайников» «… для чайников»  русскоязычная книжная серия издательства «Диалектика». Эта серия книг должна была помогать начинающим пользователям в освоении компьютера. Впоследствии начали также выходить и другие книги… …   Википедия

  • «… для чайников» (серия книг) — Office 2003 для «чайников» «… для чайников»  русскоязычная книжная серия издательства «Диалектика». Эта серия книг должна была помогать начинающим пользователям в освоении компьютера. Впоследствии начали также выходить и другие книги… …   Википедия

  • Диабет для "чайников" — Office 2003 для «чайников» «… для чайников»  русскоязычная книжная серия издательства «Диалектика». Эта серия книг должна была помогать начинающим пользователям в освоении компьютера. Впоследствии начали также выходить и другие книги… …   Википедия

  • Диабет для «чайников» — Office 2003 для «чайников» «… для чайников»  русскоязычная книжная серия издательства «Диалектика». Эта серия книг должна была помогать начинающим пользователям в освоении компьютера. Впоследствии начали также выходить и другие книги… …   Википедия

  • Для чайников — Office 2003 для «чайников» «… для чайников»  русскоязычная книжная серия издательства «Диалектика». Эта серия книг должна была помогать начинающим пользователям в освоении компьютера. Впоследствии начали также выходить и другие книги… …   Википедия

  • ПК для «чайников» — Office 2003 для «чайников» «… для чайников»  русскоязычная книжная серия издательства «Диалектика». Эта серия книг должна была помогать начинающим пользователям в освоении компьютера. Впоследствии начали также выходить и другие книги… …   Википедия

  • Экономика для «чайников» — Office 2003 для «чайников» «… для чайников»  русскоязычная книжная серия издательства «Диалектика». Эта серия книг должна была помогать начинающим пользователям в освоении компьютера. Впоследствии начали также выходить и другие книги… …   Википедия


Поделиться ссылкой на выделенное

Прямая ссылка:
Нажмите правой клавишей мыши и выберите «Копировать ссылку»