Ruby (язык программирования) - Ruby (programming language)

Рубин
Ruby logo.svg
Парадигма Мультипарадигма : функциональная , императивная , объектно-ориентированная , рефлексивная
Разработано Юкихиро Мацумото
Разработчик Юкихиро Мацумото и др.
Впервые появился 1995 ; 26 лет назад ( 1995 )
Стабильный выпуск
3.0.2  Отредактируйте это в Викиданных / 7 июля 2021 г . ; 3 месяца назад ( 7 июля 2021 г. )
Печатная дисциплина Утка , динамичная , крепкая
Сфера Лексический, иногда динамичный
Язык реализации C
Операционные системы Кроссплатформенность
Лицензия Рубиновая лицензия
Расширения имени файла .rb
Веб-сайт www .ruby-lang .org
Основные реализации
Ruby MRI , TruffleRuby , YARV , Rubinius , MagLev , JRuby , MacRuby , RubyMotion , Mruby , IronRuby
Под влиянием
Ада , базовый , C ++ , CLU , Dylan , Eiffel , Lisp , Lua , Perl , Python , Smalltalk
Под влиянием
Clojure , CoffeeScript , Crystal , D , Elixir , Groovy , Ioke , Julia , Mirah , Nu , Ring, Rust , Swift

Рубин является интерпретированы , высокого уровня , общего назначения , язык программирования . Он был разработан и разработан в середине 1990-х Юкихиро «Мац» Мацумото в Японии .

Ruby динамически типизирован и использует сборку мусора и своевременную компиляцию . Он поддерживает несколько парадигм программирования , включая процедурное , объектно-ориентированное и функциональное программирование . По словам создателя, на Ruby повлияли Perl , Smalltalk , Eiffel , Ada , BASIC и Lisp .

История

Ранняя концепция

Мацумото сказал, что Ruby был задуман в 1993 году. В сообщении 1999 года в списке рассылки ruby-talk он описывает некоторые из своих ранних идей о языке:

Я говорил со своим коллегой о возможности объектно-ориентированного языка сценариев. Я знал Perl (Perl4, а не Perl5), но мне он не очень нравился, потому что от него пахло игрушечным языком (он все еще есть). Объектно-ориентированный язык казался очень многообещающим. Тогда я знал Python . Но мне это не нравилось, потому что я не думал, что это действительно объектно-ориентированный язык - объектно-ориентированные функции казались дополнением к языку. Как языковой маньяк и фанат объектно-ориентированного программирования в течение 15 лет, я действительно хотел настоящий объектно-ориентированный, простой в использовании язык сценариев. Я искал, но не нашел. Я решил это сделать.

Мацумото описывает дизайн Ruby как простой язык Lisp по своей сути, с объектной системой, подобной системе Smalltalk, блоками, вдохновленными функциями высшего порядка , и практической полезностью, такой как Perl.

Название «Рубин» возникло во время сеанса онлайн-чата между Мацумото и Кейджу Ишицука 24 февраля 1993 года, до того, как для языка был написан какой-либо код. Изначально предлагалось два названия: « Коралл » и « Рубин ». Мацумото выбрал последнее в более позднем электронном письме Ишицуке. Позже Мацумото отметил фактор при выборе имени «Рубин» - это камень, рожденный одним из его коллег.

Ранние релизы

О первом публичном выпуске Ruby 0.95 было объявлено в японских группах новостей 21 декабря 1995 года. Впоследствии за два дня были выпущены еще три версии Ruby. Релиз совпал с запуском списка рассылки ruby-list на японском языке , который был первым списком рассылки для нового языка.

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

После выпуска Ruby 0.95 в 1995 году в последующие годы было выпущено несколько стабильных версий Ruby:

  • Ruby 1.0: 25 декабря 1996 г.
  • Ruby 1.2: декабрь 1998 г.
  • Ruby 1.4: август 1999 г.
  • Ruby 1.6: сентябрь 2000 г.

В 1997 году в сети была опубликована первая статья о Ruby. В том же году Мацумото был нанят netlab.jp для работы над Ruby в качестве штатного разработчика.

В 1998 году Мацумото запустил архив приложений Ruby вместе с простой англоязычной домашней страницей для Ruby.

В 1999 году начался первый англоязычный список рассылки ruby-talk , что свидетельствовало о растущем интересе к языку за пределами Японии. В том же году Мацумото и Кейджу Ишицука написали первую книгу по Ruby, объектно-ориентированный язык сценариев Ruby (オ ブ ジ ェ ク ト 指向 ス ト Ruby), которая была опубликована в Японии в октябре 1999 года. На японском языке опубликовано 20 книг по Ruby.

