Perl Hackers Hub

第62回 Perl歴史散策 ―インタプリタの実装と,構文の進化をたどる(3)

この記事を読むのに必要な時間:およそ 2 分

(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とまとめて記述することが可能となりました。

注1)
コミットIDの8ac853655d9b744749adcb9687c13d99cdd6e9fbなどです。

これからのPerl 5

現在,PerlのコミッターであるOvidやSawyerXらによって,小さなオブジェクト指向プログラミングモジュールであるCorの設計やコアモジュール化の議論がなされています。Perlは十分枯れている言語ではありますが,進化を止めた言語ではありません。

Perl 6そしてRaku

さて,ここまではPerl 5のリポジトリの流れを追ってきましたが,Raku(Perl 6)の存在を忘れてはいけません。

2000年に設計が始まったPerl 6は,仕様と実装が分離されている言語です。仕様はドキュメント上での定義から始まり,現在はRakuのテストが集められたRoastリポジトリが仕様です。実装は,PugsParrotを経て,現在はRakudoです。現在のPerl 6はPerl 5とは別言語扱いになっており,2019年に正式にRakuへと名前の変更が行われました。RakudoはRakuで記述されたRakudoそのものとRakudoの実装言語であるNQP動作環境であるMoarVMで成り立っています。現在,言語名はRaku,主要な実装はRakudoとなっています。

Rakuは,Perl 5で後付けとして実装されたオブジェクト指向部分を最初から組み込み,より良いオブジェクトシステムを目指して開発されています。Rakuの副産物としてPerl 5に導入された機能,モジュールもいくつか存在します。代表的なものに,print関数に改行を自動で付けたsay関数,オブジェクトシステムを提供するClass::MOPMooseなどがあります。

これからのRaku

以前は起動が壊滅的に遅かったRakuですが,アップデートのたびに高速化が図られています。起動後の処理も,一部の正規表現などではPerl 5より高いパフォーマンスを発揮し,着実に進化しています。

Rakuの次期バージョンである6.eまでの具体的な道筋はGitHub Projectsで管理されていますので,今後のRakuに興味がある方はご覧ください。

まとめ

本稿では,Perlの変遷を見てきました。Perlの言語的なデザインは,Perl 1.0時代のものが少しずつ更新されてきました。そしてPerl 4とPerl 5の間で,実装と機能の両面で大きな進化を遂げました。その後はPerl5として長く進化を続け,別プロジェクトとなったRakuも登場しています。

本稿が,Perlを使ったプログラミングと,Perlそのもののプログラミングに興味を持っていただくきっかけになれば幸いです。

さて,次回の執筆者は谷脇真琴さんで,テーマは「静的解析ライブラリの選び方・使い方」です。お楽しみに。

WEB+DB PRESS

本誌最新号をチェック!
WEB+DB PRESS Vol.119

2020年10月24日発売
B5判/160ページ
定価(本体1,480円+税)
ISBN978-4-297-11669-9

  • 特集1
    [古い技術,コードの重複,密結合]
    フロントエンド脱レガシー
    長く愛されるプロダクトをさらに改善していくために
  • 特集2
    インフラ障害対応演習
    「避難訓練」でいざに備える!
  • 特集3
    深層学習入門以前
    チュートリアルを動かす前に知っておくこと

著者プロフィール

清水隆博(しみずたかひろ)

id:AnaTofuZ。インターネットネームは八雲アナグラ。沖縄方面の大学院生。

Okinawa.pmとPerl入学式などに出没。

普段はCとPerlをメインで書いており、隙を見て研究室のツールや大学のシステムにPerlをねじ込んでいる。