Perlの最新バージョン 5.24リリース - サブルーチンと数値計算の高速化、Unicode 8.0のサポート、文法機能強化
Perlの最新バージョン5.24がリリースされました。今回のリリースでは、Perlのサブルーチンと数値計算の高速がなされています。また、機能面では、Unicode 8.0のサポートがなされました。文法的な強化として、前方デリファレンスの実験的なステータスがはずされています。その他、細かなバグフィックスがなされました。
Perl 5.22に引き続きPerl 5.24では、Perlの内部コードの改善がなされています。パフォーマンスの改善という大きなメリットがありますが、いくつかの副作用もありますので、合わせて、解説します。
自分が技術的に不慣れで、安定的なPerlを望むなら、今のところPerl 5.20がおすすめです。技術的に強く、パフォーマンスの改善や新しい機能にチャレンジしたい方は、Perl 5.24にトライしてみてください。
以下で、Perl 5.24の変更点を解説します。
=====
パフォーマンスの改善
Perl 5.24の最大の変更点は、パフォーマンスの改善です。
サブルーチン呼び出しの高速化
スコープ生成と終了のオーバーヘッドをできる限り減らしたので、ループとブロックが速くなりました。たとえば、以下の空のサブルーチンは、今までの約三倍の速さで実行できます。
sub f{} f();
5.24の変更で、最もうれしいのはこれでしょう。Perlの問題点のひとつにサブルーチン呼び出しが遅いというものがありましたが、これによって、問題のひとつが改善されています。
大文字、小文字を扱う関数、正規表現のパフォーマンス改善
中国語のように、大文字小文字の区別がない言語があります。このような言語については、ロジックをスキップすることによって、ucfirst関数や「qr//i」のパフォーマンスが上昇しました。
substrの高速化
memchrがサポートされているプラットフォームにおいてsubstrが高速化されました。以下の処理が、7倍程度速くなっています。
$s = "a" x 1000 . "wxyz"; $s =~ /wxyz/ for 1..30000
足し算・引き算・掛け算の高速化
Perl 5.8.0において、64bit整数をサポートするために、数値演算が遅くなっていましたが、この遅いロジックが改善さました。Perlは、数値演算が遅いといわれますが、少し改善されました。
インクリメント・デクリメントの性能の改善
Perlのインクリメント・デクリメントの性能が改善されました。ループ処理などが、少し速くなります。
機能面の強化
Unicode 8.0のサポート
Unicode 8.0がサポートされました。PerlはUnicodeサポートの対応が速いです
新しい正規表現 \b{lb}
改行の区切りを表現する新しい正規表現「\b{lb}」が追加されました。
前方デリファレンスの実験的なステータスがとれました
Perl 5.24では、前方デリファレンスが、最初から、有効になりました。このおかげで、リファレンスからの、配列スライス、ハッシュスライス、部分ハッシュ取得、部分配列取得の処理が、記述しやすくなっています。
# 前方デリファレンス my $nums_ref = [1, 2, 3]; my @nums = $nums_ref->@*; # (1, 2, 3); # 前方デリファレンスを使用した配列スライス my @nums_part = $nums_ref->@[0, 2]; # (1, 3) my $names_h_ref = { ken => 1, taro => 2, kimoto => 3 }; # 前方デリファレンスを使用したハッシュスライス my @names_part = $names_h_ref->@{'ken', 'kimoto'}; # (1, 3) # 前方デリファレンスを使用した部分ハッシュ取得 my %names_h_part = $names_h_ref->%{'ken', 'kimoto'}; # (ken => 1, kimoto => 3)
互換性のない変更
今回のリリースでは、いくつかの実験的な機能が、削除されています。
自動デリファレンスの削除
廃止警告が出されていた、実験的な自動デリファレンスが削除されました。たとえば、以下の処理が動かなくなります。push, pop, shift, unshift, splice, keys, values, eachに、リファレンスを渡すことはできません。
レキシカルな$_が廃止されました。
C
ネストされた宣言が許可されなくなった
ネストされた宣言は許可されなくなりました。以下の記述はコンパイルエラーになります。
my ($x, my($y)); our (my $x);
chdir('')は、ホームディレクトに移動できなくなりました
chdir('')は、ホームディレクトリに移動できなくなりました。chdir()を使ってください。
知られている問題
Perl 5.24では、内部的な改善のために、保証されない実装を利用している、いくつかのモジュールが、動かなくなっています。これは、現在Perlのコアチームで、議論されているので、経過を見守りましょう。
- Algorithm::Permute
- Coro
- Data::Alias
- RPerl
- Scope::Upper
- TryCatch
- lexical::underscore
最近のPerlは、内部改善が多く行われているので、内部APIに依存した、文法変化形のモジュールに依存することは、リスクが伴っています。
所見
Perlのパフォーマンスが上がることはうれしい変更です。この方向性は、間違ってはいないと思います。このために、内部改善が必要ですが、そのために、いくつかの文法変化形のモジュールが、壊れるという状況になっています。
特に、議論の的としては、Coroの話題が大きいようです。将来的には、コルーチンをPerlコアのほうで、サポートするのがよいと感じました。文法変化形のモジュールが、外部のモジュールとして実装されると、常に壊れる可能性がでてくるからです。