LINUX.ORG.RU

Rakudo 2021.04

 ,


0

3

Тихо и незаметно вышла версия 2021.04 компилятора языка программирования Raku - Rakudo. Компиляция осуществляется для таких виртуальных машин как: MoarVM, JVM и другие. На данный момент, Rakudo является самым развитым воплощением языка программирования Raku. Данный выпуск реализует версии 6.c и 6.d спецификации.

Следующий релиз предварительно запланирован на 21 мая.

Для команды разработчиков очень важна обратная связь! Будьте любезны оставить отзыв если используете Rakudo. Вопросы, комментарии, предложения, улучшения - рады любой обратной связи!

Желающие поддержать развитие Raku могут сделать пожертвование в The Perl Foundation (Выберите «Raku Core Development Fund» в графе «Purpose»).

Некоторые изменения 2021.04:

  • Нововведения:
    • Для Enum добавлена поддержка методов: keys, values, kv, pairs, antipairs, invert. Пример:
      my $e = enum ('a' => 3, 'b' => 17);
      say $e.antipairs; # (3 => a 17 => b)␤
      
    • Метод uniname теперь работает для всех значений типа Cool, в том числе Num и Match
      say 1.0.uniprop('Numeric_Type'); # OUTPUT: «Decimal␤»
      
    • В IO::Path добавлены методы user и group:
      my $io = IO::Path.new('slackware-user', :CWD</home>);
      say $io.user; # OUTPUT: «1000␤»
      
    • В DateTime добавлены методы day-fraction, modified-julian-date и julian-date
      my $now = DateTime.now(formatter => { sprintf "%02d:%02d", .hour, .minute });
      say "$now ", ( $now.day-fraction * 100 ).fmt('%d%%'); # OUTPUT: «21:26 89%␤»
      
  • Улучшения производительности:
    • now теперь работает в 38 раз быстрее.
    • Str.wordcase ускорен в 5 раз.
      say "raku programming".wordcase;        # OUTPUT: «Raku Programming␤»
      
    • Str.uniparse стал быстрее ~10%
      say "I {uniparse 'TWO HEARTS'} Raku"; # OUTPUT: «I 💕 Raku␤» 
      
    • lines и words ускорены в 20 раз
      say lines("a\nb").raku;    # OUTPUT: «("a", "b").Seq␤» 
      say "hello world".words.raku;  # OUTPUT: «("hello", "world").Seq␤» 
      
    • my %h is QuantHash = ... ускорен в 5 раз
    • Int.unival и Str.unival так же были ускорены
      say '¾'.unival;     # OUTPUT: «0.75␤» 
      
    • Str.ords стал в два раза быстрее
      say '€¥$'.ords; # OUTPUT: «(8364 165 36)␤» 
      
    • Ускорены методы List.sum и Any.sum
    • Метод chrs стал быстрее для специфичных для используемой архитектуры int-массивов
      say <67 97 109 101 108 105 97>.chrs;   # OUTPUT: «Camelia␤»
      
    • Метод uninames ускорен в два раза
      say ‘»ö«’.uninames.raku;
      # OUTPUT: «("RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK", "LATIN SMALL LETTER O WITH DIAERESIS", "LEFT-POINTING DOUBLE ANGLE QUOTATION MARK").Seq␤»
      
    • Str.univals ускорен на 50%
      say "4a¾".univals;  # OUTPUT: «(4 NaN 0.75)␤»
      
    • Datish.daycount вычисляется быстрее на 30%
      # к-во дней с 17.11.1858
      say Date.new('1995-09-27').daycount;    # OUTPUT: «49987␤»
      
    • uniprop ускорен в 30 раз, а uniprops в 4 раза
    • Baggy.AT-KEY быстрее на 60%
      my $breakfast = bag <eggs bacon bacon bacon>;
      say $breakfast.AT-KEY('bacon'); # OUTPUT: «3␤»
      
    • Пустые итераторы отрабатывают быстрее
    • Микрооптимизации цикла for
    • Микрооптимизации запуска

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

Наслаждайтесь!

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

Ответ на: комментарий от snake266

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

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

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

Любой стиль поддерживается на полную катушку

чтобы максимально поощрить говнокод?

