LINUX.ORG.RU

Ruby 3.0.0

 ,

Ruby 3.0.0

1

3

Вышел новый релиз динамического рефлективного интерпретируемого высокоуровневого объектно-ориентированного языка программирования
Ruby версии 3.0.0. По заявлению авторов, зафиксировано утроение производительности (по тесту Optcarrot), таким образом достигнута поставленная в 2016 году цель, описанная в концепции Ruby 3x3.

Для достижения этой цели в ходе разработки уделили внимание таким направлениям:

  • Performance — производительность
    • MJIT — сокращение времени и уменьшение размера генерируемого кода
  • Concurrency — обеспечение параллелизма
    • Ractor — начальная поддержка новой модели акторов
    • Fiber Scheduler — планировщик fiber-потоков
  • Typing — статический анализ кода
    • RBS — инструмент для аннотации типов
    • TypeProf — новый анализатор типов

>>> Подробности

★★★★★

Проверено: cetjs2 ()
Последнее исправление: atsym (всего исправлений: 19)
Ответ на: комментарий от monk

сравни RSpec в Ruby и unittest в Python

unittest ужасен, pytest хотя бы надо брать для сравнения, но он тоже так себе. А что есть крутого в RSpec?

alienclaster ★★★
()
Ответ на: комментарий от anonymous

А switch'и ценны диапазонами:

case capacity
when 0
  "You ran out of gas."
when 1..20
  "The tank is almost empty. Quickly, find a gas station!"
when 21..70
  "You should be ok for now."
when 71..100
  "The tank is almost full."
else
  "Error: capacity has an invalid value (#{capacity})"
end

saahriktu ★★★★★
()
Последнее исправление: saahriktu (всего исправлений: 1)
Ответ на: комментарий от saahriktu

Дык диапазон и в питоновском ифе есть:

if   (x == 0):         print("You ran out of gas.")
elif (1 <= x <= 20):   print("The tank is almost empty. Quickly, find a gas station!")
elif (21 <= x <= 70):  print("You should be ok for now.")
elif (71 <= x <= 100): print("The tank is almost full.")
else: print(f"Error: capacity has an invalid value {x}")
Вроде там еще как-то через x in list(range(1,20)) сделать можно.

mydibyje ★★★★
()
Ответ на: комментарий от monk

Под капотом там оптимизации есть всякие и он только выглядит object-like, на самом деле это специальная сущность.

Exmor_RS ★★★
()
Ответ на: комментарий от alienclaster

Читабельность. Пусть pytest. Сравни:

RSpec.describe Calculator do
  describe '#add' do
    it 'returns the sum of its arguments' do
      expect(Calculator.new.add(1, 2)).to eq(3)
    end
  end
end

Выдаст

Calculator#add returns the sum of its arguments
     Failure/Error: expect(Calculator.new.add(1, 2)).to eq(3)
       expected: 3
            got: 0
       (compared using ==)

и эквивалент

class TestCalculator:
    def test_add(self):
        # returns the sum of its arguments
        assert Calculator().add(1, 2) == 3

выдаст

FAILED test_calc.py::test_add[4] - assert 0 == 3
monk ★★★★★
()
Ответ на: комментарий от Exmor_RS

Самое главное, что он синтаксически и семантически работает с литералами как с объектами и не приходится как в питоне всё обязательно в переменные заворачивать.

monk ★★★★★
()
Ответ на: комментарий от monk

Можете пример привести, где было бы необходимо работать с литералами, как с объектами?

Вот строка в Питоне, к примеру. Вполне себе объект.

In [31]: '1,2,3'.split(',')

Out[31]: ['1', '2', '3']

DyadyushkaAU
()
Ответ на: комментарий от OSBuster

GitHub недавно делали обзор на популярные языки. Ruby сильно упал. Конечно, дело не популярности. Но ты попробуй останови теперь JS.

anonymous
()
Ответ на: комментарий от mydibyje

И вместо

case foo.bar(42).baz()
when 1..20

придётся писать

x = foo.bar(42).baz()
if (1 <= x <= 20):

Получаем переменную, которая на самом деле не нужна и обусловлена только синтаксически. Как одноразовые функции в Си++, пока там лямбда, наконец-то, не сделали.

