文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>Perl 语言全面编译(五)

Perl 语言全面编译(五)

时间:2005-04-19  来源:一郎

第七节 联合编译以及实例
本章至关重要,你已经知道Perl的两种最好的编译方法。但是他们都有利弊,只要稍动脑筋,就可以实现“强强联合”,这样可以尽量避免那些缺憾。
联合编译的道理很简单,但操作起来也不那样一帆风顺,其中有很多地方值得注意。联合编译主要有一个主程序和多个子程序(FILE)组成。它们之间是使用require函数连接。主程序只做连接等分析工作,子程序做细节工作,包括对象操作,模块引用。我们采用PerlCC 翻译C的方式来编译主程序成为一个可以执行的文件,在把子程序用Bytecode方式编译,这样即可免去无法使用部分模块的问题,也可以直接使用Perl程序,只要在主程序的前面定义一下模块引用路径,方法:
use lib ‘<路径>’;
这样就可以了,把那些需要调入的模块,放在制定路径中就好了。而且在CGI或者Socket的网络编程和页面编程中,使用该模是有助于提高效率,降低资源占用率。如果使用整体编译方法,那么每次启动必然会耗费相当大的内存,同样这个程序要重复关闭启动,做Fast CGI也是相当不方便的,这也是Fast CGI在Perl中的最好的方法。根据不同的请求套入不同的子程序。
首先我们使用 cgi-lib.pl得去POST和GET数据(这个时候有些人会问,为什么不使用cgi.pm,我不是不想用它,而是cgi.pm在perlcc的任何编译模式都会有问题)
然后根据不同的请求,我在这里设置为action。
例如:
require “cgi-lib”;
if ($in{‘action’} eq “”) {
require “display.pl”;
&display;
exit;#可选
}elsif ($in{‘action’ }eq “love”) {
require “love.pl”;
&love;
exit;#可选
}
这样是很好的。我们使用perlcc 标准编译方法编译它,然后用-b模式编译display.pl和love.pl。然后把它们的名字改回.pl。
注意在使用perlcc编译程序的时候,编译出来的程序必须带有应用程序扩展文件,如dll和so。因为你的程序还需它们支持,这个文件在Perl的解析软件目录下,例如perl5.6就是perl56.dll,必须把它拷贝到执行文件目录地下。在Linux下是.so。你最好在一个没有Perl 平台解析器的环境下进行测试,把那些需要使用的包也包括在里面。即使是VC等软件编译出来的程序,都需要在纯环境下测试,这是必要的。这样就可以测试出程序的一些不必要的问题。
另外perlcc 的任何模式对语法都是很挑剔的,所以你最好使用比较正规的编写方法,而且单个perl程序如果程序量太大,必须截取到另一个文件中,否则编译后容易出现内存溢出现象。
大家要知道如果你的子程序使用了ByteCode编译,但是他人仍然可以把你的子程序改成源代码形式,这样就好像我说的会被套出很多量。最好的的方法,是采用ByteCode 编译的程序写入一个Auth认证函数。当然最保险的方法是使用文件内容验证,但是效率影响,我认为不大必要。
主程序:
# !perl
require “cgi-lib”;
if ($in{‘action’} eq “”) {
auth (“display.pl”);
&display;
exit;#可选
}elsif ($in{‘action’ }eq “love”) {
auth (“love.pl”);
&love;
exit;#可选
}
sub auth {
require "$_[0] " ;
$auth = &check ;
if ($auth ne "checkabcdefg "){
exit ; }
}
Display.pl
# !perl
sub check {
$check= "checkabcdefg " ;
return $check ;
}

sub display {
print "content-type :text/html " ;
print "hello baby " ;
}

上面是一种简单的,不过也会造成一些问题,所以下面是一个麻烦(并非复杂)方法,但是很安全。
检查编译程序是否真实:
# !perl
open (FILE,"./print.pl");
@FILE=;
close (FILE);
foreach (@FILE) {
if ($_ =~/程序编译后的部分代码/){
}else {exit ;}
}

首先把程序进行bytecode编译,然后截取部分独特的其它程序没有的代码,放入其中,来检查引入程序是否正确合法。
你可以把bytecode的程序改名成.dll等,这样其它人就不知道是怎么回事啦。
结束语
Perl是一个强大的而且是最早的解析性程序语言,它的编译程序是B模块,大家可以详细常见,它有多种编译方式,都是采用反向编译(BackEnd)不同于反编译。所以经本上是不可能被反编译。我认为本文对所有的Perl程序员都有很大的帮助。
Perl还有很多其它方式的编译、加密方法,但是我觉得本文介绍的几种方式都是最好的(兼容性和运行效率),有一些人,把写的程序进行部分字符乱码或者是取消缩近的书写格式(把所有程序写在一行上),我认为这些方法是“愚蠢的”,所以建议大家不要花那么多时间去研究这些“无谓”的东西。
部分字符编码例子——原本:
# !perl
sub Hello {
$hello=abc ;
print $hello ;
}
&hello ;
部分字符编码例子——编码后
#!perl
sub adfjierei123489dkajd_dfefnkdj {
$iernvmdnvcjnaldffgh=abc;
print $iernvmdnvcjnaldffgh;
}
&adfjierei123489dkajd_dfefnkdj;

我希望通过本文促使Perl在国内的商业发展,也同样加快了Perl技术在国内的发展速度。但是我仍然希望大家可以写更多的公开源代码的程序出来,这样可以让初学者有较快的提高速度。
相关阅读 更多 +
排行榜 更多 +
ooxe官方版下载

ooxe官方版下载

金融理财 下载
ooxe

ooxe

金融理财 下载
OXE交易app安卓版下载

OXE交易app安卓版下载

金融理财 下载