接下來的部分介紹怎樣使用各種各樣的編譯器後端。介紹的順序按照後端的成熟程度排列,所以最為穩定的,經過了驗證的後端會最先介紹,還在試驗中和沒有完成的後端就放到後面描述了。
O模組預設讓 -c 開關有效,這防止Perl在編譯完程式碼後執行程式。這也是為什麼所有的後端在產生任何輸出前都會列印一句:
myperlprogram syntax OK
The Cross Referencing Back End 交叉引用後端
交叉引用後端(B::Xref)生成一個關於你的程式的報表,把各個申明以及子程式,變數(包括格式)的使用情況存入檔案中去。舉例來說,這有一段摘自對pod2man程式分析後生成的報表(該程式是Perl自帶的一個例程):
Subroutine clear_noremap
Package (lexical)
$ready_to_print i1069, 1079
Package main
$& 1086
$. 1086
$0 1086
$1 1087
$2 1085, 1085
$3 1085, 1085
$ARGV 1086
%HTML_Escapes 1085, 1085 這裡展示了"clear_noremap" 子程式中變數的使用情況。就像變數 $ready_to_print 是 my() (詞法) 的一個變數,在第1069行被引入( 原文用的詞是introduced,也就是在 my() 中第一次被定義的意思 ),然後在第1079行該變數被使用了。從主包(main package)中來的變數 $& 又在第1086行被使用, 等等。
行號前面可能會有一個字母作為字首,它們的意思是:
- i
- 變數首次被引入 (在my()中申明) 。
- &
- 子程式或者方法的引用。
- s
- 定義的子程式。
- r
- 定義的格式。
交叉引用中最為有用的選項就是把報表存入不同的檔案,例如要把關於 myperlprogram 的報表存入檔案 report 中:
$ perl -MO=Xref,-oreport myperlprogram
The Decompiling Back End 反編譯後端
反編譯後端將把你的Perl語法樹重新變成原始碼。生成的原始碼會按照某種格式組織,所以這個後端可以用來消除程式碼中的混亂部分。此後端的基本使用方法如下:
$ perl -MO=Deparse myperlprogram
你也許馬上會發現Perl並不知道如何給你的程式碼分段。你要自己手動添入新行來把這大斷的程式碼分開。然而現在,讓我們看看程式碼只有一行時情況怎樣,這個後端會做些什麼:
$ perl -MO=Deparse -e '$op=shift⎪⎪die "usage: $0
code [...]";chomp(@ARGV=<>)unless@ARGV; for(@ARGV){$was=$_;eval$op;
die$@ if$@; rename$was,$_ unless$was eq $_}'
-e syntax OK
$op = shift @ARGV ⎪⎪ die("usage: $0 code [...]");
chomp(@ARGV = <ARGV>) unless @ARGV;
foreach $_ (@ARGV) {
$was = $_;
eval $op;
die $@ if $@;
rename $was, $_ unless $was eq $_;
} 這個後端也有幾條選項控制生成的程式碼,舉例說,你可以把縮排的尺寸設在4(最大)到2之間:
$ perl -MO=Deparse,-si2 myperlprogram
-p 開關控制在常常可以不加圓括號的地方加上它們:
$ perl -MO=Deparse -e 'print "Hello, world\n"'
-e syntax OK
print "Hello, world\n";
$ perl -MO=Deparse,-p -e 'print "Hello, world\n"'
-e syntax OK
print("Hello, world\n"); 要知道更多,請參考 B::Deparse
Lint 後端
lint 後端 (B::Lint) 檢察程式中不好的程式風格。一個程式認為的不好風格可能對另外一個程式設計師來說是用起來很有效的工具,所以有選項讓你設定哪些東東將會受到檢查。
要執行一個風格檢查器檢察你的程式碼:
$ perl -MO=Lint myperlprogram
要取消對上下文和沒有定義的子程式的檢查:
$ perl -MO=Lint,-context,-undefined-subs myperlprogram
要知道更多的選項資訊,請看 B::Lint
The Simple C Back End 簡化的C後端
這個模組用來把你的Perl程式的內部編譯狀態儲存到一個C程式碼檔案中去,而生成的C程式碼就可以被特定平臺上的C編譯器轉換成一個可執行檔案了。最後的程式還會和Perl直譯器的庫檔案靜態連結起來,所以它不會節省你的磁碟空間(除非你的Perl是用共享的庫檔案建立的)或是程式大小,然而,另一方面,程式啟動起來會快一些。
"perlcc" 工具預設是生成以下的可執行檔案。
perlcc myperlprogram.pl
The Bytecode Back End 位元組碼後端
這個模組只有在你能夠找到一種方法來裝入並執行它生成的位元組碼時才會顯得有用。ByteLoader模組提供了這項功能。
要把Perl轉換成可執行的位元組碼,你可以使用 "perlcc" 的 "-B" 開關:
perlcc -B myperlprogram.pl
位元組碼是和機器型別無關的,所以一旦你編譯了一個模組或是程式,它就可以像Perl原始碼一樣具有可移植性。(假設那個模組或者程式的使用者有一個足夠新的Perl直譯器來對位元組碼進行解碼)
有一些選項用來控制要生成的位元組碼的性質和關於最佳化方面的引數,要知道這些選項的詳細情況,請參考 B::Bytecode
The Optimized C Back End 最佳化的C後端
最佳化的C後端按照語法樹中執行期程式碼的路徑將你的Perl程式轉換成等效的(但是被優化了的)C程式碼檔案。這個C程式會直接對Perl的資料結構進行操作,而且也會連結Perl的直譯器的庫檔案,以支援 eval(), "s///e", "require" 等等。
"perlcc" 工具使用 -O 開關生成這種可執行檔案。要編譯一個Perl程式(以".pl" 或者".p" 結尾):
perlcc -O myperlprogram.pl
從Perl模組建立一個共享庫檔案(以 ".pm" 結尾):
perlcc -O Myperlmodule.pm
知道更多,請參考 perlcc 和 B::CC.