<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://t8.lbstr.eu/index.php?action=history&amp;feed=atom&amp;title=Ruby</id>
	<title>Ruby - История изменений</title>
	<link rel="self" type="application/atom+xml" href="https://t8.lbstr.eu/index.php?action=history&amp;feed=atom&amp;title=Ruby"/>
	<link rel="alternate" type="text/html" href="https://t8.lbstr.eu/index.php?title=Ruby&amp;action=history"/>
	<updated>2026-11-03T16:42:38Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.43.9</generator>
	<entry>
		<id>https://t8.lbstr.eu/index.php?title=Ruby&amp;diff=4192&amp;oldid=prev</id>
		<title>127.0.0.1: /* Интересные факты */</title>
		<link rel="alternate" type="text/html" href="https://t8.lbstr.eu/index.php?title=Ruby&amp;diff=4192&amp;oldid=prev"/>
		<updated>2020-08-31T18:53:19Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Интересные факты&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;[[Файл:Ruby.png|thumb|Как перл, только красный]]&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Ruby&amp;#039;&amp;#039;&amp;#039; (рус. Рубин, транс. Руби, униз. Раби) — интерпретируемый (скриптовый) [[язык программирования]] общего назначения, а также {{Acronym|DSL|Domain-specific language - Предметно-ориентированный язык}} для Rails.&lt;br /&gt;
