LINUX.ORG.RU

Ruby 3.0.0

 ,


1

4

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

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

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

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

★★★★★

Проверено: cetjs2 ()

Когда-нибудь серьезные программисты ЛОРа закончат обсуждение циклов, одолеют их таки, потом закатают рукава и перейдут на дискуссии об if’ах, там еще неспешно побравируют в комментариях где-то с полгодика, а потом как возьмутся за дело, да как напишут уже что-то полезное, трепещи весь Мир! (на самом деле нет)

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

Там нормальный for

да for и в африке for. По крайней мере в изначальном моем посыле. Мне, если что, тоже ближе паскалевкий, но речь не о том была: когда я недоумевал по поводу нужности N.times {} и вообще подобного я подразумевал именно for в общем смысле, а не конкретно в моем корявом написании, а ты прицепился именно к синтаксису: сие неверно, прошу в данном треде мое упоминание for-а читать в широком смысле цикла со счетчиком.

угадай, что делают.

перебирает 1, 2, 3, а дальше – даже идей нет )

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

Даже с тем же for с тремя аргументами — бывают разные скобки, разные запятые, разные записи оператора

Бесспорно ты прав, но нужно ли усугублять и плодить еще конструкций?

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

N.times(какая-нибудь лямбда), а не классический цикл.

Так это и есть лямбда, точнее блок. times – это обычный метод. Любому методу можно передать блок последним аргументом.

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

1 to: 10 do: [:x | x printNl ]

я бы сказал что это то же for. То есть цикл со счетчиком. Не зря я написал «в том или ином виде». Но тут я совсем несведущ – спорить не возьмусь.

Во многих языках for бывает только как «для каждого» для коллекций.

И нет возможности сделать цикл со счетчиком? Как я и сказал: «мне не попадались»

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

Зачем по-русски пишешь, если есть латынь, которая ВСЕМ ПОНЯТНА и ЕСТЬ ВЕЗДЕ?

Слишком спорно. Латынь понятна не всем говорящим людям, далеко. А цикл со счетчиком понятен всем программистам.

К тому же, если бы была возможность выбирать мне сейчас: изобретать ли руси свой язык или юзать латынь, которая уже и так есть, все умеет и всем понятна, я бы выбрал латынь: ибо справедливо, нет никакой пользы от множенья ЛИШНИХ сущностей. Латынь действительно замечательно бы справилась с задачей быть языком для руси и подобный выбор имел бы много очевидных преимуществ по сравнению с собственным велосипедом. Но это ж не я решал, так что некорректно с меня за это српрашивать.

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

И нет возможности сделать цикл со счетчиком? Как я и сказал: «мне не попадались»

Python. Реализуется или через перебор коллекции или через while.

Haskell.

я бы сказал что это то же for.

Тогда чем тебе times не тот же for? Можно писать

1.upto(10) { print "ok\n" }

или если необходима переменная цикла то её тоже можно

10.times { print i,"\n" }
1.upto(10) { |i| print i,"\n" }
monk ★★★★★ ()
Ответ на: комментарий от anonymous

на самом деле нет

ну если никто с ЛОРа ничего полезного не написал – первым брось камень.

Что дурного в обсуждении программирования, разных подходов и концепций на линуксовом форуме в топике про язык, являющий собой воплощение одной из обсуждаемых концепций? (если я правильно понял) я вот, обогащаюсь :)

PS этот же смысл, мол мы тут трындим, а не дело делаем, применим в той же степени и к твоему комментарию, (иронично)

// что, потанцевать нельзя?! :)

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

Python. Реализуется или через перебор коллекции или через while.

Да хоть через if и goto. Чего ты прицепился к реализации-то? Я ж про идею:

10 i = 1
20 если i > 10 то перейти_к 60
30 написать "привет"
40 i = i + 1
50 перейти_к 20
60 конец

ты это на чем не напиши, это очевидно для любого программиста. Тут в явном виде цикла нет, но идея все равно очевидна ЛЮБОМУ.

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