monk ★★★★★
()
Ответ на: комментарий от monk

В правильно настроенном проекте можно писать просто describe Calculator do

Alve ★★★★★
()
Ответ на: комментарий от monk

Зато вполне возможно, что вариант на Питоне может оказаться гораздо быстрее, если только у Руби нет оптимизатора для анализа таких выражений. Да и всего-то одна лишняя переменная. Выглядит, как мелкие придирки, ИМХО.

Итого. Питон ничем не уступает Руби. И литералы в нём объекты, и диапазоны можно с помощью if анализировать практически так же просто, как в Руби.

DyadyushkaAU
()
Ответ на: комментарий от DyadyushkaAU

Можете пример привести, где было бы необходимо работать с литералами, как с объектами?

Вы же сами для строк привели.

Ещё можно что-то вроде

100.times.sum

или

10.times { puts "hello" }

В питоне, правда, полезных методов у Int поменьше.

monk ★★★★★
()
Последнее исправление: monk (всего исправлений: 1)
Ответ на: комментарий от DyadyushkaAU

Зато вполне возможно, что вариант на Питоне может оказаться гораздо быстрее, если только у Руби нет оптимизатора для анализа таких выражений. Да и всего-то одна лишняя переменная. Выглядит, как мелкие придирки, ИМХО.

Так наоборот же. Руби имеет гарантию, что во всех условиях используется только одно значение и что после условной конструкции оно нигде не используется. В Питоне любое условие может обращаться к любым доступным переменным и x будет жить до конца блока (а если там какой-то огромный массив? надо не забывать очищать x вручную).

monk ★★★★★
()
Ответ на: комментарий от eternal_sorrow

Так, что ли?

if   (foo.bar(42).baz() == 0):         print("You ran out of gas.")
elif (1 <= foo.bar(42).baz() <= 20):   print("The tank is almost empty. Quickly, find a gas station!")
elif (21 <= foo.bar(42).baz() <= 70):  print("You should be ok for now.")
elif (71 <= foo.bar(42).baz() <= 100): print("The tank is almost full.")
else: print(f"Error: capacity has an invalid value {foo.bar(42).baz()}")
monk ★★★★★
()
Ответ на: комментарий от monk

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

В питоне, правда, полезных методов у Int поменьше.

Наверное поменьше, спорить не буду. Но зачем их плодить, ради какой благой цели? На 2-5 символов чтобы код сократить?

DyadyushkaAU
()
Ответ на: комментарий от DyadyushkaAU

любой литерал в Питоне - это объект.

Для целых чисел не работает (для дробных работает, как ни странно).

monk ★★★★★
()
Ответ на: комментарий от eternal_sorrow

Смысл она имеет только как временное хранилище объекта сравнения. В общем, если вверх по ветке пройти, там весь наш диалог виден.

monk ★★★★★
()
Ответ на: комментарий от monk

foo.__class__ не являтся стандартным свойством, это особенность реализации cpython. стандартный способ сделать это - type().

>>> type(1)
<class 'int'>

eternal_sorrow ★★★★★
()
Ответ на: комментарий от DyadyushkaAU

Но зачем их плодить, ради какой благой цели? На 2-5 символов чтобы код сократить?

Для читабельности. Для единообразия.

monk ★★★★★
()
Ответ на: комментарий от monk

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

Я не это имел ввиду. Если Руби вначале надо сгенерировать этот диапазон проверочный, а затем сравнить с каждым значением этого диапазона исходное значение, то это гораздо более затратная операция, чем сравнение всего лишь с двумя числами, как у Питона.

DyadyushkaAU
()
Ответ на: комментарий от anonymous

GitHub недавно делали обзор на популярные языки. Ruby сильно упал. Конечно, дело не популярности. Но ты попробуй останови теперь JS.

Да, JS недостижим, но Руби не то чтобы упал, а скорее устаканился и остался в определённых нишах: web-фреймворки для бэкенда и всяческие DSL. Вот Google в 2016 вроде (когда уже все хипстеры форсили Node.js) запилил Fastlane https://fastlane.tools/ , которым сейчас пользуется каждый второй iOS- и возможно Android-разработчик. Потому что Руби для этих целей очень удобен.

