Perlの最新バージョン 5.24リリース - サブルーチンと数値計算の高速化、Unicode 8.0のサポート、文法機能強化



  1. Perl




  2. バージョン情報



  3. here

 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が、Perl 5.10で、実験的に追加されましたが、これが廃止されます。

ネストされた宣言が許可されなくなった

 ネストされた宣言は許可されなくなりました。以下の記述はコンパイルエラーになります。

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コアのほうで、サポートするのがよいと感じました。文法変化形のモジュールが、外部のモジュールとして実装されると、常に壊れる可能性がでてくるからです。



  1. Perl




  2. バージョン情報



  3. here