PS этот же смысл, мол мы тут трындим, а не дело делаем, применим в той же степени и к твоему комментарию, (иронично)

Мне понадобилось где-то полминуты, чтобы пролистать лог вашего обсуждения, которые растянулось где-то уже на пару часов, плюс еще где-то две минуты на написание комментария. Потери времени несравнимы.

Что дурного в обсуждении программирования, разных подходов и концепций на линуксовом форуме в топике про язык, являющий собой воплощение одной из обсуждаемых концепций? (если я правильно понял) я вот, обогащаюсь :)

Это как если бы писатели спорили, как лучше затачивать карандаш для черновиков – справа налево, или слева направо, для кого-то, может, и полезно, но в общем случае полностью бессмысленно. Каждый все равно будет писать как он привык и/или как требует style guide.

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

если необходима переменная цикла то её тоже можно

10.times { print i,"\n" }
1.upto(10) { |i| print i,"\n" }

да я не сомневаюсь что можно, но насчет того, что приведенный тобой фрагмент понятнее (для среднего программиста) и читабельнее, чем классический for i= … бла-бла-бла, позволь не согласиться.

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

Потери времени несравнимы.

А почему ты решил что это потери времени? Я отдыхаю и обогащаюсь опытом других людей. Завалиться на диван и Лема почитать – тоже потеря времени?

для кого-то, может, и полезно, но в общем случае полностью бессмысленно. Каждый все равно будет писать как он привык и/или как требует style guide

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

Ну не зыбывай: это отдых такой, ты вот, чем зянят, когда отдыхаешь, не является ли это потерей времени?

Короче – драматизируешь

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

ты хочешь сказать, что тут i будет последовательно увеличиваться от 1 до 10? Почему именно i, а не j?

Потерял символ. Должно быть

10.times { |i| print i,"\n" }
monk ★★★★★ ()
Ответ на: комментарий от monk

а, ну так да. Оно, соглашусь, самоочевидно. А for не самоочевидно, но это если с Марса смотреть. А в реальности фор уже все все равно знают и нет смысла изобретать еще один. Для меня.

Ну ладно, нечего из пустого в порожнее переливать: спасибо за разъяснения!

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

Вот кстати полный аналог

class Integer
  def repeat
    k = 1
    while k <= self
      yield(k)
      k = k + 1
    end
  end
end

и можно писать

10.repeat { |i| print i,"\n" }
5.repeat { print "ok\n" }

Кстати, @GP, это то, чего нельзя сделать ни в Питоне ни в Go.

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

А почему ты решил что это потери времени? Я отдыхаю и обогащаюсь опытом других людей.

Опытом других людей касательно циклов? Что дальше будете if’ы разбирать? Или букварь почитывать? Лучше бы разбирали более интересные и сложные вещи, ты же сишник вроде, должен зрить в корень, алгоритмы, оптимизации разнообразные, не обязательно что-то невероятное, у каждого, наверное, накопилось уже всяких интересных «приемчиков», которые, может, не всем известны. Не знаю, мне просто все эти околофилософские темы (мне нравится так, нет надо этак) кажутся странными. Но ладно, я же просто ноунейм-аноним, так что не серчай.

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

ты же сишник вроде

Я каску на стройке нашёл. :) правильнее будет - сочувствующий

кажутся странными

Ну вот, а мне показалось странным использовать всякое для циклов, когда есть циклы)

так что не серчай

Пфф. Кто я такой, чтоб серчать на анона? :)

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

Ну тогда это не лямбда. Потому что здесь не repeat использует блок, а блок использует генератор repeat. Внутри блока может быть что-то типа лямбды, да. Возможно, для создания встроенных DSL-ов такой синтаксис очень удобен. Иначе это только лишний выворот мозга.

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

Молодец, чувак, зачтено тут всех затроллил! 👍

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

Компьютерам такое нравится, людям… - на любителя. Такие тоже встречаются…

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

Потому что здесь не repeat использует блок, а блок использует генератор repeat

