O - Perl コンパイラバックエンドへの汎用インターフェース
perl -MO=[-q,]Backend[,OPTIONS] foo.pl
これは Perl コンパイラへのフロントエンドとして使われる モジュールです.
モジュールに対して -q オプションを渡すと, コンパイル中 STDOUT
ファイルハンドルが $O::BEGIN_output に対してリダイレクトされます.
これによって BEGIN ブロックや use されたモジュールから STDOUT への出力が,
出力される代わりにこの変数に格納されます. これは結果を出力するバックエンド
(Deparse, Concise 等)を使う際に便利です. そしてその出力はコンパイル
されているコードから生成される出力と混同しません.
-qq オプションは -q と同じように振る舞います. 違いは deparse
終了時に STDERR を閉じることです. これは通常 perl が通常生成する
"Syntax OK" メッセージを抑制します.
多くのコンパイラバックエンドは次のような慣例を持っています:
OPTIONS はコンマで区切られた(空白を持たない)単語のリストから成る.
-v オプションは大抵バックエンドを verbose モードにする.
-ofile オプションは出力を標準出力ではなく file に生成する.
様々な文字が続く -D オプションは内部でバッグフラグを有効にする.
欲しているバックエンドに関するドキュメントも読んでください.
(以下ではB::Backendとします.)
このセクションではこのモジュールを通して使うことができる コンパイラバックエンドモジュールを書こうとしている人にのみ 必要となります.
SYNOPSIS(概要)セクションにかかれているコマンドラインは以下のような Perl コードに対応します.
use O ("Backend", OPTIONS);
importと呼ばれる関数で適切なB::Backendモジュールをロードし,
そのパッケージのcompile関数を OPTIONS を渡して呼び出します.
この関数は CALLBACK と呼ばれる関数リファレンスを返す必要があります.
次に, "コンパイルのみ" フラグ(コマンドラインオプション -c と
等価です)が設定され, CALLBACK を呼び出すCHECKブロックが登録されます.
そしてコマンドラインで指定されているメインPerlプログラムが読み込まれ,
parse, そして内部構文木形式へとコンパイルされます. -cフラグが
設定されているときは, プログラムは実行を開始されません(もちろん
BEGINブロックは除いて)が, コンパイラバックエンドによって登録された
CALLBACK 関数は呼び出されます.
要約すると, コンパイラバックエンドモジュールは "B::Foo" として
呼ばれるべきで, その名前に対応するディレクトリに配置します.
そして compile という関数を定義しなければ成りません.
ユーザが次のように入力すると,
perl -MO=Foo,OPTIONS foo.pl
その関数が呼び出され, OPTIONS (をコンマで切り分けた物)が引数として
渡されます. この関数はメインコンパイル関数となる関数リファレンスを
返さなければなりません. ユーザのプログラムがロード, そしてparseされ
ると, 関数が返した関数リファレンスが呼び出され, コンパイルを実行します.
コンパイルは大抵 B モジュールの機能を使って行われるでしょう.
perl が PerlIO のサポート付きでコンパイルされていないと
-q 及び -qq オプションは正しく動作しません : $O::BEGIN_output
にリダイレクトされる代わりに STDOUT が閉じられるでしょう.
Malcolm Beattie, mbeattie@sable.ox.ac.uk