Вышел Ruby 3.0.0 preview 1

Мы рады объявить о выходе Ruby 3.0.0-preview1.

Новая версия несет множество новых фич и улучшений производительности.

RBS

RBS – это язык описания типов в программах на Ruby. Тайп-чекеры, включая тайп-профайлеры и другие инструменты, поддерживающие RBS, смогут понимать программы на Ruby гораздо лучше при наличии определений RBS.

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

Ruby 3.0 поставляется вместе с гемом rbs, который позволяет парсить и обрабатывать определения типов на языке RBS.

Вот небольшой пример RBS.

module ChatApp
  VERSION: String

  class Channel
    attr_reader name: String
    attr_reader messages: Array[Message]
    attr_reader users: Array[User | Bot]              # `|` means union types, `User` or `Bot`.

    def initialize: (String) -> void

    def post: (String, from: User | Bot) -> Message   # Method overloading is supported.
            | (File, from: User | Bot) -> Message
  end
end

См. README гема.

Рактор (экспериментально)

Рактор – это абстракция параллельных вычислений, реализующая модель акторов, призванная дать возможность параллельных вычислений без заботы о потоковой безопасности.

Вы можете создать несколько ракторов и запустить их параллельно. Рактор обеспечивает потоковую безопасность параллельных вычислений тем, что не может иметь общих объектов с другими ракторами в обычном понимании. Коммуникация между ракторами обеспечивается передачей сообщений.

Рактор синтаксически ограничивает возможность совместного использования объектов (в случае одного Рактора разницы не будет).

Спецификация и реализация еще не устаканились и могут быть изменены в будущем, поэтому фича обозначена как экспериментальная и выдает предупреждение, когда создается Рактор.

Следующая небольшая программа вычисляет prime? двумя ракторами параллельно и делает это примерно в 2 раза быстрее на многоядерных машин.

require 'prime'

# n.prime? with sent integers in r1, r2 run in parallel
r1, r2 = *(1..2).map do
  Ractor.new do
    n = Ractor.recv
    n.prime?
  end
end

# send parameters
r1.send 2**61 - 1
r2.send 2**61 + 15

# wait for the results of expr1, expr2
p r1.take #=> true
p r2.take #=> true

см. doc/ractor.md.

Планировщик (экспериментально)

Thread#scheduler перехватывает блокирующие операции. Это обеспечивает легковесный параллелизм без изменения существующего кода.

Поддерживаемые на данный момент классы/методы:

  • Mutex#lock, Mutex#unlock, Mutex#sleep
  • ConditionVariable#wait
  • Queue#pop, SizedQueue#push
  • Thread#join
  • Kernel#sleep
  • IO#wait, IO#read, IO#write и смежные (#wait_readable, #gets, #puts и пр.).
  • IO#select не поддерживается.

На данный момент точкой входа является Fiber.schedule{...}, но это может измениться к моменту выхода Ruby 3.

