本連載では第一線のPerlハッカーが回替わりで執筆していきます。今回のハッカーは清水隆博さんで、
Perlのバージョン
Perlは、
Perlインタプリタのソースコード
Perlの最初のリリース時にはGitは存在していませんでした。当時のPerlのソースコードは、
2008年に、
なお、
これまでのすべてのPerlのバージョン
Perlの各バージョンは、
$ 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バージョンや考古学的にメンテナンスされた古いバージョンを含め、perldoc perlhistから参照できます。
過去のバージョンへの切り替え
git checkoutにより、perl-1.に切り替えてみましょう。
$ 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インタプリタのソースコードリーディング
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 