Внутри repeat использует. Блок внутри имеет имя yield. yield здесь не генератор. Для генератора используется Fiber.yield.

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

Балет всегда был борделем для аристократии.

Что прям на сцене с собственным участием? Какой смысл борделя без собственного участия?

Балет - это больше кабаре без бухла и жратвы.

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

Если без модерн, то получается примерно киберпанк.

А ещё геймдевелоперы часто ночуют на работе…

А так именно модерн и надо использовать, а не бухтеть, что stl 98 плохой. И да, паттерны немного другие там.

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

… а не бухтеть, что stl 98 плохой.

Альтернативы то нет …
В stl все красиво, но пройдитесь debugger-ом по нем и вы увидите, что цена многих простых операций не малая.
Вывод из этого конечно стандартный …
Правильно писали на habr, что ныне актуален вопрос качественного /и конечно эффективного API/.

Впрочем даже и на нынешнем API как-то все на компьютерах шевелится …

Владимир

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

Каждый день смотрю. И в compiler explorer. И вам, Владимир, советую хотя бы разок, чтобы воздух не сотрясать.

Плохо смотрите.
Да и зачем каждый день смотреть?
Так что не врите.

Владимир

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

Да и зачем каждый день смотреть?

Работа у меня такая.

Вот пример отрицательной цены абстракции (когда замена на высокоуровневую конструкцию работает быстрее, чем аналогичный for-loop на C):

https://kristerw.blogspot.com/2017/06/a-look-at-range-v3-code-generation.html

или вот: https://www.youtube.com/watch?v=j9tlJAqMV7U

Плохо смотрите.

Вы путаете с thedailywtf или coding horror.

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

Вы путаете с thedailywtf или coding horror.

Говорю не голословно, потому как разрабатываемый мною проект многое уже из того что есть в STL предоставляет.
И конечно стараюсь сделать API эффективным.

Владимир

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

Работа у меня такая.

Но каждый день код STL не анализирую.
Впрочем если вы STL разрабатываете.

В частности class, template, STL, … не использую.
Свое API.
Не использую в частности потому, что они мало пригодны для разработки динамических объектов о которых компилятор ни чего не знает.

Владимир

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

Ну давайте тогда проектами меряться. Или хотя бы пример с compiler explorer с Вашим API и «современным C++» где сильно лучше получается (или быстрее - ресурсы с микробенчмарками тоже есть).

Пока нет конкретных примеров - болтовня.

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

Одним только руби - вряд ли. Я всем, кто прогером хочет стать говорю, что есть 3 основных направления:

  1. фронт: js/мобилка

  2. бэк: СУБД + какой-то любой язык (обычно его можно за недельку выучить на достаточном уровне)

  3. геймдев

Без знаний СУБД на беке делать нечего.

А вот для стартапа, думаю, лучше ничего нет.

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

Вот пример отрицательной цены абстракции (когда замена на высокоуровневую конструкцию работает быстрее, чем аналогичный for-loop на C)

Статья из раздела «Давайте сравним оптимизированный код с неоптимизированным. О, оптимизированный код оказался быстрее!!!» Что мешало автору развернуть цикл на C изначально, когда об этом даже каждая C-обезьяна знает? Загадка.

https://www.youtube.com/watch?v=j9tlJAqMV7U

Непонятно зачем ты сюда это притащил, никто не будет смотреть часовое видео, чтобы выискивать там твои аргументы за тебя. Есть, что сказать – говори.

Кстати, ты случайно не @fsb4000, тот тоже любит бездумно кидаться ссылками на видео с конференций C++. Он прям молится на них. Но я его сегодня немного в дерьмо макнул, так он и приутих.

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

Статья из раздела «Давайте сравним оптимизированный код с неоптимизированным. О, оптимизированный код оказался быстрее!!!»

Код во всех случаях компилировался с максимальным уровнем оптимизации. Так что не надо «неоптимизированный».

