Perl语言全面编译(一)

3/5/2006来源:Perl教程人气:8939

简 述
 
本文将详细讲述Perl的编译方法,献给所有热爱、喜欢Perl的程序员们。 
Perl自从面世以来1.0版本到现今的5.6版本,一直都有编译程序,主要因为国内的中文资料很少,大多数人不愿意去看或者不懂得英文资料,所造成不知道器编译方法。即使是很多Perl界高手也同样有此类问题。Perl编译方法五花八门,各种编译方法都有其重要的意义和弱点。另一方面Perl编译方法不能流行的原因是,本身Perl就是一个免费的东西,人们不希望Perl成为编译的商品,但是在国内也是因此而拖累了Perl的发展步伐。但在此我不赞成也不推崇Perl程序的编译,Perl编译有小些局限性,但是仍然可以完成所有任务,想要达到良好的编译效果,需要高超的编程技术和相关经验,重要的是对OOP(面向对象的程序设计)的了解,将会使得你的Perl程序更加易于编译,运行速度更快,兼容性更广等特性。 
以前我写过Perl在可嵌入式技术方面技术文章。它的优势和其它嵌入语言无法比拟的兼容性,Perl不但拥有php的可嵌入HTML技术,也同样支持用PerlScript写asp的。但是如果你希望你的程序可以编译执行,那么可嵌入式方法显然是不可能的。我几乎不用ePerl、mod_perl等可嵌入式Perl HTML 页,但是我更不赞成很多人把HTML置入程序之中,这两种方法都有其好处以及坏处。我推崇模板方式的编写方法,大家可能也用过模板方式,可能认为它在页面量处理方面有很多问题?但是,那些都是陈旧古老的方式,也是说明你并未精通Perl语言,采用模板方式调入HTML页是相当好的方法,几乎可以达到所有可嵌入式技术的功效,也可以像HTML程序内置方式的灵活操纵性。我觉得程序员和HTML制作员是不同的,如果我们采用ePerl、PHP、ASP,那么你就不是一个真正的程序员,那只是HTML技术的服务器处理部分罢了,真正的程序是程序本身,而不附带任何其它特性。 
我认为好的教学文章,应该让读者充分了解内容,充分扩展层面。诸如编写一个Httpd程序,有很多传统的程序员根本不了解 http的通讯协议,即使讲了很多内容,但是仍然搞得半懂不懂。本文将会充分扩展层面,让读者了解更多的技术资料,而不必看完本文后又要去寻找关联技术资料。同样国内目前有很多技术性书籍,都是来自国外的译本,但是很多译者并非此技术专家,在翻译的时候很多东西无法充分理解,带来的时间上的障碍。我希望国内的编程专家能够写一些有用的技术文章和书籍,因为我看过很多国人自己写的文章都容易理解和操作。但是问题在于都偏向与基础教学,目前急切地需要有更深层次的技术资料。 
   
内容大纲: 
1) PerlApp和PerlSvc编译方法 New! Easy! 
2) Perl2Exe 编译方法 
3) PerlCC 编译方法 
4) PerlCC之Bytecode 编译解析法——Just Like java PRogram!  New! Cool! 
5) OOP面向对象的程序之为编译而设计  
6) HTML模板编程方式——真正的WEB程序(Program)  Good! 
7) 联合编译以及实例  Advanced! 
   
说明:如何选择阅读以上内容是很重要的,以上内容并非适合各个阶层的Perl程序员。PerlApp和PerlSvc适合在Windows2000环境下编程初学者和一般的Perl程序设计人员,Perl2Exe适合在非Windows和Windows95/98/Me 环境下编程初学者和一般的Perl程序设计人员。PerlCC适合与任何操作系统平台,但是操作复杂,适合于中级程序员和高级程序员开发大宗商业化软件(公众客户)使用。ByteCode是一种新型的编译方式,类似Java,它需要Perl解析器的支持,但是它是灵活性最高的编译方式,适合中级程序员和高级程序员开发大宗商业化软件(服务商)使用。如果你希望你可以编写出一个出色的Perl编译的程序,那么你必须阅读第4节,它将告诉你如何使用面向对象的程序设计技术来实现Perl编译程序的高效良好的开发环境和模式。 
   
