Perl Hackers Hub

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

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

本連載では第一線のPerlハッカーが回替わりで執筆していきます。今回のハッカーは清水隆博さんで,テーマは「Perl歴史散策」です。Perl 1.0から現在までのバージョンを,実装と構文の両面から追っていきます。

Perlのバージョン

Perlは,最初のリリースである1.0から現在に至るまで,数々のバージョンの遍歴を経ています。みなさんが現在利用しているのは,ほとんどがPerl 5のいずれかのバージョンでしょう。Perlはバージョンが上がるにつれて,構文はもちろんのこと,C言語によるインタプリタの実装もさまざまな改良や変更が行われてきました。そこで本稿では,最初のリリースから現在までの代表的なPerlのバージョンについて,Perlの構文とC言語による実装の両方の側面から追っていきます。

Perlインタプリタのソースコード

Perlの最初のリリース時にはGitは存在していませんでした。当時のPerlのソースコードは,メーリングリストやPerforce注1で管理されていました。

2008年に,これらの履歴も含めてGitリポジトリに変換する作業が行われました。そして2019年に,GitリポジトリのGitHubへの移行が行われます。その結果,現在はGitHub上で,C言語で実装されたPerlインタプリタのソースコードを,すべての履歴を含め参照可能です。

なお,本稿の後半でPerl 6についても触れますが,上記のGitHubリポジトリにはPerl 6のソースコードは含まれません。

注1)
バージョン管理ツールの一種です。

これまでのすべてのPerlのバージョン

Perlの各バージョンは,Gitのタグとして管理されています。実際にリポジトリをGitHubからcloneし,タグを確認してみます。

$ git clone git@github.com:Perl/perl5.git
$ cd perl5
$ git tag
GitLive-blead
(省略)
if-0.0605
perl-1.0
perl-1.0.15
perl-1.0.16
perl-2.0
perl-2.001
perl-3.000
perl-3.044
perl-4.0.00
perl-4.0.36
perl-5.000
(省略)

RCバージョンや考古学的にメンテナンスされた古いバージョンを含め,執筆時点(2020年5月)で374バージョン(タグ)が存在しています。過去の代表的なPerlのバージョンや,pumpkingと呼ばれるバージョンごとのメンテナンスリーダーの遍歴は,perldoc perlhistから参照できます。

過去のバージョンへの切り替え

git checkoutにより,以前のバージョンのソースコードに切り替えられます。Perl 1.0のソースコードであるタグperl-1.0に切り替えてみましょう。

$ git checkout perl-1.0
$ git log
commit 8d063cd8450e59ea1c611a2f4f5a21059a2804f1 (HEAD, tag: perl-1.0)
Author: Larry Wall <lwall@jpl-devvax.jpl.nasa.gov>
Date:   Fri Dec 18 00:00:00 1987 +0000

コミットログを見ると,Perl 1.0はLarry Wallによって1987年12月にリリースされていることがわかります。

Perlインタプリタのソースコードリーディング

Perlのインタプリタは,Perl 1.0の時点でそこそこの大きさのプログラムです。筆者が巨大なC言語のプログラムを読む際は,動的な読み方と静的な読み方を使い分けます。

動的な読み方とは,ビルドしたPerlインタプリタをgdblldbなどのCデバッガを用いてトレースしながら処理を追っていく方法です。このためには,Cコンパイラにデバッグオプションを指定したうえでPerlインタプリタをビルドする必要があります。

静的な読み方とは,greprgfindなどのファイル検索コマンドを用いて読むべきファイルを探し出し,エディタ上で読んでいく方法です。Gitリポジトリ限定ですが,git log --grep='perl6'などのコマンドで,読むべきコミットをログから検索する手法もあります。

Perl 1.0─⁠─最初のPerl

1987年12月にLarry WallによってリリースされたのがPerl 1.0です。Perl 1.0は,comp.sources.miscニュースグループ上で発表されました。当時,汎用的なスクリプト言語はまだ存在しませんでしたが,sed,awk,shやC言語などはありました。当時のPerlは,これらの言語の影響を強く受けてデザインされています。

リポジトリの構成

Perl 1.0のリポジトリは全108ファイルで構成されています。含まれるファイルの大半がC言語のソースコード,ヘッダファイルです。現在のPerl 5でも使用されているビルドツールのConfigure,README,次期バージョンでのToDoがまとめられたWhishlistなども含まれています。これらのファイルは,ほとんどがトップディレクトリに置かれています。

サブディレクトリとしては,tx2pがあります。tには,Perlインタプリタのテスト用コードが置かれています。x2pには,awk,sedのコードをPerl 1.0のコードに変換するコマンドを構成するソースコードが置かれています。

インタプリタの実装

C言語は1989年に制定されたC89(ANSI C)が最古の規格ですが,Perl 1.0はその規格が登場する前に発表されています。このため,Perl 1.0はいわゆるK&R Cスタイルと呼ばれる,C言語規格化前のスタイルで実装されています。たとえばPerl 1.0のmain関数のソースコードは次のものです。

main(argc,argv,env)
register int argc;
register char **argv;
register char **env;
{
    register STR *str;

現代のC言語では,registerキーワードや,main関数の3つ目の引数は非推奨です。また,現在のPerl 5のソースコードと比較すると,ソースコード中のコメントは非常に少ないです。

著者プロフィール

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

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

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

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