&lt;br /&gt;
== История ==&lt;br /&gt;
Некий [[расовый]] японский [[программист]] [[:w:Мацумото, Юкихиро|Юкихиро Мацумото]] aka Matz, несмотря на более чем десятилетний опыт разработки, так и не смог осилить ни один из скриптовых языков и, сославшись на их ущербность, создал свой собственный язык, состоящий почти полностью из ништяков, спиженных из других популярных языков, чего и не скрывает. При этом на данный момент языку уже 20 лет, а известен он стал буквально [[Недавно|последние несколько лет]], и то благодаря написанному на нем фреймворку Rails и наконец-то доведенной до ума документации.&lt;br /&gt;
&lt;br /&gt;
== Плюсы и минусы ==&lt;br /&gt;
&lt;br /&gt;
=== За что любят ===&lt;br /&gt;
* ООП, причем в стиле [[Java|SmallTalk]], а не [[C++|крестов]]&lt;br /&gt;
* Активное комьюнити&lt;br /&gt;
* Няшный синтаксис&lt;br /&gt;
* Высокая зарплата&lt;br /&gt;
* Поддержка кучи модных фич&lt;br /&gt;
* Rails&lt;br /&gt;
* Гемы, тысячи их (хотя по сравнению с другими языками, либ в рубях таки маловато)&lt;br /&gt;
* Можно пилить либы на [[C]], что выводит производительность приложения на космический уровень (если [[Выстрелить себе в ногу|не наговнокодить]])&lt;br /&gt;
* Поднимает [[ЧСВ]] пишущих на нем&lt;br /&gt;
&lt;br /&gt;
=== За что ненавидят ===&lt;br /&gt;
* Плохо работает на венде&lt;br /&gt;
* Отсутствие реальной многопоточности и этот ваш GIL [http://habrahabr.ru/post/189320/]&lt;br /&gt;
* Очень мало вакансий и 95% из них на рельсы [https://ru.wikipedia.org/wiki/Ruby_on_Rails]&lt;br /&gt;
* Родной интерпретатор MRI достаточно медленный, и умеет использовать только одно ядро процессора&lt;br /&gt;
* Жрет памяти, как не в себя&lt;br /&gt;
* Проект, написанный ранее на руби и получивший должное развитие, как правило, переписывается на [[java|жабу]] или скалу [http://carlosbecker.com/posts/twitter-drops-ruby-bullshit/]&lt;br /&gt;
* Нету нормальных доков на русском&lt;br /&gt;
* Высокий порог входа&lt;br /&gt;
* Минималистичная стандартная библиотека, из-за чего на любой чих приходится доставлять сторонние либы, каждая из которых, в свою очередь, зависит еще от десятка-двух, что приводит к настоящему аду зависимостей в проекте&lt;br /&gt;
* Стандартная библиотека, а вслед за ней и все остальные жутко любят менять API, что ломает не только обратную, но и прямую совместимость, причем в минорных версиях — проект, написанный на 2.1.5, вполне может не запуститься на 2.2.0&lt;br /&gt;
* Одиночное наследование без абстрактных классов и интерфейсов порою может вылезти боком&lt;br /&gt;
* Некоторые [[Малолетний долбоёб|новоиспеченные адепты]] настолько увлекаются переопределением всего и вся и конструированием классов на лету, что порождают тонны абсолютно нечитаемого кода в лучших традициях [[Perl]]&amp;#039;а&lt;br /&gt;
* [[Хипстер]]ский&lt;br /&gt;
&lt;br /&gt;
== Чем доставляет ==&lt;br /&gt;
Руби ценится в первую очередь за скорость [[PHP|разработки]], [[Python|синтаксис]], ориентированный на [[perl|рутину]], кучу [[C Sharp|готовых]] решений, а так же уникальное сочетание поддержки всякой функциональной [[Haskell|модноты]] и традиционного императивного [[C++|подхода]]. Встроенная в язык поддержка профайлеров и тестов заставляет здорово оргазмировать тех, кто знает, что это такое, и просто повышает ЧСВ у остальных. При этом степень задротства регулируется в зависимости от задач, а наличие хорошей документации на английском, а иногда и на русском, снижает порог входа до [[Pascal|минимума]]. Скорость работы скриптов на руби сливает аналогичным пистоновским всего в 7 из 10 [https://benchmarksgame-team.pages.debian.net/benchmarksgame/fastest/ruby.html тестов], что вполне вменяемый результат для [[Java|интерпрайзного]] языка. Ну а еще говорящие на [[Pure C|C]] могут высказаться [https://github.com/ruby/ruby тут], и если повезет, то стать соавтором языка.&lt;br /&gt;
&lt;br /&gt;
== Имплементации ==&lt;br /&gt;
Существует несколько вариантов интерпретаторов языка ruby, основным считается MRI, который пилит Matz.&lt;br /&gt;
&lt;br /&gt;
* MRI — Matz ruby implementation, является тем самым православным и расово верным руби интепретатором японца&lt;br /&gt;
* JRuby — Интерпретатор, выполняющий ruby код в JVM машине, за счет чего получает реальную многопоточность и возможность юзать ништяки из [[java|жабы]]. Используется, впрочем, редко, так как во-первых, теряется возможность юзать библиотеки, напиленные с рассчетом на MRI, а во-вторых, по отжиру памяти и тормознутости является бесспорным лидером среди большого семейства интерпретаторов, использующих JVM&lt;br /&gt;
* IronRuby — то же, что и JRuby, только под [[C#|.Net]]&lt;br /&gt;
* Rubinius — уже давно грозится показать все другим имплементациям кузькину мать, но на данный момент так и не взлетел, не смотря на большое кол-во инвестиций.&lt;br /&gt;
&lt;br /&gt;
== Rails ==&lt;br /&gt;
Веб-фреймворк некой компании &amp;lt;del&amp;gt;37signals&amp;lt;/del&amp;gt; Basecamp, [[внезапно]] вызвавшая интерес, как и к самому фреймворку, так и в целом к языку ruby. Бытует мнение, что, если б не рельсы, вполне вероятно, что о японской поделке никто бы и не узнал. На данный момент по праву считается одним из самых развитых веб-фреймворков, однако пальма первенства уже давно и успешно [[Полимеры|проебана]]: та же [[Python|питоновская]] Джанга развивается в разы быстрее и обрастает фичами чуть ли не каждый день, да и всякие [[PHP|похапешные]] поделки типа Symfony и Yii и даже серверный [[Javascript|жабоскрипт]] в лице Node.js уже обогнали Рельсы по популярности [http://tagline.ru/backend-frontend-frameworks-rating/].&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Рельсы любят&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
* За простоту и удобство&lt;br /&gt;
* Скорость разработки&lt;br /&gt;
* Не надо знать этот ваш [[SQL]], ведь есть удобный ActiveRecord&lt;br /&gt;
* Даже jquery ставится с помощью rubygems&lt;br /&gt;
* Поддержка таких [[ништяк]]ов как CoffeeScript, SASS, LESS из коробки&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Рельсы хейтят&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
* Рельсы решето&lt;br /&gt;
* Для масштабирования проекта на рельсах требуется вливание [[сотни нефти|тонн нефти]], алсо это проблема скорее интерпретатора MRI, чем веб-фрейморка и языка в целом&lt;br /&gt;
* Хоть сколько-нибудь серьезную работу с базой ActiveRecord не вывозит, и [[SQL]] учить таки приходится&lt;br /&gt;
* Кроме того ActiveRecord сам по себе демонстрирует не самый удачный подход к построению ORM, и при достаточно сложной структуре базы даже при условии не сильно большой нагрузки работать становится неудобно &lt;br /&gt;
* Разработка под windows = боль&lt;br /&gt;
&lt;br /&gt;
=== Рельсы — решето ===&lt;br /&gt;
Локальный мем в ruby комьюнити, носит схожий смысл с [[Плазма не падает|не падающей плазмой]]. Долгое время, рельсоводов не заботила ситуация с безопасностью: считалось, что уязвимости — удел [[php|пехапэ]] со всякими cms by Vasya Opasniy, а их это не касается. [[Внезапно]] это оказалось не так.&lt;br /&gt;
&lt;br /&gt;
==== Истоки ====&lt;br /&gt;
[[Файл:homakov.jpg|thumb|]]&lt;br /&gt;
Все началось, с того, что &amp;lt;del&amp;gt;[[ояш]]&amp;lt;/del&amp;gt; [[школьник]] из [[Эта страна|этой страны]] Егор Хомяков обнаружил уязвимость, и отправил репорт в багтрекер rails на гитхабе. Но был послан контрибьютарами, после чего разгневанный школьник решил устроить [[экстерминатус]] и вообще показать кузькину мать. И таки сделал это, используя ту же самую уязвимость в гитхабе, который в качестве веб-фрейморка использует… да, анон, таки рельсы. После чего Егор смог отправить коммит в репозиторий rails, несмотря на то, что как таковых прав на данное действие он не имел. От этого и гитхаб, и контрибьюторы рельсов начали [[срать кирпичами]], [[Школьник|школьника]] на время забанили, а багу таки исправили.&lt;br /&gt;
&lt;br /&gt;
==== Продолжение банкета ====&lt;br /&gt;
В целом весь последующий 2013 год, параллельно с 4 версией рельсов, пилились периодические секьюрити фиксы. А очередное обновление рельсов всегда сопровождалось фразами: решето, друшлак, рельсы решето, etc…&lt;br /&gt;
&lt;br /&gt;
== Холивары ==&lt;br /&gt;
&lt;br /&gt;
=== Ruby vs Python ===&lt;br /&gt;
Так как оба языка довольно похожи, то периодически какой-нибудь пэхапэшник, уставший от постоянных унижений со стороны программистов, решается перейти на что-то крутое и, естественно, задает вопрос на какой-нибудь [[хабр]]е [http://toster.ru/q/49580], [http://toster.ru/q/17596]. В качестве аргументов пистонщики традиционно тыкают в свою интерпрайзность, серьезность, четкий code-style и производительность (весьма относительную, но в сравнении с рубями таки нехилую). На что рубисты отвечают, что джанга хуйня, а рельсы рулят, и не забывают про давнюю боль пистона со второй и третьей версией, от которой питоноводы так и не избавились (справедливости ради, в рубях при переходе даже между минорными версиями можно огрести достаточно похожие проблемы). Потом обычно идут унылые обсуждения синтаксиса, отступов питона и библиотек. Стоит отметить, что в плане web-разработки большой разницы между этими двумя языками нет, а ни для чего, кроме этого, Ruby, в отличии от Python&amp;#039;а, практически не используется.&lt;br /&gt;
&lt;br /&gt;
=== Rails != Ruby ===&lt;br /&gt;
[[Файл:Rails.jpg|thumb|75px|Тентакля]]&lt;br /&gt;
{{Q|Ruby? Это такой DSL для написания Rails-приложений?| lor}}&lt;br /&gt;
&lt;br /&gt;
Несмотря на всю крутость раби как языка, не существует ни одной вакансии отличной от рельс (иногда может идти вместе с синатрой). При этом в качестве значимости фреймворка обычно указывается, что когда-то [[твиттер]] работал на сильно переписанных под себя рельсах, правда есть еще и [https://github.com/ гитхаб]. Проектов же, написанных на самом раби, в природе достаточно мало, даже на [http://www.cyberforum.ru/ cyberforum] он лежит в разделе веб-языков, хотя это язык общего назначения, что символизирует и отлично троллит начинающих рельсоводов. Сами же рельсы ни чуть не менее няшные и удобные, чем раби, задают тренды среди веб-фреймворков и охуеть как тормозят даже на очень мощном железе, что лечится кэшированием всего и вся либо же переходом на [http://www.sinatrarb.com/ синатру].&lt;br /&gt;
&lt;br /&gt;
== Ruby и Windows ==&lt;br /&gt;
Сущий ад и погибель ждут любого, кто попытается разрабатывать на этом языке под вендой. Суть в том, что Ruby разрабатывался как язык максимально открытый, и родная платформа для него Linux. Большинство гемов (местное название библиотек) просто не тестируется под вендой. Инсталлятор языка выглядит как убогий костыль, содержит в себе вперемешку исходники интерпретатора, компилятор Си и еще какие-то хаки, которые не работают, если, например, в пути к папке установки есть кириллица или пробелы (причем ошибка выяснится только при попытке установить какой-нибудь гем, написанный на Си и требующий нормального компилятора). А, например, драйвер для Mysql вообще не работает, пока не перекинешь dll из папки мускула в папку с гемами. Можно, конечно, использовать SQLite, но кому он нахуй нужен. А также отправка почты, настройка веб-сервера, отличного от стандартного, и еще тонна всяких проблем, о которых лучше не знать. Поэтому грамотный анон заранее ставит виртуальную машину с [[Ubuntu|бубунтой]] и наслаждается разработкой под рельсы, ну или качает готовый образ с настроенным окружением [https://github.com/rails/rails-dev-box].&lt;br /&gt;
&lt;br /&gt;
== Что в итоге ==&lt;br /&gt;
[[На самом деле|В реальности]] же руби вполне вменяемый язык с высокой зарплатой, почти как у жабы и шарпа, при этом в разы их няшнее и продуманнее, с кучей синтаксического сахара и годным, хоть и относительно небольшим комьюнити. Но, несмотря на простоту и юзерфрендливость, сделать что-то годное без полного понимания, что ты делаешь не получится: нужно будет читать и вникать в [[манул]]ы [[ENGLISH MOTHERFUCKER DO YOU SPEAK IT|на английском]]. Свой вклад вносит коварный [[Python]] — порог входа ниже, комьюнити сильно больше, как следствие предыдущего — наличие [[Over 9000|сотен]] [[Свистелки и перделки|библиотек и фреймворков]] на все случаи жизни, при этом область применения не ограничивается одним только вебом, а по количеству вакансий одна только Джанга сопоставима со всеми рубями. И все, чем придется пожертвовать за эту радость — это отсутствие некоторого синтаксического сахара, что на самом деле заставляет писать более однообразный и, соответственно, понятный код. [[Profit]] жи. И самое главное, почему начинающий быдлокодер не любит руби — это то, что поднять визитку и правда быстрее и легче на пыхе, а объяснить заказчику, почему первокурсник Вася может сделать сайт за 5к рублей, а ты за 50к, очень сложно. При этом, когда твой уровень и уровень твоих заказчиков поднимается до такого, что за указание пыха в твоем резюме будут громко смеяться, ты уже вряд ли захочешь вообще программировать, и скорее всего будешь каким-нибудь анал-итиком или менеджером проекта, которому уже глубоко похуй, на чем там пишут его прогеры, да и зарплата там уже совсем другая. С другой стороны, если ты [[Нуб|джуниор]] и готов учиться, то руби научит писать более-менее красивый код. Ну или не научит ничему.&lt;br /&gt;
&lt;br /&gt;
== Примеры использования ==&lt;br /&gt;
 {{NSFW|title=&amp;#039;&amp;#039;&amp;#039;Хеллоу ворд&amp;#039;&amp;#039;&amp;#039;|content=&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
puts &amp;#039;Hello World&amp;#039; # Обычный вариант, это, кстати, комментарий&lt;br /&gt;
&lt;br /&gt;
p &amp;#039;Hello World&amp;#039; # Короткий, перлота&lt;br /&gt;
&lt;br /&gt;
printf(&amp;quot;%d&amp;quot;,10); # Чистый Си&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;}}&lt;br /&gt;
{{NSFW|title=&amp;#039;&amp;#039;&amp;#039;Синглтон&amp;#039;&amp;#039;&amp;#039;|content=&lt;br /&gt;
На жабе&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class Singleton {  &lt;br /&gt;
   private Singleton() {}&lt;br /&gt;
 &lt;br /&gt;
   private static class SingletonHolder {  &lt;br /&gt;
      public static final Singleton instance = new Singleton();  &lt;br /&gt;
   }  &lt;br /&gt;
 &lt;br /&gt;
   public static Singleton getInstance()  {  &lt;br /&gt;
      return SingletonHolder.instance;  &lt;br /&gt;
   }  &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
На руби, прогресс налицо&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
class JavaFucker&lt;br /&gt;
   include Singleton &lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
{{NSFW|title=&amp;#039;&amp;#039;&amp;#039;Циклы, [http://www.tutorialspoint.com/ruby/ruby_loops.htm moar]&amp;#039;&amp;#039;&amp;#039;|content=&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
10.times { p &amp;#039;ima loop yo&amp;#039;}&lt;br /&gt;
&lt;br /&gt;
for i in 0..10&lt;br /&gt;
   p &amp;quot;another loop #{i}&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
#это не цикл! это замыкание (closure)&lt;br /&gt;
#а то что оно похоже на цикл и есть его главная синтаксическая прелесть&lt;br /&gt;
#в отличие от богомерзких сотен вложенных фунуций как в этом вашем JavaScript&amp;#039;е&lt;br /&gt;
#yield, господа!&lt;br /&gt;
&lt;br /&gt;
(0..10).each do |i|&lt;br /&gt;
   puts &amp;quot;Python sucks #{i} times&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;}}&lt;br /&gt;
{{NSFW|title=&amp;#039;&amp;#039;&amp;#039;Добавление методов к существующему объекту&amp;#039;&amp;#039;&amp;#039;|content=&lt;br /&gt;
Способ 1&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
obj = SomeObject.new # Создание и инициализация объекта&lt;br /&gt;
&lt;br /&gt;
def obj.new_method # Добавление нужных методов&lt;br /&gt;
  &amp;quot;do some things&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Способ 2&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
module AdditionalMethods # Создание модуля с нужными методами&lt;br /&gt;
  def new_method&lt;br /&gt;
    &amp;quot;do some things&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
obj = SomeObject.new&lt;br /&gt;
obj.extend(AdditionalMethods) # Пристыковали методы из AdditionalMethods к одному объекту &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Интересные факты ==&lt;br /&gt;
* Хоть автор языка и против написание гуев на руби, клепать формочки можно на [http://rubyforge.org/projects/korundum/ QT] и [http://wxruby.rubyforge.org/ WxWidget]&lt;br /&gt;
* На руби можно писать игры [https://github.com/jlnr/gosu Gosu]&lt;br /&gt;
* ВНЕЗАПНО является скриптовым языком плагинов для [[:w:RPG Maker]] по VX ACE включительно и вполне успешно работает там под виндой. Более поздние версии (начиная с MV) таки сдались под напором [[Web 2.0]] и используют [[JavaScript]]&lt;br /&gt;
* Только False и nil возвращают False, 0 == True, в отличие от Жабы, Цэ и вообще практически всех мейнстримовых языков, так что зачастую доставляет примерно такой же разрыв шаблона, как нумерация массивов с единицы в [[Pascal]]е.&lt;br /&gt;
* Для руби есть интерпретатор, [http://rubini.us/ написанный на руби]&lt;br /&gt;
* [http://ru.wikibooks.org/wiki/Ruby/%D0%96%D0%B0%D1%80%D0%B3%D0%BE%D0%BD Жаргон]&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;br /&gt;
* [https://www.ruby-lang.org/ru/ Официальный сайт языка, теперь и на русском]&lt;br /&gt;
* [http://rubygems.org/ 67 000 дополнений!]&lt;br /&gt;
* [https://www.bloc.io/ruby-warrior/ Ruby Warrior — интерактивный учебник]&lt;br /&gt;
* [http://blog.topolyan.com/tag/ruby/ Довольно годные статьи по Ruby на русском]. На других страницах много инфы по RoR и прочему.&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[Хипстер]]&lt;br /&gt;
* [[perl]]&lt;br /&gt;
* RUBY - англоязычный [http://vocaloid.wikia.com/wiki/VOCALOID вакланастер] на четвёртый движок, ещё до своего выхода в свет успевший повидать скандал по поводу своей [[расово]] латиноамериканской мордашки&amp;lt;sup&amp;gt;[http://vocaloid.wikia.com/wiki/RUBY_(VOCALOID4)викия]&lt;br /&gt;
&amp;lt;/sup&amp;gt;&lt;br /&gt;
{{Языки программирования}}&lt;br /&gt;
{{Япония}}&lt;br /&gt;
&lt;br /&gt;
[[w:Ruby]] [[en.w:Ruby (programming language)]] [[ae:Ruby]]&lt;/div&gt;</summary>
		<author><name>127.0.0.1</name></author>
	</entry>
</feed>