Upgrade to Pro — share decks privately, control downloads, hide ads and more …

perl_in_2023spring.pdf

Kenichi Ishigaki
March 20, 2023
420

 perl_in_2023spring.pdf

Kenichi Ishigaki

March 20, 2023
Tweet

Transcript

  1. 2023年春のPerl
    Kenichi Ishigaki
    @charsbar
    YAPC::Kyoto 2023
    March 19, 2023

    View full-size slide

  2. me
    2016年のPerl@LLoT
    Perl in 2016@YAPC::Hokkaido
    2017年春のPerl@YAPC::Kansai
    2017年夏のPerl@YAPC::Fukuoka
    (萬國之津梁@YAPC::Okinawa)
    (2018年初夏のPerl5)@Hokkaido.pm #14
    2018年夏のPerl5@Shibuya.pm #18
    2018年残暑のPerl@LL2018
    2019年冬のPerl@YAPC::Tokyo
    (Learn Languages 2021)
    2023年春のPerl@YAPC::Kyoto <- イマココ

    View full-size slide

  3. この四年あまりの
    間に起きたこと

    View full-size slide

  4. Perl 5 の安定版は 5.36 になりました
    5.30 (2019/05/22)
    5.32 (2020/06/20)
    5.34 (2021/05/20)
    5.36 (2022/05/28)
    5.37.9 (2023/02/20)

    View full-size slide

  5. Perl 6
    • 正式に Raku に改名されました (2019年)
    • 安定版は 6.c (2015年) → 6.d (2020年)
    • 開発はいまも順調に続いているようです
    • 詳しくは Rakudo Weekly News を
    (今回はこれ以上取り上げません)

    View full-size slide

  6. Perl 7
    • 2020年に大きな話題になりましたが、
    まだ出ていません
    • いずれ、十分な新機能が揃った暁に
    • 暗黙の機能変更ではなく、 use v7; で
    切り替えて使うことになります

    View full-size slide

  7. 開発体制の変化
    • パンプキンから運営委員会へ (2021年)
    • C/XS に堪能な開発者が (偶然にも)
    意思決定の場に復帰
    • RFC制度の導入

    View full-size slide

  8. パンプキンから運営委員会へ
    もともとの Perl の三権分立
    • 立法府 (Perl 5 Porters)
    • 行政府 (Pumpking)
    • 司法府 (Larry Wall)

    View full-size slide

  9. パンプキンから運営委員会へ
    • 初期のパンプキンはコア開発者
    • 燃え尽き症候群でなり手がいなくなった
    • Perl 5.11 (2009年)からは調整役に
    • 開発版のリリース担当者も(別途)持ち
    回りに

    View full-size slide

  10. パンプキンから運営委員会へ
    うまくいっているうちはよかったのですが
    2010年代後半になると
    一部から不満が出るように
    続投にしても交代にしてもどうするか

    View full-size slide

  11. パンプキンから運営委員会へ
    三人寄れば文殊の知恵
    • 立法府 (Core Team)
    • 行政府 (Steering Council)
    • 司法府 (Larry Wall)

    View full-size slide

  12. パンプキンから運営委員会へ
    • 選考の手続きなどが明確に
    • 万一暴走したら止められるように
    • 不当な圧力からは守られるように
    • コアチーム: 2023年春時点では25名 (+活動休止中 5名)
    • ドキュメントなどでの貢献者も含む
    • 最新のリストはGitHubで確認
    https://github.com/Perl/perl5/blob/blead/pod/perlgov.pod

    View full-size slide

  13. C/XS に堪能な開発者が
    (偶然にも)意思決定の場に復帰
    2021年6月時点の PSC メンバー
    Neil Bowers
    Nicholas Clark
    Ricardo Signes

    View full-size slide

  14. C/XS に堪能な開発者が
    (偶然にも)意思決定の場に復帰
    2023年春時点の PSC メンバー
    Paul Evans
    Philippe Bruhat
    Ricardo Signes

    View full-size slide

  15. C/XS に堪能な開発者が
    (偶然にも)意思決定の場に復帰
    Paul Evans
    • Syntax::Keyword::Try
    • Future::AsyncAwait
    • Object::Pad
    • Perl in 2025 (@FOSDEM, 2021)
    https://www.youtube.com/watch?v=raSRNIoUYig

    View full-size slide

  16. RFC 制度の導入
    • https://github.com/Perl/RFCs
    • 数少ないコア開発者の負担を減らす
    • バグや最適化と、要望や試案の分離
    • 実装してくれる人を探して提案に納得
    してもらうまでがお仕事
    • Perl 6 RFC の二の舞にならないように

    View full-size slide

  17. RFC 制度の導入
    2023年春の時点で 19 件の RFC が登録
    • 実装済み 6 件
    • 受理済み 3 件
    • 草稿段階 8 件 (3 件は実装済みのはず)
    • 却下済み 2 件
    • 登録待ち 1 件

    View full-size slide

  18. 改革の結果

    View full-size slide

  19. 5.30 (2019年)
    • 機能強化 9 件
    • 正規表現関連 2 件
    • Unicode 関連 4 件
    • 非互換変更 11 件
    • 廃止済みの機能の致死化 7 件
    • 機能廃止 1 件
    • モジュール削除 2 件

    View full-size slide

  20. 5.32 (2020年)
    • セキュリティ修正 3 件
    • 機能強化 11 件
    • 実験的機能追加 1 件
    • 実験的機能(正規表現)の昇格 2 件
    • Unicode 関連 3 件
    • 非互換変更 10 件
    • モジュール削除 1 件

    View full-size slide

  21. 5.34 (2021年)
    • 機能強化 4 件
    • 実験的機能追加 1 件
    • 新規モジュール 1 件

    View full-size slide

  22. 5.36 (2022年)
    • 機能強化 13 件
    • 実験的機能追加 6 件
    • 実験的機能の昇格 4 件
    • 非互換変更 1 件
    • 機能廃止 1 件
    • 新規関数 13 件

    View full-size slide

  23. 5.37.* (2022~2023年)
    • 機能強化 9 件
    • 実験的機能追加 1 件
    • 非互換変更 5 件
    • 機能廃止 2 件
    • 新規関数 2 件
    • 新規プラグマ 1 件

    View full-size slide

  24. この傾向はしばらく続きそう
    • Perl in 2025 で取り上げられたものの、 RFC
    にもなっていないものが残っています
    • 表には出ない内部的な変更も結構多いので
    過去に XS モジュールを書いた方はご確認を

    View full-size slide

  25. 新しい(実験的)機能

    View full-size slide

  26. isa 演算子 (5.32)
    isa メソッドで継承の判定を安全に行うには
    一手間必要でした
    use Scalar::Util qw(blessed);
    if (blessed $thing and $thing->isa('Foo::Bar')) {
    ...
    }

    View full-size slide

  27. isa 演算子 (5.32)
    isa 演算子はその一手間を省いてくれます
    use experimental qw(isa);
    if ($thing isa Foo::Bar) {
    ...
    }

    View full-size slide

  28. isa 演算子 (5.32)
    5.36 からはこれでもOK
    use v5.36;
    if ($thing isa Foo::Bar) {
    ...
    }

    View full-size slide

  29. 比較演算子の連結 (5.32)
    if ($min < $page < $max) {
    ...
    }
    ワンライナーでは便利そう

    View full-size slide

  30. try/catch (5.34)
    Syntax::Keyword::Try の成果を受けたもの
    use experimental qw(try);
    try {
    ...
    }
    catch($e) {
    ...
    }

    View full-size slide

  31. try/catch (5.34)
    try の中に return を入れても正しく扱われます
    use experimental qw(try);
    sub func {
    try {
    ...
    return "ok";
    }
    catch($e) { return "error: $e"; }
    }

    View full-size slide

  32. try/catch/finally (5.36)
    5.36 では finally も追加されました
    use experimental qw(try);
    try { ... }
    catch($e) { ... }
    finally { ... }

    View full-size slide

  33. try/catch/finally (5.36)
    Syntax::Keyword::Try の typed catch には未対応
    use v5.36;
    use Syntax::Keyword::Try qw(try :experimental(typed));
    try { ... }
    catch($e isa Class) { ... }
    catch($e =~ /Undefined/) { ... }
    finally { ... }

    View full-size slide

  34. defer (5.36)
    スコープを抜けるときに実行する処理を
    定義しておけるようになりました
    use experimental qw(defer);
    use File::Path;
    {
    mkdir $tmpdir;
    defer {
    # エラー死しても実行されます
    File::Path::remove_tree($tmpdir, { safe => 1 });
    }
    ...
    }

    View full-size slide

  35. サブルーチンシグネチャ (5.36)
    5.20 (2014年)で実験的に追加されたシグネチャが
    5.36 でついに(ほぼ)正式な機能になりました
    use feature qw(signatures);
    sub add ($x, $y) { $x + $y }

    View full-size slide

  36. サブルーチンシグネチャ (5.36)
    5.36 の機能バンドルにも含まれています
    use v5.36;
    sub add ($x, $y) { $x + $y }

    View full-size slide

  37. サブルーチンシグネチャ (5.36)
    ただし、シグネチャを利用した関数内で
    @_ を利用するのはまだ実験扱いです
    use v5.36;
    use experimental qw(args_array_with_signatures);
    sub func ($x, $y) {
    for (@_) {
    ...
    }
    other_func(@_);
    }

    View full-size slide

  38. use v5.36; で無効になる機能
    • use v5.36; によって use warnings; 相当の機能なども
    有効になります
    • use v5.36; によって無効になる機能もあります
    (5.36 で強制的に無効になる機能ではありません)
    • あえて使うときは use feature ... してください

    View full-size slide

  39. use v5.36; で無効になる機能
    メソッドの間接呼び出し
    use v5.36;
    use IO::File;
    my $fh = new IO::File;
    # 5.32 以降
    no feature 'indirect';
    use IO::File;
    my $fh = new IO::File;

    View full-size slide

  40. use v5.36; で無効になる機能
    多次元ハッシュキー
    use v5.36;
    $foo{$x, $y};
    # 5.34 以降
    no feature 'multidimentional';
    $foo{$x, $y};
    # 5.34 以前
    no multidimentional;
    $foo{$x, $y};

    View full-size slide

  41. use v5.36; で無効になる機能
    given/when 文
    use v5.36;
    # use feature qw(switch);
    # use experimental qw(smartmatch);
    given ($flag) {
    when ("foo") { ... }
    when ("bar") { ... }
    }

    View full-size slide

  42. ループで複数の値を同時に取り出す (5.36)
    use experimental qw(for_list);
    for my ($key, $value) (%hash) {
    # 取り出し順は不定
    ...
    }
    for my ($name, $version, $path)
    (@array) {
    ...
    }

    View full-size slide

  43. ループで複数の値を同時に取り出す (5.36)
    use experimental qw(for_list builtin);
    use builtin qw(indexed);
    for my ($i, $value) (indexed @array) {
    ...
    }
    添字と値を同時に…
    for my $i (0 .. $#array) {
    my $value = $array[$i];
    ...
    }

    View full-size slide

  44. builtin 関数 (5.36)
    • use しなくても使える実験的な関数が増えました
    • 既存の関数との衝突を避けるため
    builtin という名前空間が予約されています
    • 名前空間なしで使いたい場合は use builtin ... で

    View full-size slide

  45. builtin::trim (5.36)
    use utf8; 環境下では全角スペースなどもトリムされます
    use v5.36;
    use experimental qw(builtin);
    use utf8;
    my $string = ' (foo bar) ';
    say builtin::trim($string);
    # (foo bar)

    View full-size slide

  46. builtin::true, builtin::false (5.36)
    JSON::PP::Boolean を真偽値に使うのには抵抗
    がある、という人には朗報になるかも
    use experimental qw(builtin);
    use JSON::PP 4.11 ();
    say JSON::PP::encode_json({
    true => builtin::true,
    false => builtin::false,
    });
    # {"true":true,"false":false}

    View full-size slide

  47. builtin::true, builtin::false (5.36)
    CPAN モジュールのサポートはまだまだ限定的
    use experimental qw(builtin);
    use JSON::XS ();
    say JSON::XS::encode_json({
    true => builtin::true,
    false => builtin::false,
    });
    # {"true":"1","false":""}
    use experimental qw(builtin);
    use Cpanel::JSON::XS ();
    say Cpanel::JSON::XS::encode_json({
    true => builtin::true,
    false => builtin::false,
    });
    # {"true":1,"false":""}

    View full-size slide

  48. builtin::weaken, builtin::blessed,
    builtin::reftype (5.36)
    Scalar::Util からは多くの関数が取り込まれています
    use experimental qw(builtin);
    builtin::weaken($obj);
    if (builtin::blessed($obj)) { ... }
    if (builtin::reftype($obj) eq 'HASH') { ... }

    View full-size slide

  49. builtin::is_weak (5.36),
    builtin::is_tainted (5.37.2)
    たまに名前が異なるものがあるので要注意
    use experimental qw(builtin);
    use Scalar::Util;
    if (builtin::is_weak($obj)) { ... }
    if (Scalar::Util::isweak($obj)) { ... }
    if (builtin::is_tainted($obj)) { ... }
    if (Scalar::Util::tainted($obj)) { ... }

    View full-size slide

  50. builtin::ceil, builtin::floor (5.36)
    重たいPOSIXモジュールのかわりに
    use experimental qw(builtin);
    say builtin::ceil(5.5); # 6
    say builtin::floor(5.5); # 5

    View full-size slide

  51. export_lexically (5.37.2)
    特定のブロックのみにエクスポートできるモジュールを作成できます
    package My::Util;
    use v5.36;
    use experimental qw(builtin);
    sub import {
    my $class = shift;
    my %export = map { $_ => $class->can($_) // die "Can't export $_" } @_;
    builtin::export_locally %export;
    }
    sub foo { say "foo" }
    1;

    View full-size slide

  52. export_lexically (5.37.2)
    範囲外のところには取り込んだ関数は残っていません
    {
    use My::Util qw(foo);
    foo(); # foo
    }
    foo(); # Undefined subroutine &main::foo called

    View full-size slide

  53. export_lexically (5.37.2)
    builtin 関数も同じ性質を持っています
    {
    use Scalar::Util qw(reftype);
    say reftype($obj);
    }
    say reftype($obj); # OK
    {
    use builtin qw(reftype);
    say reftype($obj);
    }
    say reftype($obj); # NG

    View full-size slide

  54. module_true (5.37.6)
    バージョンバンドルなどを利用してこの機能を
    有効にしておくと、モジュールの末尾に真値を
    入れなくてもよくなります
    package Foo;
    use v5.37; # または use feature qw(module_true);
    sub foo { ... }
    # ここに真値を入れなくてもよくなります

    View full-size slide

  55. class (5.37.9)
    Object::Pad の成果を受けて、Perl コアでも
    クラスの実装が始まっています
    use v5.37;
    use experimental 'class';
    class Person {
    field $name :param;
    method name { $name }
    method say_hi { say "Hi, I'm $name." }
    }
    use Person;
    my $p = Person->new(
    name => 'charsbar',
    );
    $p->say_hi;
    # Hi, I’m charsbar.

    View full-size slide

  56. class (5.37.9)
    継承は :isa 属性で
    use v5.37;
    use experimental 'class';
    class Author :isa(Person) {
    field $pause_id :param;
    method pause_id { $pause_id }
    }
    use Author;
    my $me = Author->new(
    name => 'charsbar',
    pause_id => 'ISHIGAKI',
    );
    $me->say_hi;
    # Hi, I’m charsbar
    $me->pause_id
    # ISHIGAKI

    View full-size slide

  57. class (5.37.9)
    親クラスの field 変数は見えません
    use v5.37;
    use experimental 'class';
    class Author :isa(Person) {
    ...
    method name_and_id {
    # × "$name ($pause_id)"
    $self->name . " ($pause_id)";
    }
    }

    View full-size slide

  58. class (5.37.9)
    メソッドはシグネチャに対応しています
    use v5.37;
    use experimental 'class';
    class Author :isa(Person) {
    ...
    method say_hi_to ($person = "there") {
    say "Hi, $person!";
    }
    }

    View full-size slide

  59. class (5.37.9)
    これから実装されていくであろうもの
    • :reader などのアクセサ生成用属性
    • ロール
    • メタプログラミング (RFC 0022)
    • https://github.com/Ovid/Cor

    View full-size slide

  60. class (5.37.9)
    CPAN に上げるなら当面は従来の package や
    $VERSION も併用した方が無難です
    use v5.37;
    use experimental 'class';
    package Person;
    our $VERSION = '0.01';
    class Person {
    ...
    }

    View full-size slide

  61. 実験的な機能の昇格には通常二年
    • 昔のように特別な理由もなく何年も放置される
    ことにはならないとおもいますが…
    • 追加の実装が加わったり差し戻しが発生すると
    さらに伸びます(try/catch + finally)
    • 順調に行っても、今日紹介した実験的機能が
    すべて昇格するのはおそらく 2025 年(以降)

    View full-size slide

  62. コアの変更に取り残されないように
    • blead の変更で CPAN モジュールに影響が出る
    ことがあります
    • 時にはコア開発者からパッチが届くことも
    • Dist::Zilla などのツールを使っている方は
    READMEにひとこと説明を
    • perl5377delta.pod には既知の問題として
    Test::Vars などの未対応が言及されています

    View full-size slide

  63. サポート下限
    • ツールチェーンはまだ 5.8.1
    • 今年の Toolchain Summit で議論になるかも
    • 一部のモジュールは 5.12 くらいまで上がって
    きています
    • CentOS7 付属の Perl は 5.16

    View full-size slide

  64. 2023年の主要Perl関連イベント
    • Perl Toolchain Summit 2023
    (4/27~4/30, Lyon, France)
    • The Perl and Raku Conference 2023
    (6/11~13, Toronto, CA)
    https://tprc.to/tprc-2023-tor/
    • The Raku Conference 2023
    (8/3~4, Riga, Latvia)
    https://conf.raku.org
    • Perl and Koha Conference in helsinki 2023
    (8/14~18, Helsinki, Finland)
    https://intro.perlkohacon.fi/

    View full-size slide