Perl Hackers Hub

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

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

前回の(1)こちらから。

Perl 2.0─⁠─ より「らしく」なったレガシーPerl

1988年6月に,Perl 2.0がリリースされました。タグはperl-2.0です。Perl 2.0での変更点は,Larryによるコミットメッセージに簡潔にまとまっています。主には次の変更がありました。

  • 拡張正規表現*+(foo|bar)文字クラス\s\dなどの追加
  • local変数の追加
  • foreachの追加
  • Perlスクリプトの拡張子がplとして定義され,do foo. plでスクリプト中にロードが可能に
  • いくつかのPerl製のモジュールの初期実装が登場

Perl 5では変数宣言の際にmyourlocalの3種類のキーワードを利用しますが,この中ではlocalが最初に登場しました。

リポジトリの構成

Perl 2.0のリポジトリでは,正規表現周りの処理を担うregexp.(c|h)の追加や,トーカナイズを担当する関数yylextoke.cに切り分けられたりなどの変更がありました。

また,Perlの実践的なスクリプト例を集約したegディレクトリが登場します。ここには,たとえばカレントディレクトリ配下のそれぞれのディレクトリに対してdu -sを実行するdusプログラムなどが含まれます。これらのスクリプトは,多少修正すればPerl 5でも実行できます。

現在のPerlモジュールの原型であるライブラリも,libディレクトリの中にgetoptimportenvstatの3種類が入っています。パッケージ構文はまだ存在していなかったため,名前空間の概念は存在しません。そのため,モジュールとしての利用ではなく,サブルーチンと定数を定義するファイルとしての役割を持っています。Perl 2.0ではサブルーチンは,do subRoutine()のように呼び出します。

正規表現の実装

Perl 2.0の正規表現の実装であるregexp.cの冒頭には,次のコメントがあります。

/* NOTE: this is derived from Henry Spencer's regexp code, and should not
 * confused with the original package (see point 3 below). Thanks, Henry!
 */

ここに登場するHenry Spencerは,1986年に公開されたC言語の正規表現ライブラリであるregexpの開発者です。このregexpは現在ではold regexpと呼ばれており,GitHubリポジトリ上に現存しています。

Perl 2.0の正規表現エンジンは,Larryがこのregexpを参考に実装したものであるため,続くコメントではregexpのライセンスについての説明が書かれています。

Perl 3.0 ─⁠─ Perl 5の原型

続いては,1989年10月にリリースされたPerl 3.0のソースコードを確認します。タグはperl-3.000です。Perl 2.0と同様に新機能はコミットメッセージにまとまっており,主に次の変更がありました。

  • 連想配列が公式のデータ型に昇格
  • バイナリ操作が可能なpackunpackの導入
  • デバッガの強化
  • サブルーチンの呼び出し方法がdo hoge()から&hoge()に変更
  • mkdirgetpidなどのOSのAPIをPerlから利用できる関数の追加

サブルーチンの呼び出し以外にも,forforeachが等価になったことなどのさまざまな変更がありました。Perl 3.0は,ほぼ現在のPerl 5の文法の原型となっています。

リポジトリの構成

Perl 3.0のリポジトリでは,いくつかのファイルの分割や追加が行われました。たとえば正規表現の実装があるregexp.cは,Perl 3.0では内部表現にコンパイルするregcomp.cと処理を担当するregexec.cに分割されています。

manページを構成するファイルは4つに増加しました。Perl 3.0のmanページは,特殊変数などが新しく記述されたほか,サンプルコードが多く掲載されています。これらのサンプルコードと,実践例であるegディレクトリの内容を見るだけで,プログラミングができるほど充実しています。

Perl 4.0─⁠─ 広く使われだしたPerl

次は,1991年3月にリリースされたPerl 4.0のソースコードを確認します。タグはperl-4.0.00です。

Perl 4.0本体のソースコードは,Perl 3.0とほとんど同じです。さらに言えば,Perl 4.0は正式リリースではないようでした。perl-4.0.00のタグが付けられているコミットメッセージは次のとおりです。

perl 4.0.00: (no release announcement available)

So far, 4.0 is still a beta test version. For the last production
version, look in pub/perl.3.0/kits@44.

アナウンスができない状態にもかかわらず,なぜバージョンアップが行われたのでしょうか。実は,ラクダ本と呼ばれる『プログラミングPerl』注1の初版が出版された記念でバージョンアップが行われたのです。

その後,36ものパッチが当てられ,perl-4.0.36のバージョンでPerl 4として完成しました。これらのパッチでは,ブロック中の例外を捕捉するeval関数の追加や,リストを受け取りソートするsort関数の追加が行われています。

日本でもラクダ本などのPerlの書籍が多数出版されたこともあり,Perl 4は広く使われだします。日本語対応のパッチを当てたJPerlなどが登場したのもPerl 4の時代です。

注1)
Larry Wall,Tom Christiansen,Jon Orwant著/近藤嘉雪訳『プログラミングPerl 第3版 VOLUME 1,2』オライリー・ジャパン,2002年

リポジトリの構成

Perl 4.0本体のソースコードはPerl 3.0とほとんど同じですが,リポジトリには新たなディレクトリとしてemacsh2plos2msdosusubが追加されています。emacsディレクトリには,EmacsエディタでPerlをプログラミングしやすくするEmacs Lispが含まれています。h2plディレクトリには,C言語のヘッダファイルをPerlで使える形式に変換するプログラムが含まれています。os2msdosディレクトリには,OS/2,MSDOSというOS上でPerlをサポートするCプログラムが含まれています。usubディレクトリの内容は現在のXS注2に近く,独自に書いたCのルーチンをPerlにリンクさせ,Perlを拡張する一連のライブラリが含まれています。

注2)
C言語を用いてPerlを拡張できる言語です。

<続きの(3)こちら。>

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をねじ込んでいる。