К 2000 году Ruby был более популярен в Японии, чем Python. В сентябре 2000 года была напечатана первая англоязычная книга Programming Ruby , которая позже была бесплатно выпущена для широкой публики, что еще больше расширило распространение Ruby среди англоговорящих. В начале 2002 года на английском языке рубинового разговора список рассылки получали больше сообщений , чем на японском языке рубинового список , демонстрируя все большую популярность Руби в не японском языке мире.

Рубин 1.8 и 1.9

Ruby 1.8 изначально был выпущен в августе 2003 года, долгое время оставался стабильным и был исключен из использования в июне 2013 года. Несмотря на то, что он устарел, все еще существует код, основанный на нем. Ruby 1.8 только частично совместим с Ruby 1.9.

Ruby 1.8 был предметом нескольких отраслевых стандартов. Спецификации языка для Ruby были разработаны Центром продвижения открытых стандартов Агентства по продвижению информационных технологий ( японское правительственное агентство) для представления в Японский комитет по промышленным стандартам (JISC), а затем в Международную организацию по стандартизации (ISO). Он был принят в качестве промышленного стандарта Японии (JIS X 3017) в 2011 году и международного стандарта ( ISO / IEC 30170 ) в 2012 году.

Примерно в 2005 году интерес к языку Ruby резко возрос вместе с Ruby on Rails , веб-фреймворком, написанным на Ruby. Rails часто приписывают повышение осведомленности о Ruby.

Начиная с версии Ruby 1.9.3, выпущенной 31 октября 2011 года, Ruby перешел с двойной лицензии по лицензии Ruby и GPL на двойную лицензию по лицензии Ruby и лицензии BSD с двумя пунктами. Переход на 1.9 замедлился из-за изменений с 1.8, которые потребовали переписывания многих популярных сторонних гемов . Ruby 1.9 содержит много значительных изменений по сравнению с версией 1.8. Примеры включают:

  • локальные переменные блока (переменные, которые являются локальными по отношению к блоку, в котором они объявлены)
  • дополнительный синтаксис лямбда :f = ->(a,b) { puts a + b }
  • дополнительный синтаксис литерала Hash с использованием двоеточий для символьных ключей:{symbol_key: "value"} == {:symbol_key => "value"}
  • поддерживаются построчные кодировки символов
  • новый API сокетов ( поддержка IPv6 )
  • require_relative безопасность импорта

Рубин 2

Ruby 2.0 должен был быть полностью обратно совместим с Ruby 1.9.3. В официальном выпуске 2.0.0 от 24 февраля 2013 г. было всего пять известных (незначительных) несовместимостей. Ruby 2.0 добавил несколько новых функций, в том числе:

  • аргументы ключевого слова метода,
  • новый метод, Module#prependдля расширения класса,
  • новый литерал для создания массива символов,
  • новый API для ленивого вычисления Enumerables и
  • новое соглашение об использовании #to_h для преобразования объектов в хэши.

Начиная с версии 2.1.0, политика управления версиями Ruby изменилась, чтобы быть более похожей на семантическое управление версиями .

Ruby 2.2.0 включает ускорения, исправления ошибок и обновления библиотек, а также удаляет некоторые устаревшие API. В частности, Ruby 2.2.0 вносит изменения в обработку памяти - инкрементный сборщик мусора, поддержку сборки мусора символов и возможность компиляции непосредственно с jemalloc. Он также содержит экспериментальную поддержку использования vfork (2) с system () и spawn (), а также добавленную поддержку спецификации Unicode 7.0. Начиная с версии 2.2.1, производительность Ruby MRI на PowerPC64 была улучшена. Функции, которые были устаревшими или удалены, включают callcc, библиотеку DL, Digest :: HMAC, lib /rational.rb, lib / complex.rb, GServer, Logger :: Application, а также различные функции C API.