Чтобы было понятнее, покажи мне хотя бы 10 примеров кода на C, где делается ручной loop unrolling? Или сравни с количеством вызовов std::for_each в C++, чтобы оценить, сколько тупой работы свалено на компилятор.

Вообще это опять же к вопросу о том, что «for-loops, они понятнее для всех и ничего другого не надо». Если руби также научились делать loop unrolling при JIT-компиляции - замечательно.

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

Чтобы было понятнее, покажи мне хотя бы 10 примеров кода на C, где делается ручной loop unrolling?

Любой проект, где нужно конвертация форматов – SDL использует устройство Даффа для этого (я знаю, что у тебя сейчас порвался шаблон, или правильно говорить template?), та же mesa, zlib и т.д. Любой проект индустриального качества, где важна скорость, не твой типичный хелловорлд. Остальные 7 можешь искать сам если тебе так интересно, я твоим образованием заниматься не буду.

Так, а что там про видео то? Что хотел сказать?

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

Ну тогда точно будет очень легко привести ссылку на GitHub с примером кода (тыкаешь на номер строки и копируешь в буффер).

Поиск по std::for_each на GitHub выдает 422 тысячи совпадений. Твои 3 примера смотрятся явно блекловато (если в них действительно делается rool unrolling, что пока не доказано).

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

Поиск по std::for_each на GitHub

Понятно, дитя Github’а. Если на Github’е нет, значит, не нужно.

Твой поиск выдал 422 тысячи обезьян, понятное дело, что loop unrolling это низкоуровневая вещь, нужная меньшему количеству людей, чем обычное формошлепство. Я тебя обучаю самым базовым вещам, даже не знаю с кем я разговариваю.

Плюс, можешь открыть код любой быстрой хеш-функции, с большой долей вероятности тебе там будет ждать сюрприз:

https://github.com/Cyan4973/xxHash/blob/6b44373c2fc06b92d511e3b3099b45c6e1526d9f/xxhash.h#L1850

Отправь автору замечание, чтобы от это все дело на C++ for_each переписал. Я посмотрю, как твой хрупкий детский мир затрещит по швам после контакта с реальностью.

Я тебе дал направление для изучения, дальше ты сам. Тут как в институте, я тебя учу учиться, но не собираюсь за тебя все разжевывать.

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

Понятно, дитя Github’а. Если на Github’е нет, значит, не нужно.

Во-первых, это просто удобно показать. Во-вторых, там зеркала многих проектов, в том числе ядра. Так что выборка неплохая.

Отправь автору замечание, чтобы от это все дело на C++ for_each переписал.

https://github.com/abseil/abseil-cpp/blob/master/absl/hash/internal/hash.h

Вообще highly portable это означает, что он сидит и и тюнит одну свою функцию. На каждый новый процессор, на каждый новый компилятор.

Возможно, ему ещё нужна гарантия от регрессий компилятора / стандартной библиотеки (хотя там, где это важно, регулярно тестируются на микробенчмарках).

В любом случае для большинства прикладных задач это неподъемно. Только одна либа для хеширования, одна либа с криптографией. 2,5 либы с кодеками.

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

Возможно, ему ещё нужна гарантия от регрессий компилятора

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

В любом случае для большинства прикладных задач это неподъемно. Только одна либа для хеширования, одна либа с криптографией. 2,5 либы с кодеками.

Так большинству задач и микробенчмарки твои из той статьи не нужны, с этого и стоило начинать.

https://github.com/abseil/abseil-cpp/blob/master/absl/hash/internal/hash.h

Что ты хотел сказать этой ссылкой? Поконкретнее, что я должен там увидеть? Или будет, как с тем видео, когда ты вскукарекнул, а потом так и не удосужился объясниться?

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

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

Руби был хорош именно рельсами, как отдельный язык руби нафик не вперся, есть куда более вменяемые перл и питон.

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

Когда то я тоже страдал юношеским максимализмом. Хотел все переписать на 1С. Даже думал о браузере и ОС на 1С-сочке… Эх, где моя молодость, наивность…

Владимир

anonymous ()