スクリプトの解析と実行
スクリプト言語の処理系は,
- ❶字句解析
- 与えられたソースコードを,
内部で意味があるキーワードごとに分割する - ❷構文解析
- キーワードの並びから文脈を判断し,
抽象構文木を作成する - ❸抽象構文木の評価
- 実際に入力されたプログラムを実行する
字句解析
字句解析は,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
などの関数もこの時点で実装されています。
- 注2)
- 現在のPerlでも,
スカラコンテキストで評価すると, 当時と同様の機能が使用できます。
<続きの
本誌最新号をチェック!
WEB+DB PRESS Vol.121
2021年2月22日発売
B5判/
定価
ISBN978-4-297-11960-7
- 特集1
[さらに速く! さらに書きやすく!]
詳解Ruby 3
JITコンパイラ,並列プログラミング, 静的型解析 - 特集2
UIKit,SwiftUI, iPadOS, ウィジェット
iOS 14最前線 - 特集3
個人と組織の目標がリンクする管理手法
OKR運用指南