內容

名稱

O - Perl 編譯器後端通用介面

語法

perl -MO=[-q,]Backend[,OPTIONS] foo.pl

說明

這是用於 Perl 編譯器前端的模組。

如果將 -q 選項傳遞給模組,則在編譯期間,STDOUT 檔案句柄將重新導向到變數 $O::BEGIN_output 中。這會讓 BEGIN 區塊或已使用的模組列印到 STDOUT 的任何輸出儲存在此變數中,而不是列印出來。對於會自行產生輸出的後端(例如 DeparseConcise 等)很有用,這樣它們的輸出就不會與正在編譯的程式碼產生的輸出混淆。

-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