[ 永遠的UNIX::UNIX技術資料的寶庫 ]   GB | BIG5

首頁 > 編程技術 > Perl > 正文
Perl 語言全面編譯(二)
http://www.ccw.com.cn 天水-S.Tanshuai (2001-04-19 15:05:32)
第二節 Perl2EXE 編譯方法 
Perl2EXE 可以在大多數流行系統上編譯運行,但是我幾乎不用它,我認為它是“最低級”編譯。而且它也是最容易被反編譯的程序。所以我不推崇它,也不願意用它。不過適合很多初學者。 
它的原理很簡單,知識把原來的Perl代碼放入程序中和內置的解析其共同運行,而且速度不如PerlAPP。 
Perl2EXE 同樣可以在 http://ftp.tanshuai.net/pub 和 ftp://ftp.tanshuai.net/pub/ 下載。 
標準方法: 
perl2exe <程序名> 
Perl解析器選項值設定: 
perl2exe perloption=“<參數>“ <程序名> 
參數主要就是perl解析器的參數如:-w X e 等等。 
共享dll庫: 
perl2exe small <程序名> 
如果你是多個程序編譯,那使用這個命令,比較“劃算“,你只要把它們的共享dll庫,復制到共同的執行目錄下,即可。共享DLL庫:p2xdll.dll或者p2x560.dll。 
啟動圖形界面: 
perl2exe gui <程序名> 
和perlapp是同樣的作用。 
設置執行程序的圖標: 
perl2exe icon=<圖標文件名> <程序名> 
設置輸出文件名: 
perl2exe <程序名> -o=<文件名> 
設置運行系統平台: 
perl2exe platform=<系統名稱> <程序名> 
如:Sun操作系統 perl2exe platform=sun program.pl Linux操作系統 perl2exe platform=linux program.pl 





