本連載では第一線のPerlハッカーが回替わりで執筆していきます。今回のハッカーは清水隆博さんで、
Perlのバージョン
Perlは、
Perlインタプリタのソースコード
Perlの最初のリリース時にはGitは存在していませんでした。当時のPerlのソースコードは、
2008年に、
なお、
これまでのすべてのPerlのバージョン
Perlの各バージョンは、
$ git clone [email protected]: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バージョンや考古学的にメンテナンスされた古いバージョンを含め、perldoc perlhist
から参照できます。
過去のバージョンへの切り替え
git checkout
により、perl-1.
に切り替えてみましょう。
$ git checkout perl-1.0 $ git log commit 8d063cd8450e59ea1c611a2f4f5a21059a2804f1 (HEAD, tag: perl-1.0) Author: Larry Wall <[email protected]> Date: Fri Dec 18 00:00:00 1987 +0000
コミットログを見ると、
Perlインタプリタのソースコードリーディング
Perlのインタプリタは、
動的な読み方とは、gdb
やlldb
などのCデバッガを用いてトレースしながら処理を追っていく方法です。このためには、
静的な読み方とは、grep
やrg
、find
などのファイル検索コマンドを用いて読むべきファイルを探し出し、git log --grep='perl6'
などのコマンドで、
Perl 1.0──最初のPerl
1987年12月にLarry WallによってリリースされたのがPerl 1.comp.
ニュースグループ上で発表されました。当時、
リポジトリの構成
Perl 1.
サブディレクトリとしては、t
とx2p
があります。t
には、x2p
には、
インタプリタの実装
C言語は1989年に制定されたC89
main(argc,argv,env)
register int argc;
register char **argv;
register char **env;
{
register STR *str;
現代のC言語では、register
キーワードや、
スクリプトの解析と実行
スクリプト言語の処理系は、
- ❶字句解析
- 与えられたソースコードを、
内部で意味があるキーワードごとに分割する - ❷構文解析
- キーワードの並びから文脈を判断し、
抽象構文木を作成する - ❸抽象構文木の評価
- 実際に入力されたプログラムを実行する
字句解析
字句解析は、perly.
内のyylex関数で実装されています。
構文解析
構文解析は、perl.
で定義されています。このperl.
の中身が、
sexpr : sexpr '=' sexpr
{ $1 = listish($1);
if ($1->arg_type == O_LIST)
$3 = listish($3);
$$ = l(make_op(O_ASSIGN, 2, $1, $3, Nullarg,1)); }
上記のyaccコードは、$someVar = "foo"
)make_
関数でPerl 1.
Perl 1.STR
構造体として表現されます。配列は、ARRAY
で宣言されています。
ほかにも、CMD
、ARG
も存在します。また、STAB
や、HASH
が存在します。インタプリタの立ち上げ時には、STR
にマッピングしたものを登録するなどの処理が実行されます。
抽象構文木の評価
Perl 1.cmd_
関数で抽象構文中のCMD
構造体を評価していきます。抽象構文を構成する構造体であるCMD
にはIF
やWHILE
、BLOCK
などのPerlの制御構造が含まれ、ARG
にはADD
やPOP
、LT
などのPerl内の計算や関数名が含まれています。Perl 1.CMD
構造体を再帰的に評価していき、CMD
の子要素であるARG
を評価して処理を実行します。Perlプログラムの最適化は、CMD
構造体の評価時に行われます。
ドキュメントとテストコード
Perl 1.
Perl 1.cat
コマンドなどを用いて1つのman
ファイルを生成します。
perl.man.1とperl.man.2を連結してperl.manを作成 $ cat perl.man.1 perl.man.2 > perl.man 作成したperl.manをmanコマンドを使ってレンダリングする $ man ./perl.man
テストコードはtディレクトリの中に置かれています。命名規則はテストしたい内部構造体.その内容です。たとえばio.
は入出力のファイルハンドルのテスト、cmd.
ファイルは制御構造のwhile
文のテストとなっています。これらのテストの多くは現在のPerl5でも実行可能で、
基本文法
先ほど作成したmanページやテストコードを見ながら、
データ構造
現代のPerl 5のデータ型は、
演算子
演算子は現在のPerl 5と同様に、ne
などの文字列比較演算子と==
などの数値比較演算子が区分されています。直前の式を繰り返すx
演算子なども、
現在は範囲演算子として広く利用されている..
は、$left .. $right
と使用し、$right
が偽の値になるまで全体として真を返し、$right
が偽になると以降は全体で偽を返します。この挙動がフリップフロップ回路と似ているため、..
は、awk'NR==2, NR==4 { print $0 }'
と、..
として実装されたと考えられます。
フォーマット機能
Perlでは、format
から始まるテンプレート記法に基づいて、
そのほかの機能
Perl 1.if
、unless
、for
やwhile
などの制御構造が実装されています。ただし、foreach
は実装されていません。
また、join
、pop
やpush
などのリスト操作系の関数や、open
などの関数もこの時点で実装されています。
<続きの
本誌最新号をチェック!
WEB+DB PRESS Vol.130
2022年8月24日発売
B5判/
定価1,628円
ISBN978-4-297-13000-8
- 特集1
イミュータブルデータモデルで始める
実践データモデリング
業務の複雑さをシンプルに表現! - 特集2
いまはじめるFlutter
iOS/Android両対応アプリを開発してみよう - 特集3
作って学ぶWeb3
ブロックチェーン、スマートコントラクト、 NFT