Так же синтаксис заряжен по самые гланды. Можно невероятно выразительно и компактно решать многие задачи

Ну да, чтобы максимально поощрить говнокод. Чтобы было нечитаемо и неподдерживаемо. Но зато можно выпендриватся на лорчике, какой большой… ум!

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

Какая-то магия, выглядит хуже сишки. Правильно что вымер, на этом нельзя делать новые проекты.

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

язык для извращения с однострочниками

Вроде на фоне perl-а внесли и адекватную модульность с прекомпиляцией и ООП с метаобъектным протоколом и всякие удобства для написания именно не-однострочников, так что звучит сомнительно.

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

Медленный старт как-то сильнее напрягает

Всё будет, но не сразу, а так JIT же и все дела.

Нормального на раке не нашлось, решил сделать на раке биндинг к libyaml

А нормальный - это какой? Есть https://github.com/yaml/yaml-libyaml-perl6 от знакомого из NASA, есть https://github.com/tony-o/perl6-libyaml от довольно активного разработчика, есть https://github.com/Leont/yamlish который без биндингов. Что в них не так-то, все не подходят?

еф в своей помойке сохранит какое-то промежуточное представление и запускаться будет быстрее

Прекомпиляция независима от zef-а, но да, в модулях она изкоробки.

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

Лоровцы не ходят по ссылкам конечно, но в changelog-е есть хэши коммитов rakudo, вот так:

Make uniprop method about 30x as fast [c9aceda4][54c95ebe][885d6390] Make uniprops method about 4x as fast [97b2b3f0]

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

Про более интересные оптимизации можно почитать например на https://6guts.wordpress.com/2021/04/15/raku-multiple-dispatch-with-the-new-moarvm-dispatcher/ из свежего.

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

Лоровцы не ходят по ссылкам конечно

Но мы же не такие?

https://dev.to/leontimmermans/a-year-of-strife-16o9 A year of strife in Perl

Про баталии в Perl

It's easy to assume that the things that happened were a few abusive assholes, but in my experience it was mostly a vicious cycle of previously reasonable and kind people lashing out at the people that were burning them out.

Легко предположить, что произошедшие вещи были жестокими придурками, но, по моему опыту, в основном это был порочный круг, когда прежде разумные и добрые люди набрасывались на людей, которые их сжигали.
Vladimirmir ()
Ответ на: комментарий от Vladimirmir

Так у раку и у перла сообщества хоть и пересекающиеся множества, но core разработчики это две разных «тусовки», скажем так. Я работаю с core разработчиками и вообще не в курсе, как у перла идут дела, про драму с Сойером узнал из новости здесь. У раку конечно не без пары тёмных историй, но пока вроде всё стабильно.

Да и драма нынче везде есть, РМС не писал на перле вроде, но вот же как.

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

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

Вообще, если @perl5_guy не против редактировать статью и если он хочет, то я могу вечером забенчить функции, которые были ускорены, и скинуть сюда результаты. Правда бенчить я буду на 2021.03, потому что это последняя версия в AUR.

snake266 ()
Ответ на: комментарий от snake266
➜  ~ raku --version
Welcome to Rakudo(tm) v2021.03.
Implementing the Raku(tm) programming language v6.d.
Built on MoarVM version 2021.03.
➜  ~ raku -e 'use nqp; my $ts; for ^1_000_000 { $ts = now; }; say $ts; say now - INIT now;'
Instant:1619607967.494948
15.92152667
➜  ~ rakudobrew switch moar-2021.04
Switching to moar-2021.04
➜  ~ raku -e 'use nqp; my $ts; for ^1_000_000 { $ts = now; }; say $ts; say now - INIT now;'
Instant:1619607994.314428018
0.291085026
➜  ~ raku -e 'say 15.92 / 0.29'
54.896552

Как-то так. Но это скучный изолированный случай.

Когда сравниваешь изолированные случаи, можно сказать «Ну такой однострочник никто не пишет, покажите реальные приложения». Когда сравниваешь что-то более крупное, можно сказать «Ну там код не так спроектирован и вообще слишком сильно отличается, нужны изолированные случаи, чтобы было честно». Бенчмарки ложь.

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

