(1)はこちら、(2)はこちらから。
Perl 5.0──現在のPerl
1994年10月にPerl 5.0がリリースされました。タグはperl-5.000
です。以降Perlは、25年以上にわたって、Perl 5.xのまま進化していくことになります。
Perl 5.0で導入された新機能は、かなりの数があります。
- 変数のスコープをレキシカルに限定する
my
の登場
- Perl APIをCから利用し、一部の処理をCで実装することを可能にしたXSの登場
- ビルド時に利用される最小単位のインタプリタであるminiperlの登場
- リファレンスの登場
- リファレンスと
bless
を組み合わせることによるオブジェクト指向の導入
インタプリタの実装
Perl 5.0は、C言語での実装の面からも劇的な変化がありました。Perl 4までは、Perl 1.0で作成した土台の上に増築していく手法でインタプリタが開発されてきました。それに対してPerl 5.0では、内部で利用される構造体や表現方法、Cのソースファイルの命名変更などの抜本的な変更が行われました。内部構造として変化があったものの中から、代表的なものを紹介します。
- データ型の内部構造体の大幅な変更
- 文字列型STRが、現在のPerlでも利用されるSV構造体にリプレイスされる
- 配列やハッシュの内部構造の再実装
- 抽象構文木の中心となるデータ型も、ARG型からOP型へ書きなおされる
- Perlの標準関数の評価を行う処理の再実装
- 従来の関数を利用した定義から、マクロを活用した定義に変更される
さらに、内部構造の歴史的な複雑性を解消し、新しい処理フローへと変更させるために、さまざまな機能が追加、書きなおされました。今まで継ぎ接ぎしていたインタプリタはここでリセットされ、新たなPerlインタプリタとして開発が進んでいくことになったのです。
ライブラリ側の対応
Perl 5.0からライブラリはいかに変化したのでしょうか。Perl 4まではpl
拡張子のPerlスクリプトをロードしライブラリとして利用していましたが、Perl 5からはpm
拡張子でモジュール専用ファイルを作成することになりました。package
構文なども、Perl 5.0から導入されました。当時のライブラリを確認すると、いくつかのライブラリでは積極的にmy
での宣言を行うなど、現代的なPerlプログラムになりつつあります。
Perl 5.0以降の進化
Perl 5.0以降長く使われているPerl 5ですが、Perl 5の中でもさまざまな変更が行われています。
バージョンは、Perl 5.5.640
以降では、現在と同様に5.の次の数が奇数バージョンは開発版、偶数バージョンは安定版の位置付けに変更されています。また、従来はperl5.004_05
と3桁の数値とパッチの数で表現されていたバージョンが、Perl 5.6以降はperl5.6.0などの現在の表記に変更されています。
インタプリタの実装の進化
インタプリタは、Perl 4からPerl 5への変更時に近い抜本的な新機能はありません。ただし、メンテナンスオンリーの方針が採られているわけではありません。
たとえばC言語のスタイルの変更などが行われています。Perl 5.0の時点では、それまでと同様にK&RスタイルのC言語で実装されていました。K&RスタイルからANSI Cへの変更は、Perl 5.04のバージョンの時代に段階的に行われました[1]。変更は、GNUの自動ツールと手作業で行われています。
またPerl 5.31.7ではオブジェクトが特定のクラスのインスタンスか調べるisa
演算子が追加されました。演算子が追加されると、対応する抽象構文木の要素の生成処理がop.c
などに追記されています。
構文の進化
最初にあった比較的大きな構文の変更はPerl 5.6です。Perl 5.6では、変数宣言のour
が登場し、UTF-8のサポートが追加されるなどがありました。また、すでに非推奨ですが、Perl 5.6ではithreadsと呼ばれるスレッドのしくみが導入されました。
ほかにも、サブルーチンの呼び出し時に引数の型をチェックするサブルーチンシグネチャの機能の強化などが5.20以降段階的に行われています。
最近の進化では、Perl 5.31.10で連鎖比較(chained comparisons)が追加されました。今までif
文中などで3変数の比較を行う際に、($lower < $n) && ($n < $upper)
と書く必要がありました。Perl 5.31.10から$lower < $n < $upper
とまとめて記述することが可能となりました。
これからのPerl 5
現在、PerlのコミッターであるOvidやSawyerXらによって、小さなオブジェクト指向プログラミングモジュールであるCorの設計やコアモジュール化の議論がなされています。Perlは十分枯れている言語ではありますが、進化を止めた言語ではありません。
Perl 6そしてRaku
さて、ここまではPerl 5のリポジトリの流れを追ってきましたが、Raku(Perl 6)の存在を忘れてはいけません。
2000年に設計が始まったPerl 6は、仕様と実装が分離されている言語です。仕様はドキュメント上での定義から始まり、現在はRakuのテストが集められたRoastリポジトリが仕様です。実装は、Pugs、Parrotを経て、現在はRakudoです。現在のPerl 6はPerl 5とは別言語扱いになっており、2019年に正式にRakuへと名前の変更が行われました。RakudoはRakuで記述されたRakudoそのものとRakudoの実装言語であるNQP、動作環境であるMoarVMで成り立っています。現在、言語名はRaku、主要な実装はRakudoとなっています。
Rakuは、Perl 5で後付けとして実装されたオブジェクト指向部分を最初から組み込み、より良いオブジェクトシステムを目指して開発されています。Rakuの副産物としてPerl 5に導入された機能、モジュールもいくつか存在します。代表的なものに、print
関数に改行を自動で付けたsay
関数、オブジェクトシステムを提供するClass::MOP
やMoose
などがあります。
これからのRaku
以前は起動が壊滅的に遅かったRakuですが、アップデートのたびに高速化が図られています。起動後の処理も、一部の正規表現などではPerl 5より高いパフォーマンスを発揮し、着実に進化しています。
Rakuの次期バージョンである6.e
までの具体的な道筋はGitHub Projectsで管理されていますので、今後のRakuに興味がある方はご覧ください。
まとめ
本稿では、Perlの変遷を見てきました。Perlの言語的なデザインは、Perl 1.0時代のものが少しずつ更新されてきました。そしてPerl 4とPerl 5の間で、実装と機能の両面で大きな進化を遂げました。その後はPerl5として長く進化を続け、別プロジェクトとなったRakuも登場しています。
本稿が、Perlを使ったプログラミングと、Perlそのもののプログラミングに興味を持っていただくきっかけになれば幸いです。
さて、次回の執筆者は谷脇真琴さんで、テーマは「静的解析ライブラリの選び方・使い方」です。お楽しみに。
- 特集1
イミュータブルデータモデルで始める
実践データモデリング
業務の複雑さをシンプルに表現!
- 特集2
いまはじめるFlutter
iOS/Android両対応アプリを開発してみよう
- 特集3
作って学ぶWeb3
ブロックチェーン、スマートコントラクト、NFT