Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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 <- イマココ

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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)

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

改革の結果

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

新しい(実験的)機能

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

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 { ... }

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

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;

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

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

Slide 42

Slide 42 text

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

Slide 43

Slide 43 text

ループで複数の値を同時に取り出す (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]; ... }

Slide 44

Slide 44 text

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

Slide 45

Slide 45 text

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)

Slide 46

Slide 46 text

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}

Slide 47

Slide 47 text

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":""}

Slide 48

Slide 48 text

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') { ... }

Slide 49

Slide 49 text

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)) { ... }

Slide 50

Slide 50 text

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

Slide 51

Slide 51 text

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;

Slide 52

Slide 52 text

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

Slide 53

Slide 53 text

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

Slide 54

Slide 54 text

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

Slide 55

Slide 55 text

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.

Slide 56

Slide 56 text

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

Slide 57

Slide 57 text

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)"; } }

Slide 58

Slide 58 text

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

Slide 59

Slide 59 text

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

Slide 60

Slide 60 text

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

Slide 61

Slide 61 text

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

Slide 62

Slide 62 text

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

Slide 63

Slide 63 text

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

Slide 64

Slide 64 text

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/

Slide 65

Slide 65 text

Thank you