Perl语言全面编译(二)
2006-03-05 11:28:35 来源:WEB开发网核心提示:第二节Perl2EXE编译方法Perl2EXE可以在大多数流行系统上编译运行,但是我几乎不用它,Perl语言全面编译(二),我认为它是“最低级”编译,而且它也是最容易被反编译的程序,也可以修改程序运行的模式,但是这也是有点,所以我不推崇它,也不愿意用它
第二节 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的主程序内,也就是说主程序被编译了,然而外部引用的这个没有被编译,这样会造成很多问题,首先是暴露了原始代码,其次它人可以随意修改,肯能导致很多量(比如密码)被套出,也可以修改程序运行的模式。但是这也是有点,最后一节将会详尽讲述。
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的主程序内,也就是说主程序被编译了,然而外部引用的这个没有被编译,这样会造成很多问题,首先是暴露了原始代码,其次它人可以随意修改,肯能导致很多量(比如密码)被套出,也可以修改程序运行的模式。但是这也是有点,最后一节将会详尽讲述。
赞助商链接