Ruby 2.3.0 включает в себя множество улучшений производительности, обновлений и исправлений, включая изменения в вызове Proc #, использование ключевых слов исключения Socket и IO, обработку имени Thread #, пассивные соединения Net :: FTP по умолчанию и удаление Rake из stdlib. Другие заметные изменения включают:

  • Возможность помечать все строковые литералы как замороженные по умолчанию, что значительно увеличивает производительность строковых операций.
  • Сравнение хэшей для прямой проверки пар ключ / значение, а не только ключей.
  • Новый оператор безопасной навигации, &. который может упростить обработку nil (например, вместо , мы можем использовать ).if obj && obj.foo && obj.foo.barif obj&.foo&.bar
  • Did_you_mean камень теперь в комплекте по умолчанию , и требуется при запуске , чтобы автоматически предлагать подобные имя матчи на более NameError или NoMethodError .
  • Hash # dig и Array # dig для легкого извлечения глубоко вложенных значений (например, заданное значение Foo Baz теперь может быть получено ).profile = { social: { wikipedia: { name: 'Foo Baz' } } }profile.dig(:social, :wikipedia, :name)
  • .grep_v(regexp) который будет соответствовать всем отрицательным примерам данного регулярного выражения в дополнение к другим новым функциям.

Ruby 2.4.0 включает улучшения производительности для хэш-таблицы, массива № max, массива № min ​​и доступа к переменной экземпляра. Другие заметные изменения включают:

  • Binding # irb: запуск сеанса REPL, аналогичного binding.pry.
  • Объедините Fixnum и Bignum в целочисленный класс
  • String поддерживает сопоставление регистров Unicode, а не только ASCII
  • Новый метод Regexp # match?, Который является более быстрой логической версией Regexp # match.
  • Обнаружение взаимоблокировок потоков теперь показывает потоки с их обратной трассировкой и зависимостями.

Несколько заметных изменений в Ruby 2.5.0 включают в себя операторы rescue и обеспечения, которые автоматически используют окружающий блок do-end (меньше необходимости в дополнительных блоках begin-end ), цепочку методов с yield_self , поддержку покрытия ветвей и измерения покрытия методов, а также упрощение Преобразования хэша с помощью Hash # slice и Hash # transform_keys. Вдобавок к этому добавлено множество улучшений производительности, таких как более быстрая передача блоков (в 3 раза быстрее), более быстрые мьютексы, более быстрые шаблоны ERB и улучшения некоторых методов конкатенации.

Несколько заметных изменений в Ruby 2.6.0 включают экспериментальный JIT -компилятор и RubyVM :: AbstractSyntaxTree (экспериментальный).

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

Рубин 3

Ruby 3.0.0 был выпущен на Рождество 2020 года. Он известен как Ruby 3x3. Одна из его основных целей состояла в том, чтобы переключить интерпретатор на компилятор Just-In-Time, чтобы сделать программы быстрее.

Ruby 3.1 планируется выпустить на Рождество 2021 года.

Таблица версий

Версия Последняя крошечная версия Дата первого выпуска Конец фазы поддержки Конец фазы обслуживания безопасности
Старая версия, больше не поддерживается: 1.0 NA 1996-12-25 NA NA
Старая версия, больше не поддерживается: 1,8 1.8.7-p375 2003-08-04 2012-06 2014-07-01
Старая версия, больше не поддерживается: 1.9 1.9.3-p551 2007-12-25 2014-02-23 2015-02-23
Старая версия, больше не поддерживается: 2.0 2.0.0-p648 2013-02-24 2015-02-24 2016-02-24
Старая версия, больше не поддерживается: 2.1 2.1.10 2013-12-25 2016-03-30 2017-03-31
Старая версия, больше не поддерживается: 2.2 2.2.10 2014-12-25 2017-03-28 2018-03-31
Старая версия, больше не поддерживается: 2.3 2.3.8 2015-12-25 2018-06-20 2019-03-31
Старая версия, больше не поддерживается: 2,4 2.4.10 2016-12-25 2019-04-01 2020-04-01
Старая версия, больше не поддерживается: 2,5 2.5.9 2017-12-25 2021-04-05 2021-04-05
Старая версия, но все еще поддерживается: 2,6 2.6.8 2018-12-25 2021-04-05 2022-04-05
Старая версия, но все еще поддерживается: 2,7 2.7.4 2019-12-25 TBA TBA
Текущая стабильная версия: 3.0 3.0.2 2020-12-25 TBA TBA
Будущий выпуск: 3.1 3.1.0 2021-12-25 TBA TBA
Легенда:
Старая версия
Старая версия, все еще поддерживается
Последняя версия
Последняя предварительная версия
Будущий выпуск

Семантика и философия

Юкихиро Мацумото , создатель Ruby

Мацумото сказал, что Ruby разработан для повышения продуктивности и развлечения программистов в соответствии с принципами хорошего дизайна пользовательского интерфейса . На конференции Google Tech Talk в 2008 году Мацумото заявил: «Я надеюсь, что Ruby поможет каждому программисту в мире быть продуктивным, получать удовольствие от программирования и быть счастливым. Это основная цель языка Ruby». Он подчеркивает, что при проектировании систем особое внимание следует уделять человеческим, а не компьютерным потребностям:

Часто люди, особенно компьютерные инженеры, сосредотачиваются на машинах. Они думают: «Делая это, машина будет работать быстрее. Делая это, машина будет работать более эффективно. Делая это, машина будет что-то что-то делать». Они сосредотачиваются на машинах. Но на самом деле нам нужно сосредоточиться на людях, на том, как люди заботятся о программировании или управлении приложениями машин. Мы мастера. Они рабы.

Мацумото сказал, что его основная цель дизайна заключалась в том, чтобы создать язык, который ему самому нравилось использовать, за счет минимизации работы программиста и возможной путаницы. Он сказал, что не применял принцип наименьшего удивления (POLA) к дизайну Ruby; в ходе обсуждения в группе новостей comp.lang.ruby в мае 2005 года Мацумото попытался дистанцировать Ruby от POLA, объясняя это тем, что, поскольку любой выбор дизайна будет для кого-то неожиданным, он использует личный стандарт при оценке неожиданности. Если этот личный стандарт останется неизменным, то для тех, кто знаком с ним, будет мало сюрпризов.

Мацумото так определил это в интервью:

У каждого индивидуальное прошлое. Кто-то может прийти из Python, кто-то из Perl, и они могут быть удивлены различными аспектами языка. Затем они подходят ко мне и говорят: «Меня удивила эта особенность языка, поэтому Ruby нарушает принцип наименьшего удивления». Ждать. Ждать. Принцип наименьшего удивления подходит не только вам. Принцип наименьшего удивления означает принцип наименьшего моего удивления. И это означает принцип наименьшего удивления после того, как вы очень хорошо изучите Ruby. Например, я был программистом на C ++, прежде чем начал разрабатывать Ruby. Два-три года я программировал исключительно на C ++. И после двух лет программирования на C ++ меня это все еще удивляет.

Ruby объектно-ориентирован : каждое значение является объектом, включая классы и экземпляры типов, которые многие другие языки обозначают как примитивы (например, целые числа , логические значения и « null »). Переменные всегда содержат ссылки на объекты. Каждая функция - это метод, и методы всегда вызываются для объекта. Методы, определенные в области верхнего уровня, становятся методами класса Object. Поскольку этот класс является предком любого другого класса, такие методы можно вызывать для любого объекта. Они также видны во всех областях, эффективно выполняя роль «глобальных» процедур. Ruby поддерживает наследование с помощью динамической отправки , миксинов и одноэлементных методов (принадлежащих к одному экземпляру и определенных для него, а не определяемых в классе). Хотя Ruby не поддерживает множественное наследование , классы могут импортировать модули как миксины.

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

Согласно Ruby FAQ, синтаксис аналогичен Perl, а семантика аналогична Smalltalk , но сильно отличается от Python .

Функции

Синтаксис

Синтаксис Ruby в целом аналогичен синтаксису Perl и Python . Определения классов и методов сигнализируются ключевыми словами, тогда как блоки кода могут быть определены ключевыми словами или фигурными скобками. В отличие от Perl, переменные не обязательно начинаются с символа . При использовании сигил изменяет семантику области видимости переменной. Для практических целей нет различия между выражениями и утверждениями . Разрывы строк важны и считаются концом оператора; может использоваться точка с запятой. В отличие от Python, отступы не имеют значения.

Одно из отличий от Python и Perl заключается в том, что Ruby сохраняет все свои переменные экземпляра полностью приватными для класса и предоставляет их только через методы доступа ( attr_writer, attr_readerи т. Д.). В отличие от методов «получателя» и «установщика» других языков, таких как C ++ или Java , методы доступа в Ruby могут быть созданы с помощью одной строки кода с помощью метапрограммирования ; однако методы доступа также могут быть созданы традиционным способом C ++ и Java. Поскольку для вызова этих методов не требуются круглые скобки, легко преобразовать переменную экземпляра в полную функцию, не изменяя ни одной строки вызывающего кода или не выполняя какой-либо рефакторинг для достижения аналогичной функциональности для свойств C # и VB.NET. члены.

