пʼятниця, 27 грудня 2013 р.

Реліз мови програмування Ruby 2.1

Після десяти місяців розробки представлено реліз мови програмування Ruby 2.1. Ruby — потужна й динамічно об'єктно-орієнтована мова програмування, що відрізняється високою ефективністю розробки програм і увібрала в себе кращі риси Perl, Java, Python, Smalltalk, Eiffel, Ada і Lisp. Код проекту розповсюджується під ліцензіями BSD («2-clause BSDL») і «Ruby», яка посилається на останній варіант ліцензії GPL і повністю сумісна з GPLv3. Ruby 2.1 продовжує розвиток гілки 2.0 при збереженні зворотної сумісності.

Додатково повідомляється про затвердження нової схеми нумерації версій Ruby, яка буде застосована в наступних випусках. Номер версії буде визначатися в форматі MAJOR.MINOR.TEENY.PATCH, де значення MAJOR буде збільшуватися при значних порушеннях зворотної сумісності. Нові MINOR-випуски планується формувати раз на рік, при цьому в даних випусках допускається порушення зворотної сумісності API. У TEENY-випусках, які виходитимуть раз на 2-3 місяці, будуть усуватися помилки та вразливості при повному збереженні сумісності API. Значення PATCH відображатиме число комітів з моменту минулого мінорного випуску.