第三節 PerlCC 編譯方法 
PerlCC是Perl的最好最優秀最強的得編譯器,而且是免費的。但是它的調試與運作是比較方“煩”人的。特別是在微軟的Windows就更令人頭疼。 
PerlCC編譯器的原理是分析Perl原代碼,然根據標準轉換方式,轉換成C語言,當然這裡的C全部採用Perl的頭文件(Header),也就是全部採用Perl的函數,即使你只有一行的 “print “hello world”;”都需要無數行的定義才會出現這樣的效果。但是令人驚奇的是perl編譯的這個“hello world”比C/C++的編譯的可執行文件還要小。採用PerlCC轉換出來的C源代碼幾乎是不可讀(不可理解)的,幾乎比匯編語言還令人費解。所以這樣的程序即使被反編譯出來,它的源代碼也是會令人無法琢磨,但是這種程序根本幾乎無法反編譯,至少目前是,我相信只要Windows未被反編譯那它編譯出來的Perl可執行程序也同樣無法反編譯。 
如果使用PerlCC是大家最關心的事情,在Unix-Style系統是,凡是安裝perl5.0以上版本的都可以使用PerlCC,編譯程序,但是必須有C編譯器。這個我就不必太多說了。因為這個方法不大適合初學者,一般中級程序員對Unix-Style系統應該是較為了解的。 
在Windows中,一定要安裝VC6.0(也可以是GCC,但是安裝復雜)否則仍然無法編譯,安裝VC6.0是簡單的事情,只要找到微軟VC6的光盤,安裝。 
然,下載Perl源代碼(地址:http://ftp.tanshuai.net/pub/ ),下來解開壓縮(Windows可以用Winzip)。 
UNIX-Style 命令行模式下: 
#cd <文件解壓縮的目錄> 
#make 
#make test ∼可選 
#make install ∼完成安裝 
#export PATH=$PATH;/<安裝目的目錄路徑>; ∼設置變量 
Windows 命令行(Command.com CMD.COM)模式下: 
C:\>cd <文件解壓縮的目錄\win32> 
C: <文件解壓縮的目錄\win32\> nmake 
C: <文件解壓縮的目錄\win32\> nmake test ∼可選 
C: <文件解壓縮的目錄\win32\> nmake install 
Windows 95/98/Me 在 AutoExec.Bat文件中設置路徑。 
Windows Nt/2000 在“控制面板”-〉“系統”-〉“高級”-〉“環境變量”中設置 
 注意:千萬不要使用AtivePerl,而且最好在安裝標準編譯Perl,刪除AtivePerl,AtivePerl“不支持”PerlCC,雖然它也有帶perlcc 但是至少我是永遠都無法編譯成功的,我也不知道為什,我也不想知道為什,因為很多程序是在Unix-Style 上運作的,大多數都是標準Perl,所以建議大家為了兼容所有操作系統,請盡量用標準Perl編寫和解析程序。 
好啦,一切安裝、設置就緒,重新啟動計算機。我們進入我們想要編譯的文件目錄中,輸入“perlcc <程序名>”(注意:這裡的程序擴展名稱必須是.pl .bat .p .pm,.cgi也不行,你可以修改perlcc.bat文件來支持其它擴展名)。 
輸入以上命令,會出現一大堆你可能看不懂的命令(這些你並不需要關心) 
例如我要編譯一個內容為: 
print “ok”; 
的Perl程序,該文件名:abc.pl。 
輸入: 
perlcc abc.pl 
PerlCC輸出內容: 
------------------------------------------------------------------------------ 
Compiling abc.pl: 
------------------------------------------------------------------------------- 
   
Making C(abc.pl.c) for abc.pl! 
C:\perl\5.6.0\bin\MSWin32-x86\perl.exe -IC:/perl/5.6.0/lib/MSWin32-x86 -IC:/perl 
/5.6.0/lib -IC:/perl/site/5.6.0/lib/MSWin32-x86 -IC:/perl/site/5.6.0/lib -I. -MB 
::Stash -c abc.pl 
C:\perl\5.6.0\bin\MSWin32-x86\perl.exe -IC:/perl/5.6.0/lib/MSWin32-x86 -IC:/perl 
/5.6.0/lib -IC:/perl/site/5.6.0/lib/MSWin32-x86 -IC:/perl/site/5.6.0/lib -I. -MO 
=C,-l2000,-umain,-uattributes,-uDB,-uWin32 abc.pl 
Starting compile 
Walking tree 
Prescan 
Saving methods 
Bootstrap attributes abc.pl 
Writing output 
Loaded B 
Loaded IO 
Loaded Fcntl 
abc.pl syntax OK 
Compiling C(abc) for abc.pl! 
C:\perl\5.6.0\bin\MSWin32-x86\perl.exe -IC:/perl/5.6.0/lib/MSWin32-x86 -IC:/perl 
/5.6.0/lib -IC:/perl/site/5.6.0/lib/MSWin32-x86 -IC:/perl/site/5.6.0/lib -I. E:\ 
DOCUME~1\ADMINI~1\LOCALS~1\Temp/abc.pl.tst 
Couldn't open E:DOCUME~1ADMINI~1ocals~1temp/abc.pl.val 
cl -Od -MD -DNDEBUG -DWIN32 -D_CONSOLE -DNO_STRICT -DPERL_MSVCRT_READFIX -Od - 
MD -DNDEBUG -Ic:\perl\5.6.0\lib\MSWin32-x86/CORE -o abc abc.pl.c /link -nologo 
-nodefaultlib -release -libpath:"c:\perl\5.6.0\lib\MSWin32-x86\CORE" -machine: 
x86 -libpath:c:\perl\5.6.0\lib\MSWin32-x86/CORE c:\perl\5.6.0\lib\MSWin32-x86\CO 
RE\perl56.lib oldnames.lib kernel32.lib user32.lib gdi32.lib winspool.lib com 
dlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib netapi32.lib uuid.lib 
wsock32.lib mpr.lib winmm.lib version.lib odbc32.lib odbccp32.lib msvcrt.lib 
abc.pl.c 
然再輸入:abc.exe,如果輸出結果與abc.pl一樣,那編譯就成功了。這個程序是使用Visual C++的CL.EXE C/C++編譯程序編譯的。在Unix-Style下是使用CC或者GCC編譯的。 
模塊編譯注意事項: 
目前PerlCC標準編譯方式可以支持大多數程序的模塊使用,但是我推薦盡量使用內部命令來完成相應任務,諸如IO::Socket模塊可以使用socket 內部函數。因為 IO::Socket是無法在PerlCC下面編譯成功的,為什? 大家知道Perl很多的模塊是本身Perl的語言和內部函數編寫的。但是有一部分包括IO::Socket DBD DBI等這些常用的模塊,由Perl本身內置函數限制,採用了PerlXS接口通過C 程序達到目的的。這些是通過第三方程序達到目的模塊是無法成功的編譯。所以我建議盡量使用非含有第三方程序的模塊編程。有人可能會說了,我使用了DBI DBD來操作數據庫,難道讓我放棄嗎?不,我覺得任何事情都是有它的解決方法,Perl也一樣。Perl Bytecode將會解決這一問題(詳情情看第4節)。 
編程方式注意事項:我為什要在開頭說OOP 等相關技術以及在本文中提及了OOP的編寫?因為PerlCC編譯有一定的局限性,如果採用OOP就可以避免這個局限性,而且會更好的發揮,眾所周知,OOP是編程發式的有一革命,你遲早都會涉及的,所以早一點總比晚一點好。我們經常編寫程序的時候用“require”命令來引用其它Perl程序文件。然而這種方式不是PerlCC不支持,PerlCC當然支持,這個命令,但是問題在它無法被編譯入PerlCC的主程序內,也就是說主程序被編譯了,然而外部引用的這個沒有被編譯,這樣會造成很多問題,首先是暴露了原始代碼,其次它人可以隨意修改,肯能導致很多量(比如密碼)被套出,也可以修改程序運行的模式。但是這也是有點,最一節將會詳盡講述。 
(http://www.fanqiang.com)
    進入【UNIX論壇

相關文章
Perl 語言全面編譯(四) (2001-04-19 15:11:45)
Perl 語言全面編譯(三) (2001-04-19 15:09:06)
Perl 語言全面編譯(二) (2001-04-19 15:05:32)
Perl 語言全面編譯(一) (2001-04-19 15:03:46)
 

★  樊強制作 歡迎分享  ★