Ну и в релизе, как я понял, при оценке ускорения используются изолированные случаи. Ну и я думал, что именно в однострочниках сила perl, ну а raku это унаследовал.

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

Вот интересная штука, которая скорей всего уменьшит время старта: https://6guts.wordpress.com/page/2/

Было бы хорошо дать ссылку на конкретный пост, а не на вторую страницу простыни из 10 постов.

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

А нормальный - это какой?

Который меня устраивает.

  1. Я как-то ещё с перла привык, что у модуля, выложенного в CPAN есть приличная документация. Посмотри на все три твоих примера — это не доки, это заглушки, сделанные на от…бись. Чем по чужому коду лазить, чтобы понять, как его использовать, я с большим успехом свой наговняю (заодно раку пощупаю и её NativeCall).

  2. Все перечисленные тобой модули работают, когда всё хорошо. Но стоит в ямле сделать какую-либо ошибку, результат будет «извини, я не шмогла». Что, где, почему — догадайся сам. Ни тебе номера строчки, ни толкового сообщения об ошибке. Примеры смотри ниже. Может, я и не совсем прав, по причине см. пункт первый.

Примеры:

$ cat test.raku 
#!/usr/bin/raku
use YAML::Parser::LibYAML;
my $yaml = yaml-parse('file.yaml');
$yaml.perl.say;