В Async::Scheduler можете видеть тестовый планировщик. См. doc/scheduler.md. [Feature #16786]

ОСТОРОЖНО: Эта фича строго экспериментальна. Как сама она, так и ее имя будут меняться в пререлизах.

Другие значимые фичи

  • Правостороннее присваивание.

    fib(10) => x
    p x #=> 55
    
  • Объявление метода без end.

    def square(x) = x * x
    
  • Поиск по образцу.

    case ["a", 1, "b", "c", 2, "d", "e", "f", 3]
    in [*pre, String => x, String => y, *post]
      p pre  #=> ["a", 1]
      p x    #=> "b"
      p y    #=> "c"
      p post #=> [2, "d", "e", "f", 3]
    end
    
  • Hash#except теперь в stdlib.

    h = { a: 1, b: 2, c: 3 }
    p h.except(:a) #=> {:b=>2, :c=>3}
    
  • Просмотр памяти (экспериментально)

    • Это новое C-API для прямого обмена участками памяти, такими как числовой массив или битмап, между библиотеками нативных расширений. Библиотеки расширений также могут делиться метаданными об участках памяти, таких как форма, формат и пр. С помощью этих метаданных библиотеки расширений могут делиться даже многомерными массивами. Дизайн этой фичи был вдохновлен буферным протоколом Python.

Улучшения производительности

  • Много улучшений содержатся в MJIT. См. NEWS.

Другие важные изменения после 2.7

  • Именованные параметры отделены от остальных.
    • Код, который выдавал предупреждение на Ruby 2.7, больше работать не будет. См. новость.
    • Кстати, появилась возможность брать только ведущие аргументы.

      def method_missing(meth, ...)
        send(:"do_#{ meth }", ...)
      end
      
  • Фича $SAFE полностью убрана из языка; теперь это просто глобальная переменная.

  • Порядок отображения бектрейса был обращен в Ruby 2.5, но вернули как было. Теперь он как в Ruby 2.4; сначала пишется сообщение об ошибке и номер строки, где она произошла, а уже далее стек вызовов.

  • Обновлены некоторые стандартные библиотеки.
    • RubyGems 3.2.0.rc.1
    • Bundler 2.2.0.rc.1
    • IRB 1.2.6
    • Reline 0.1.5
  • Следующие гемы более не поставляются с языком. Устанавливайте их явным образом.
    • net-telnet
    • xmlrpc
  • Следующие гемы более не встроены в язык, а поставляются вместе с ним.
    • rexml
    • rss
  • Стандартные библиотеки переведены в вид встроенных гемов. Следующие гемы опубликованы на rubygems.org
    • abbrev
    • base64
    • English
    • erb
    • find
    • io-nonblock
    • io-wait
    • net-ftp
    • net-http
    • net-imap
    • net-protocol
    • nkf
    • open-uri
    • optparse
    • resolv
    • resolv-replace
    • rinda
    • securerandom
    • set
    • shellwords
    • tempfile
    • time
    • tmpdir
    • tsort
    • weakref

См. NEWS или коммиты.

В ходе этого 3385 файлов было изменено, 150159 вставок(+), 124949 удалений(-) после Ruby 2.7.0!

Пожалуйста, попробуйте Ruby 3.0.0-preview1 и дайте обратную связь!

Скачать

  • https://cache.ruby-lang.org/pub/ruby/3.0/ruby-3.0.0-preview1.tar.bz2

    SIZE: 15538340
    SHA1: 032697f3ace0a697cd72f68bac0032c31a8328d4
    SHA256: 013bdc6e859d76d67a6fcd990d401ed57e6e25896bab96d1d0648a877f556dbb
    SHA512: 3a6a6458d9c5f06555ab8705160f6b071f4dbe9d2a91cd7848852633657b495c480d74e4b2ff2cebddda556118d26bbb271160c989bc970bb1b5cb234e868d2f
    
  • https://cache.ruby-lang.org/pub/ruby/3.0/ruby-3.0.0-preview1.tar.gz

    SIZE: 17747808
    SHA1: 2842d2af2568d74c8d4071f5f536889a6b149202
    SHA256: ce8bd7534e7ec2a870b24d2145ea20e9bbe5b2d76b7dfa1102dbee5785253105
    SHA512: b94892951f842a1538f4b99022606ac2c0b5031f1ede7eef3833a8caa9ed63e9b22868509173bfefb406f263c65211db75597b152b61f49e5ba2a875fce63a27
    
  • https://cache.ruby-lang.org/pub/ruby/3.0/ruby-3.0.0-preview1.tar.xz

    SIZE: 12703060
    SHA1: 91d9fbe87504924148deeec90199d6ff4d7dcf56
    SHA256: aa7cce0c99f4ea2145fef9b78d74a44857754396790cd23bad75d759811e7a2a
    SHA512: dca5dcc965c434371947c100864090e29e649e19ae24b8bb2e88a534ebd8220c5a086035a999b1e8b1cd5ec154a6985a8d8dfea56095d712d62aeea7a2054f7d
    
  • https://cache.ruby-lang.org/pub/ruby/3.0/ruby-3.0.0-preview1.zip

    SIZE: 22002645
    SHA1: 4b5b61066373daf0a947d3fafe2645788504a164
    SHA256: a39a48ed9a8ca2c83d65d225a1bb3db331c6587a77ba156c20e630c1b4bfc23b
    SHA512: 10f6f28715a52093d7d9da82d1678147091b45e2f279e463626adea8efbf181485daa42565e5086057ffb45a097ffb8ff395c572b247b6b5da27d85933cf58a8
    

Немного рекламы 3.0.0-preview2

Мы планируем включить “тайп-профайлер”, который представляет собой фичу статического анализа типов. Ожидайте!

Что такое Ruby

Matz (Yukihiro Matsumoto) разработал первую версию Ruby в 1993, и на сегодня язык разрабатывается как Open Source. Он работает на множестве платформ и используется по всему миру, особенно в веб разработке.