O - Perl 編譯器後端通用介面
perl -MO=[-q,]Backend[,OPTIONS] foo.pl
這是用於 Perl 編譯器前端的模組。
如果將 -q
選項傳遞給模組,則在編譯期間,STDOUT 檔案句柄將重新導向到變數 $O::BEGIN_output
中。這會讓 BEGIN 區塊或已使用的模組列印到 STDOUT 的任何輸出儲存在此變數中,而不是列印出來。對於會自行產生輸出的後端(例如 Deparse
、Concise
等)很有用,這樣它們的輸出就不會與正在編譯的程式碼產生的輸出混淆。
-qq
選項的行為類似於 -q
,但它在完成解析後也會關閉 STDERR。這會抑制 perl 通常產生的「語法正確」訊息。
大多數編譯器後端使用下列慣例:OPTIONS 包含一個以逗號分隔的字詞清單(沒有空白)。-v
選項通常會將後端置於詳細模式。-ofile
選項會將輸出產生到 檔案,而不是 stdout。-D
選項後面接著各種字母,會開啟各種內部除錯旗標。請參閱所需後端的說明文件(對於上述範例,其名稱為 B::Backend
),以了解該後端。
本節僅適用於想要撰寫可透過此模組使用的編譯器後端模組的人員。
SYNOPSIS 節中提到的命令列對應於 Perl 程式碼
use O ("Backend", OPTIONS);
O::import
函式載入適當的 B::Backend
模組,並呼叫其 compile
函式,傳遞 OPTIONS 給它。預期該函式會傳回一個次參考,我們將其稱為 CALLBACK。接著,開啟「僅編譯」旗標(等同於命令列選項 -c
),並註冊一個 CHECK 區塊,該區塊會呼叫 CALLBACK。因此,命令列上提到的 Perl 主程式會被讀取、解析,並編譯成內部語法樹形式。由於 -c
旗標已設定,因此程式不會開始執行(當然,BEGIN 區塊除外),但會呼叫編譯器後端註冊的 CALLBACK 函式。
總之,編譯器後端模組應稱為「B::Foo」,其中 foo 為某個值,且存在於該名稱的適當目錄中。它應定義一個稱為 compile
的函式。當使用者輸入
perl -MO=Foo,OPTIONS foo.pl
會呼叫該函式,並傳遞那些 OPTIONS(以逗號分隔)。它應傳回一個次參考至主編譯函式。在使用者的程式載入並解析後,會呼叫該傳回的次參考,然後它可以繼續進行編譯,通常是透過使用 B
模組的功能。
如果 perl 未編譯 PerlIO 支援,-q
和 -qq
選項將無法正常運作:STDOUT 將會關閉,而不是重新導向至 $O::BEGIN_output
。
Malcolm Beattie,mbeattie@sable.ox.ac.uk