vdb@antec:~/prj/raku
$ ./test.raku 
raku: api.c:313: yaml_parser_set_input_file: Assertion `file' failed.
Aborted (core dumped)

По-твоему, assert и корка — это нормальная реакция на отсутствующий файл?

Второй пример (исходник тот же):

$ cat file.yaml 
a: 1
b: 2
- qwerty

$ ./test.raku 
${:a(1), :b(2)}

Сообщений об ошибках я не вижу, значит, ямловский файл является корректным. Куда же делась строчка «- qwerty»? Почему я не наблюдаю её в выводе? Если же ямловский файл некорректный, то почему я не вижу сообщения об ошибке?

Резюме: YAML::Parser::LibYAML — отстой.

Следующий YAMLish:

$ cat test.raku 
#!/usr/bin/raku
use YAMLish;
my $yaml = IO::Path.new('file.yaml').slurp;
my $data = load-yaml($yaml);
say $data.perl;

vdb@antec:~/prj/raku
$ ./test.raku 
Failure.new(exception => X::AdHoc.new(payload => "Couldn't parse YAML"), backtrace => Backtrace.new)

О, этот ругается. «Couldn’t parse YAML». Хорошо, что у меня тестовый ямл в три строки. А если там будет хотя бы 50 строчек? Как искать ошибки/опечатки по этому «Не шмогла»?

Документация на YAMLish тоже немногословная:

load-yaml(Str $input, ::Grammar:U :$schema = ::Schema::Core, :%tags)

Что за схема, что за теги? (Причём Леон себе на CPAN такого не позволял, его перловые модули нормально документированы, по крайней мере те, что я видел.)

Резюме: YAMLish — отстой.

Про третий модуль, LibYAML, не помню. Документации там тоже нет.

Всё будет, но не сразу, а так JIT же и все дела.

Спасибо, но боюсь, я не доживу.

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

Который меня устраивает

О, если с репортингом и документацией, то звучит отлично. Он где-то открыт?

Причём Леон себе на CPAN такого не позволял, его перловые модули нормально документированы, по крайней мере те, что я видел

Если с кухней знаком, почему было просто не пропатчить то, что не нравится? Всяко «сделать своё с полного нуля с сообщениями об ошибках» дольше и сложнее, чем «узнать как сделать сообщения об ошибках и добавить к готовому». Сомнительно, что кто-то из авторов сказал бы «Какой ужас, всё, не примем, форкайте», и улучшение получили бы все пользователи.

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

Хорошие проекты

https://github.com/Leont/yamlish                           An implementation of YAML in Raku

https://dev.to/leontimmermans/

https://dev.to/leontimmermans/a-year-of-strife-16o9        A year of strife in Perl

https://github.com/Leont/libperl--                         LibPerl++ is a C++ library that provides a more friendly interface for the the perl API.
                                                           It makes use of advanced features of C++ to make both embedding and extending perl as easy as possible.
                                                           This repository also contains to helper libraries that may be split out at a later stage: libtap++ and Library::Build.

https://github.com/Leont/file-map                          Memory mapping for Perl

https://github.com/Leont/threads-lite                      An Erlang style threading library for perl

https://github.com/Leont/linux-epoll                       A Perl module for O(1) multiplexing on linux
Vladimirmir ()
Ответ на: комментарий от Lilly

О, если с репортингом и документацией, то звучит отлично. Он где-то открыт?

Не понял что тут отличного? Существует три модуля, а взять нечего.

Не понял — кто открыт? Если ты про тикеты, то, например, не вижу смысла открывать тикет на тему «нет документации» или «документация — говно». Думаешь, авторы этих модулей не в курсе? Если бы я нашёл ошибку или недостаток в документации, я бы тикет открыл. Но жаловаться на эти пустышки?

Если с кухней знаком, почему было просто не пропатчить то, что не нравится?

Иногда не нравится всё, и проще переделать с нуля чем объяснять почему это не нравится.

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

А иногда автор отвечает быстро, но затрахает мелкими придирками. Поправь это, поправь то, поправь сё. А вот здесь в комментарии у тебя артикль «the» пропущен. Если бы мне кто прислал патч в десять строчек, мне было бы проще сказать «спасибо», принять его как есть и самому довести его до кондиции, чем объяснять что, где и почему, хотя бы в целях экономии моего же времени.

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

Кроме того, я об этом писал: мне было интересно ознакомиться с ракой и NativeCall, что я и сделал.

Кстати, в раке, вроде бы, что-то было на тему authority, когда могут существовать разные версии модуля от разных авторов.

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

Это замена javascript или java? Если по части тормозов, то на уровне первых ВМ упомянутых. Только те ускорились, а этому поделию подобное не светит 😄

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

Выше давали: https://6guts.wordpress.com/2021/03/15/towards-a-new-general-dispatch-mechanism-in-moarvm/

Не понял каким образом диспатч относится к времени компиляции. Жопа сейчас наблюдается во времени компиляции исходника в байт-код или как он там у них называется. В тестовой программе из тысячи строчек $a = $a + 1; всё время уходит на её компиляцию, а не на исполнение. Вот эта программа:

#!/usr/bin/raku
use v6.d;
BEGIN {
    say "begin";
}
say "start";
my $a = 0;
$a = $a + 1; # Repeat the line 1000 times or more.
say $a;

«begin» выводит моментально (на человеческий глаз), потом томительная пауза, потом «start», и, с небольшой задержкой, «1000».

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

Кстати, в раке, вроде бы, что-то было на тему authority, когда могут существовать разные версии модуля от разных авторов

Да, вполне есть такое, прописываешь :auth<foo:foo> и вперёд.

Кроме того, я об этом писал: мне было интересно ознакомиться с ракой и NativeCall, что я и сделал.

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

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

Действительно бывают разные истории, у меня и сейчас висит 26 незакрытых пулов, самый старый из которых датируется августом 2018-го, но из 700+ это меньше пяти процентов случаев.

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

Не понял каким образом диспатч относится к времени компиляции

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

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

вообще хочется надеется что хотя бы единственным положительным эффектом от пандемии будет перераспределение более значимых средств в здравоохранение

А то там сейчас мало бабла крутится.

Эффект будет как обычно: богатые станут богаче (в том числе и за счёт «перераспределения средств в здравоохранение»), а бедные (кто выживет) станут беднее.

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

А какие области применения у этого языка? Я так понимаю, Perl никуда не делся

Присоединяюсь к вопросу. Какую киллер-фичу предлагает Rakudo? Каждый взлетевший язык что-то такое предлагал: Си — переносимость, C++ — ООП на Си, Delphi — RAD for GUI, Java — как бы безопасная замена C++, JS — исполнение в браузере, Python — простота освоения, Go — то же самое, но лучше (минимализм и компилируемость) плюс CSP, Rust — проверка безопасности по памяти на этапе компиляции.

А тут что? Если захочется упороться мультипарадигменностью и синтаксисом, то Scala тут всех переплюнет.

hbee ★★★ ()
Последнее исправление: hbee (всего исправлений: 1)