Основні зміни в Ruby 2.1:

  • Підтримка локального кешування методів у VM, замість використання глобального кешу;
  • Новий збирач сміття RGenGC;
  • Розширення та стабілізація можливостей конструкції «Refinements» (Module#refine) для підвищення безпеки внесення змін в код на льоту;
  • Підтримка нового синтаксису числових і комплексних літералів («42r» для Rational (42, 1), 3.14r» для 3.14.rationalize, «42i» для Complex (0, 42), «42ri» для Complex (0, 42r));
  • Значення за замовчуванням для аргументів ключових слів тепер можуть бути пропущені (наприклад, замість «def foo (a:10)» можна вказати «def foo (a:)»);
  • Змінено значення, що повертається за замовчуванням для конструкцій «def» (замість nil повертає ім'я методу, наприклад, «def foo() end» поверне «:foo»);
  • Для прискорення обчислень з даними типу Bignum задіяна бібліотека GMP;
  • Нові методи String#scrub і String#scrub! для перевірки та виправлення некоректної строкової послідовності;
  • Новий метод Socket.getifaddrs, асоційований з функцією getifaddrs() стандартної системної бібліотеки;
  • Оновлення RDoc 4.1.0 і RubyGems 2.2.0;
  • Оптимізація рядків «літерал». Freeze на рівні VM (наприклад, вказівка ​​рядка як «bar»f дозволяє заморозити дане значення і працювати з нею без створення нової копії рядка при виконанні кожної опреаціі);
  • У класи Array і Enumerable додані нові методи Array#to_h і Enumerable#to_h для перетворення масиву/списку з пар ключів і значень в хеш;
  • Підтримка методу Exception#cause, що дозволяє звернутися до попереднього виключення при обробці нового винятку;
  • Оновлення бібліотек BigDecimal, JSON, NKF, Rake, RubyGems і RDoc;
  • Видалення curses зі стандартного набору бібліотек (бібліотеку curses винесено в окремий gem curses).

Реліз web-фреймворка Ruby on Rails 4.0

Представлено реліз MVC (Model-View-Controller) web-фреймворка Ruby on Rails 4.0. У новій гілці припинена підтримка Ruby 1.8.7 і забезпечена можливість роботи тільки при наявності Ruby 1.9.3. При цьому рекомендованою версією є Ruby 2.0.

Ключові поліпшення, у випуску Ruby on Rails 4.0:

  • У новій версії Rails основну увагу приділено розвитку засобів, що дозволяють створювати сучасні web-додатки без ручного створення клієнтських JSON-обробників на JavaScript. При цьому класична підтримка JSON-сервера збережена і може бути використана для розробки клієнтів за допомогою бібліотек Ember.js, Backbone.js і Angular.js;
  • Представлена ​​система кешування «Російська матрьошка», яка дозволяє кешувати дані з урахуванням часу життя ключів і автоматичним управлінням залежностей для вкладених шаблонів;
  • Прискорення javascript-коду, що виконується на стороні клієнта, за рахунок застосування технології Turbolinks, що припускає компоновку клієнтської частини web-додатку у вигляді однієї сторінки, в якій пов'язаних з посиланнями контент завантажується і відображається динамічно через використання JavaScript-обробника, на льоту замінює вміст тіла сторінки, без перезавантаження самої сторінки з сервера;
  • Підтримка декларативних ETags дозволяє спростити контроль за актуальністю завантажених по HTTP даних;
  • Реалізація модуля ActionController::Live з підтримкою live-режиму для постійної потокової передачі даних через задані інтервали часу в рамках постійно відкритих з'єднань;
  • Забезпечення з коробки роботи c серверами, що працюють в багатопотоковому режимі, без необхідності налаштування config.threadsafe;
  • Численні поліпшення класу Active Record. Зокрема поліпшені засоби для зазначення діапазонів і забезпечена більш цілісна структура запитів;
  • Ускладнено налаштування безпеки, що використовуються за замовчуванням. Включено екранування HTML-теґів за замовчуванням. Вжито патчі для посилення безпеки, надані компанією Google. Звужене охоплення значень, що підпадають під дію Match;
Наступні компоненти винесені з базової поставки і тепер поширюються у вигляді окремих gem-модулів:
  • Динамічні методи пошуку на основі хешів (Github);
  • Масове призначення захищених властивостей для моделей Active Record (Github);
  • ActiveRecord::SessionStore (Github);
  • Active Record Observers (Github);
  • Active Resource (Github);
  • Action Caching (Github);
  • Page Caching (Github);
  • Sprockets (Github);
  • Тести продуктивності (Github);

четвер, 26 грудня 2013 р.

Реліз Phusion Passenger 4.0

Після двох з половиною років розробки представлена ​​нова гілка проекту Phusion Passenger 4.0 (проект спочатку розвивався під іменами mod_rails і mod_rack), сервера для швидкого розгортання web-додатків на мові Ruby, які використовують інтерфейс Rack (наприклад, Ruby on Rails), а також WSGI-додатків на мові Python.


Сервер оформлений у вигляді модулів для http-серверів Apache та Nginx, і дозволяє легко запустити в рамках одного http-сервера кілька незалежних web-платформ на базі WSGI або Rack, достатньо просто скопіювати файли web-додатку в спеціальну директорію, без необхідності окремого конфігурування. Проект позиціонується як стабільний і готовий для промислового використання. Зокрема, Phusion Passenger вже застосовується на сайтах New York Times, Symantec і Pixar. Код проекту поширюється під ліцензією MIT.

Серед доданих в гілці 4.0 нововведень відзначається підтримка Python WSGI; можливість використання для проектів різних версій Ruby; підтримка багато-поточності; переклад ядра пакету на нову систему обробки подій, подібну до Nginx і Node.js; поліпшені засобів діагностики помилок; підтримка Ruby 2.0, JRuby і Rubinius; підтримка API захоплення сокетів в Rack; система запуску фонових завдань, які тривало виконуються, та працюють поза циклу обробки запитів клієнта (наприклад, таким способом можна виконувати збирачі сміття). У наступному випуску очікується реалізація засобів для розгортання додатків для Node.js.

Реліз мови програмування Ruby 2.0

Рівно через 20 років з моменту заснування проекту представлено перший реліз нової гілки мови програмування Ruby 2.0. Ruby — потужна і динамічна об'єктно-орієнтована мова програмування, яка відрізняється високою ефективністю розробки програм, що увібрала в себе кращі риси Perl, Java, Python, Smalltalk, Eiffel, Ada і Lisp. Код проекту розповсюджується під ліцензіями BSD («2-clause BSDL») і «Ruby», яка посилається на останній варіант ліцензії GPL і повністю сумісна з GPLv3.


Ruby 2.0 продовжує розвиток гілки 1.9.x, не містить революційних змін і, незважаючи на ряд істотних нововведень, зберігає сумісність з Ruby 1.9.3. За словами розробників, завдяки уважному відношенню до забезпечення сумісності з існуючими додатками, міграція з гілки 1.9 на 2.0 повинна пройти помітно легше, ніж з 1.8 на 1.9. Також наголошується, що на відміну від 1.9.0 випуск 2.0.0 є повністю стабільним і готовим для впровадження.

Перший випуск Topaz, високопродуктивної реалізації Ruby, написаної мовою Python

Анонсовано перший випуск проекту Topaz, в рамках якого створено нову реалізацію мови Ruby. Написана мовою RPython (підмножина мови Python зі статичною типізацією) та використовує напрацювання проекту PyPy. Код Topaz поширюється під ліцензією BSD. Ключовими цілями проекту є забезпечення високої продуктивності і простота реалізації. Готові бінарні збірки створені для Mac OS X, Linux і Windows.

Topaz базується на ідеї використання JIT-компілятора, на льоту транслює деякі елементи в машинний код, в поєднанні з ефективним складальником сміття. Зазначені елементи дозволили добитися значного приросту продуктивності та помітно обігнати за швидкістю традиційний інтерпретатор Ruby. Topaz націлений на забезпечення сумісності з Ruby 1.9.3, але поки реалізація не є повною і проект позиціонується як експериментальна розробка, ще не готова для використання в реальних проектах.

Відзначається відсутність багатьох модулів стандартної бібліотеки і вбудованих методів, немає підтримки приватних методів, FFI і багато-поточності. Проте вже доступні майже всі базові можливості мови, включаючи класи, блоки, різні вбудовані типи, методи і багато іншого. Наступні кілька місяців планується присвятити забезпеченню роботи стандартних модулів і класів, а також домогтися сумісності з модулями, написаними на мові Сі, що дозволить довести Topaz до придатності та виконання користувальницьких Ruby-додатків.

Реліз JRuby 1.7.0

Після півтора року розробки представлено реліз JRuby 1.7.0, реалізації мови Ruby, написаної цілком на Java і призначеної для виконання у віртуальній машині JVM. Завдяки використанню JIT-компілятора, продуктивність JRuby не поступається, а в деяких ситуаціях навіть випереджає, стандартний інтерпретатор Ruby, написаний на мові Сі. JRuby дозволяє розробникам на мові Java звертатися до Ruby-бібліотек (наприклад, Ruby on Rails) і вбудовувати Ruby-код в Java-програми. Розробники на мові Ruby, в свою чергу, можуть отримати доступ до всіх бібліотек класів Java.

Ключовим нововведенням JRuby 1.7.0 є надання за замовчуванням режиму сумісності з гілкою Ruby 1.9, з урахуванням особливостей випуску мови Ruby 1.9.3. Підтримка режиму сумісності з Ruby 1.8.7 залишена в якості опції. В даний час ще спостерігаються поодинокі можливості Ruby 1.9, які поки не підтримуються в JRuby, але їх планується реалізувати в найближчих коригувальних випусках JRuby 1.7.x. В цілому режим сумісності з Ruby 1.9 оцінений як стабільний і придатний для повсякденного застосування.

Серед інших поліпшень JRuby 1.7.0:

  • Задіяна, але поки не включена за замовчуванням, інструкція InvokeDynamic, що з'явилася в Java 7, та дозволяє досягти для динамічних мов, що працюють під управлінням JVM, рівня продуктивності мови Java;
  • Набір стандартних бібліотек Ruby синхронізований з версій 1.9.3p286;
  • Вирішено безліч проблем сумісності з гілкою 1.9.x;
  • Збільшена продуктивність і покращено виконання паралельних операцій;
  • Припинена підтримка Java 5;
  • Покращена підтримка Solaris, а також Linux на платформі ARM;
  • Зроблено оновлення Rubygems 1.8.24 і Rake 0.9.2.2.

Puma — новий високопродуктивний http-сервер для додатків мовою Ruby

Компанія Engine Yard, найбільший хостер web-проектів на мові Ruby, який виконує роботу по супроводу старих гілок Ruby, представила новий відкритий проект Puma, в рамках якого розвивається повністю перероблений форк проекту Mongrel, що відрізняється орієнтацією на забезпечення максимальної продуктивності і підтримки обслуговування великої кількості паралельних запитів. Незважаючи на те, що Puma створений на базі Mongrel, на даний час, крім коду HTTP-парсеру, стара кодова база повністю переписана. Безпосередньо розбором протоколу займається написаний мовою Сі компонент Ragel, всі оброблювані запити поміщаються в відособлений пул потоків, що забезпечує повноцінне розпаралелювання і задіяння всіх доступних в системі процесорних ядер. Код проекту поширюється під ліцензією BSD.

Puma може використовуватися в ролі платформи для розгортання додатків на базі Ruby on Rails і окремих додатків, що використовують інтерфейс Rack. Puma близький за можливостями до Mongrel і Webrick, і може виступати в якості їх прозорої заміни. Підтримується робота з різними реалізаціями Ruby, такими як Rubinius, JRuby і MRI. Для класичної реалізації MRI, нездатної виконувати одночасно кілька потоків через наявність глобального блокування, реалізована підтримка розпаралелювання на рівні введення/виводу. Для Rubinius і JRuby можливе повноцінне розпаралелювання на рівні ниток.


На графіку представлено відношення кількості оброблених у секунду запитів до кількості одночасних запитів (більше-краще); позначка KA позначає тести, в яких клієнти використовували keepalive запити.