Также пилится на Расте проект по компиляции в WASM чтобы можно было юзать написанное на Руби в браузере на клиенте: https://www.artichokeruby.org/

OSBuster
()
Ответ на: комментарий от monk

ну в ruby это значение будет неявно храниться в безымянной переменной внутри конструкции case. в питоне же эту переменную нужно явным образом определить, всё в соответствии с дзеном питон: «Явное лучше неявного.»

eternal_sorrow ★★★★★
()
Ответ на: комментарий от eternal_sorrow

всё в соответствии с дзеном питон: «Явное лучше неявного.»

Как же с таким подходом в питоне lambda разрешили? Надо было обязать именованные функции делать.

monk ★★★★★
()
Ответ на: комментарий от monk

Да, выглядит убогенько. Возможно, решается какими-то плагинами для pytest, я не проверял (хотя тесты на pytest писал, несколько раз упирался в отсутствие достаточно очевидной функциональности, связанной с фикстурами и еще чем-то, какой-то бойлерплейт был). А в racket норм тестировочный фреймворк?

alienclaster ★★★
()
Ответ на: комментарий от monk

ну так если посмотреть, какие ограничения накладываются на лямбды, фактически так оно и есть

eternal_sorrow ★★★★★
()
Ответ на: комментарий от DyadyushkaAU

Выбор языка программирования вообще вкусовщина. Если не считать возможности виртуальной машины. И доступные библиотеки.

monk ★★★★★
()
Ответ на: комментарий от monk

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

Не совсем, то есть, вкусовщина.

DyadyushkaAU
()

Не защищает от утечек памяти - не нужно.

anonymous
()
Ответ на: комментарий от GP

когда какая польза от перегоревших лампочек?

На них удобно штопать.

anonymous
()
Ответ на: комментарий от monk

Неявное не запрещено. Просто Явное предпочитается

saibogo ★★★★
()

Elixir можно закапывать?

anonymous
()
Ответ на: комментарий от GP

С go сраанивать нельзя это же компилятор. Что касается питона то лучше все таки его сравнить с php. На питон уже давно переписали все системные скрипты и система в минималке всегда содержит питон. Его трудно заменить и поэтому появились мода на кучу питонов сразу … А пхп с руби как правило только для веба и он сбоку стоит.

mx__ ★★★★★
()
Ответ на: комментарий от mx__

ruby ничем не хуже для системной скриптухи, чем python и, наверное, даже сильно лучше. Проигрывает он в основном количеством библиотек и «экосистемой».

alienclaster ★★★
()
Ответ на: комментарий от monk

Ты просто сломал парсер. (1).__class__ или 1..__class__, да это уже float

anonymous
()
Ответ на: комментарий от Im_not_a_robot

А жаль, с виду очень классный синтаксис у языка, если сравнивать с тем же Питоном.

bonta ★★★★★
()
Ответ на: комментарий от OSBuster

Вроде бы самая лучшая книга и самые лучшие курсы по Руби - как раз на русском языке. Роман Пушкин -автор.

Одна из редких книг, которая сначала появилась на русском, потом была переведена на английский (ну или в процессе ещё), не интересовался давно как у него дела.

bonta ★★★★★
()
Ответ на: комментарий от OSBuster

вернее верно обратное - время рубей полнотсью не ушло разве что в северной америке и в родной для руби японии. Во всём остальном мире популярность рубей «прыгнула со скалы»

Ford_Focus ★★★★★
()
Ответ на: комментарий от OSBuster

https://spectrum.ieee.org/static/interactive-the-top-programming-languages-2019

ровно тот же IEEE поставил руби на почётное 7(6) место, если говорить только про работу и только про web (ниже того же PHP!) и на не менее почётное 19 место в общем зачёте.

правильно ли я понимаю, что для рубистов IEEE находится где-то в постсовке?

Ford_Focus ★★★★★
()
Ответ на: комментарий от Ford_Focus

популярность рубей «прыгнула со скалы» Со скалы или со скалой? Кажется, оба «прыгнули» примерно в одно время.

anonymous
()
Ответ на: комментарий от alienclaster

Я не написал что он хуже, я написал что питон уже сразу установлен всегда и что вся системная скриптня уже давно переписана с перла на питон.

mx__ ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.