Дескрипторы свойств Python похожи, но требуют компромисса в процессе разработки. Если кто-то начинает в Python с использования общедоступной переменной экземпляра, а позже изменяет реализацию, чтобы использовать частную переменную экземпляра, предоставляемую через дескриптор свойства, внутренний код класса может потребовать корректировки для использования частной переменной, а не общедоступного свойства. . Дизайн Ruby требует, чтобы все переменные экземпляра были закрытыми, но также предоставляет простой способ объявления setи getметодов. Это соответствует идее о том, что в Ruby никогда нельзя напрямую обращаться к внутренним членам класса извне; скорее, человек передает сообщение классу и получает ответ.

Реализации

Рубиновый интерпретатор Маца

Исходный интерпретатор Ruby часто называют Ruby Interpreter или MRI Матца . Эта реализация написана на C и использует собственную виртуальную машину, специфичную для Ruby .

Стандартизированная и устаревшая реализация Ruby 1.8 была написана на C как однопроходный интерпретируемый язык .

Начиная с Ruby 1.9 и продолжая с Ruby 2.x и выше, официальным интерпретатором Ruby был YARV («Еще одна виртуальная машина Ruby»), и эта реализация заменила более медленную виртуальную машину, используемую в предыдущих выпусках MRI.

Альтернативные реализации

По состоянию на 2018 год существует ряд альтернативных реализаций Ruby, включая JRuby , Rubinius и mruby . Каждый использует свой подход: JRuby и Rubinius обеспечивают своевременную компиляцию, а mruby также обеспечивает опережающую компиляцию .

У Ruby есть три основных альтернативных реализации:

  • JRuby , смешанная реализация Java и Ruby, работающая на виртуальной машине Java . JRuby в настоящее время нацелен на Ruby 2.5.
  • TruffleRuby , реализация Java с использованием среды реализации языка Truffle с GraalVM
  • Rubinius , виртуальная машина с байт-кодом C ++, которая использует LLVM для компиляции в машинный код во время выполнения. Компилятор байт-кода и большинство основных классов написаны на чистом Ruby. Rubinius в настоящее время нацелен на Ruby 2.3.1.

Другие реализации Ruby включают:

  • MagLev , Smalltalk реализация , которая работает на GemTalk Systems " GemStone / S VM
  • mruby , реализация, предназначенная для встраивания в код C в том же ключе, что и Lua . В настоящее время его разрабатывают Юкихиро Мацумото и другие.
  • RGSS , или Ruby Game Scripting System, патентованная реализация, которая используется серией программного обеспечения RPG Maker для разработки игр и модификации движка RPG Maker.
  • julializer , переносчик (частичный) от Руби к Джулии . Его можно использовать для значительного ускорения, например, по сравнению с реализациями Ruby или JRuby (может быть полезно только для числового кода).
  • Topaz , реализация Ruby, написанная на Python
  • Opal , веб-интерпретатор, который компилирует Ruby в JavaScript.

Другими, ныне несуществующими реализациями Ruby были:

Зрелость реализаций Ruby обычно измеряется их способностью запускать фреймворк Ruby on Rails (Rails), потому что он сложен в реализации и использует множество специфических для Ruby функций. Момент, когда конкретная реализация достигает этой цели, называется «сингулярностью Rails». Эталонная реализация, JRuby и Rubinius могут запускать Rails без изменений в производственной среде.

Поддержка платформы

Первоначально Мацумото разрабатывал Ruby на базе Sony NEWS-OS 3.x, основанной на 4.3BSD , но позже перенес свою работу на SunOS 4.x и, наконец, на Linux .

К 1999 году было известно, что Ruby работает во многих различных операционных системах , включая NEWS-OS, SunOS, AIX , SVR4 , Solaris , NEC UP-UX , NeXTSTEP , BSD, Linux, Mac OS , DOS , Windows и BeOS .

Современные версии и реализации Ruby доступны во многих операционных системах, таких как Linux, BSD, Solaris, AIX, macOS , Windows, Windows Phone , Windows CE , Symbian OS , BeOS, OpenVMS и IBM i .

Язык программирования Ruby поддерживается рядом платформ облачного хостинга, таких как Jelastic , Heroku , Google Cloud Platform и другие.

Репозитории и библиотеки

RubyGems - менеджер пакетов Ruby. Пакет Ruby называется «жемчужиной» и может быть установлен через командную строку. Большинство драгоценных камней представляют собой библиотеки, хотя существует несколько приложений, таких как IDE . На RubyGems.org размещено более 10 000 драгоценных камней Ruby .

Многие новые и существующие библиотеки Ruby размещены на GitHub , сервисе, который предлагает размещение репозитория управления версиями для Git .

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

Смотрите также

использованная литература

дальнейшее чтение

внешние ссылки