第一节 PerlApp和PerlSvc编译方法
 
PerlApp和PerlSvc是ActiveState 公司开发的,它属于 Active Perl Dev Kit(PDK)产品。本编译方法只适合于Windows2000上运行,其它系统均无法正常使用,编译程序必须是标准Perl和ActivePerl。 
PDK下载地址:http://ftp.tanshuai.net/pub/  ftp://ftp.tanshuai.net/pub/  
PerlApp和PerlSvc,前者是标准的应用程序,后者是Windows2000的服务程序(类似与IIS,一开机就启动的服务程序,而且无法中断它的运行)。他们有两种运作模式:依靠(Dependent)和独立(Freestanding),“依靠”模式程序运行的系统上必须有Perl解析器和相关模块,这样的程序相对较小;“独立”模式,Perl解析器等相关模块都会完全嵌入在程序之中,这样的程序在任何Windows2000操作系统上都可以顺利运行,而不需要额外的支持,但是程序相对较大。 
使用方法: 
标准使用方法(“依靠”模式): 
perlapp <脚本名> 
这样程序就会创建一个以脚本名命名的可执行文件<脚本名.exe> 
“独立”模式: 
perlapp(或者perlsvc) –f <程序名> 
定义输出可执行文件名: 
perlapp(或者perlsvc) –e=tanshuai.exe test.pl 
它将会把test.pl文件输出的可执行文件名改为“tanshuai.exe”。 
设置程序属性: 
perlapp(或者perlsvc) -i=<类表> <程序名> 
类表名 目标项目 
Filenumber 文件号码 
Productnumber 产品号码 
Productname 产品名称 
Legaltrademarks 合法商标 
Filedescription 文件说明 
Originalfilename 原文件名 
Fileversion 文件版本 
Comments 注解 
Productversion 产品版本 
Companyname 公司名称 
Internalname 内部名称 
Legalcopyright 版权 
 
这个时候有些人可能不大明白,这个是干什么用的。如果你曾经编写过Win32程序,那就会知道,它是Windows程序的版本说明(如图1)。 



图1 Perl.exe文件的版本说明 
名称与数值用“;”分开。而且所有项目值都需小写。 
清理PerlCtrl 的DLL: 
perlapp(或者perlsvc) –c <程序名> 
添加模块: 
perl(或者perlsvc) –a=<列表> 
如:perlapp tanshuai.pl –a=IO:Socket;xml::Parser;Tanshuai::Http;MP3; 
这样模块IO:Socket,XML::Parser,Tanshuai::Http和MP3就被置入程序内。 
Perl图形界面: 
perlapp(或者perlsvc) –g <程序名> 
如果你的程序非命令行或者CGI,是T/K图形界面的话,就需要采取这个命令。 
排除 Perl56.dll: 
perlapp(或者perlsvc) –x <程序名> 
Perl56.dll是PerlApp执行的关键,但是如果你不希望他和你的程序在一起,你可以把它排除,另行安置,但是主意,一定要保证它的存在否则就无法正确运行 
添加额外文件: 
perlapp(或者perlsvc) –b=<文件列表> <程序名> 
如果你希望在程序内部打开文件,请使用这个命令。 
如:open(FILE,“./PerlAPP.TXT“);@FILE=;close(FILE); 
这样就必须打开“PerlAPP.TXT“文件,但是你如果把它置入程序,它将会在内存中打开。(无法写入) 
报告嵌入模块错误: 
perlapp(或者perlsvc) -r <程序名> 
一些模块无法嵌入,使用该命令可以得出相关信息。 
输出详细信息: 
perlapp(或者perlsvc) <程序名> -v 
如:perlapp tanshuai.pl –v 
输出: 
Using myScript.pl for script name 
Input script name: tanshuai.pl 
Output exe name: tanshuai.exe 
Exe Mode: Perl Dependent 
Creating dependent executable 
   
解释:PerlApp 和PerlSvc无法在Windows95/98/ME PerlApp使用的部分Win32 API函数未被支持。