麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁(yè) > 編程 > Perl > 正文

Perl語(yǔ)言全面編譯(三)

2019-11-18 17:23:51
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
第四節(jié) PerlCC之Bytecode 編譯解析法 
Bytecode 是 PerlCC的另一編譯方法,必須在Perl5.6以后版本才有得支持。它的原理就好像java一樣,它會(huì)把Perl文件編譯成二進(jìn)制令人費(fèi)解的亂碼文件,它是采用類似md5這樣的反向加密編碼,幾乎不可能反編譯,和可執(zhí)行程序一樣復(fù)雜,但是它不可以直接執(zhí)行哦。想要執(zhí)行它,必須用Perl解析器,就好像 Java 編譯后必須有Java解析器,否則就無(wú)法執(zhí)行。我習(xí)慣成為編譯解析法,有的時(shí)候就說(shuō)Just Like Java PRogam! 
它的編譯方法也不難,但是竟然有很多人都不知道,我問(wèn)過(guò)很多Perl前輩,他們也不大了解這一方法。而且很多我也從來(lái)見過(guò)誰(shuí)寫過(guò)這樣的程序(難道我是國(guó)內(nèi)第一個(gè)知道的嗎?:) 
使用方法:perlcc –b <程序名>  
編譯后它會(huì)輸出一個(gè)<程序名.plc>文件,你打開它看,定會(huì)吃驚。而且這種文件最小是180KB,比perlcc C語(yǔ)言轉(zhuǎn)換編譯多了很多。 
它的好處在于,一處編譯到處使用。但是對(duì)于CGI就不大好處理。所以還是建議在各個(gè)平臺(tái)進(jìn)行編譯。 
例如我ByteCode編譯上節(jié)的abc.pl程序文件: 
輸入: 
perlcc –b abc.pl 
Perlcc –B 輸出 
---------------------------------------------------------------------------- 
Compiling abc.pl: 
---------------------------------------------------------------------------- 
Making Bytecode(abc.plc) 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 
=Bytecode,-umain,-uattributes,-uDB,-uWin32 abc.pl 
abc.pl syntax OK 
好了,然后perl abc.plc 就可以執(zhí)行了。 
執(zhí)行注意事項(xiàng): 
使用Bytecode 編譯后的文件,你一般需要更名回原來(lái)的文件名,否則容易在運(yùn)行程序后出現(xiàn)警告信息“Attempt to free unreferenced scalar.”雖然它對(duì)程序沒(méi)有本質(zhì)影響,但是不美觀嘛,另一種解決方法就是使用 perl –X ,關(guān)閉所有警告消息,警告不等同與錯(cuò)誤,所以一般情況下,某些警告是不必要的。 
同樣ByteCode 編譯程序可以被引用(require)但是不能調(diào)用(use),可以作為對(duì)象編程的對(duì)象。這是一個(gè)很靈活的東西,如果你希望你的模塊被大家使用,但是不想讓大家知道其中的操作,那么你就是用ByteCode,但是你的模塊將永遠(yuǎn)不會(huì)被納入CPAN。這種方法就好像OCX控件。 
但是注意,但是使用某個(gè)模塊的時(shí)候,你必須保證使用該程序的機(jī)器上有這個(gè)模塊,最簡(jiǎn)單的方法你可以把模塊一起復(fù)制使用,但是有些第三方程序模塊需要重新編譯,你如果不希望其它人操作模塊或者是看到引用的模塊,也可以使用Bytecode。但是注意,一定要用require方法調(diào)用加密模塊啊。這個(gè)世界總是這樣,總會(huì)有些遺憾的,這樣的話就不能用一些模塊和OOP。 
不知道你了解Python這個(gè)語(yǔ)言否?它Perl很相像,比Perl還有簡(jiǎn)單呢。但是我認(rèn)為很多東西都是抄Perl的,包括它得二進(jìn)制編譯方法,就和Perl Bytecode沒(méi)有任何區(qū)別。反正大家也都知道php也是抄了Perl不少東西。 


--------------------------------------------------------------------------------
 

第五節(jié) OOP面向?qū)ο蟮某绦蛑疄榫幾g而設(shè)計(jì) 
面向?qū)ο蟮某绦蛟O(shè)計(jì)已經(jīng)不是什么新穎的話題和技術(shù)了。它在C 和Java中,尤為重要,哎,我覺(jué)得在寫大宗程序的時(shí)候會(huì)很有幫助,但是在小程序里面反而麻煩,還不如普通的函數(shù)使用。OOP大多數(shù)基本的Perl教程都有說(shuō)明,所以這里也不多講“廢話”,主要講述OOP在編譯Perl程序中的應(yīng)用以及Perl OOP編寫的技巧,所以值得一看。 
前面說(shuō)過(guò)在PerlCC編譯可執(zhí)行程序的時(shí)候,不要使用require函數(shù),這是沒(méi)有錯(cuò)的。但是有很多人寫require習(xí)慣了,而且不經(jīng)常接觸OOP模式,所以不習(xí)慣。 
其實(shí)使用use比require 好很多,還有很多人用require引入變量,這是大大錯(cuò)誤,這是一種程序上編寫的失誤,所以建議以后大家不要用這種方式。編譯的時(shí)候也不要用這種放式?那么用什么方式?如果你是一個(gè)有經(jīng)驗(yàn)的Perl程序員,你應(yīng)該知道。使用OPEN函數(shù),傳送變量值。這是編譯Perl程序的關(guān)鍵,一些定量(不變的量),最好放在程序內(nèi)部,變量以及客戶所需要設(shè)置的量使用我先前說(shuō)的那種方式。具體實(shí)踐方法: 
Tanshuai OpenConf 函數(shù)代碼: 

 sub Open_Conf { 

         open(FILE, "$_[0]");#打開~調(diào)用函數(shù)的文件名 

         my @Conf_Info = ;#賦予~文件內(nèi)容到@Conf_Info數(shù)組中 

         close(FILE);#關(guān)閉~文件 

     my $Conf_Infos ;定義~局部變量 

         foreach $Conf_Infos (@Conf_Info) {#循環(huán) 

                ($name, $value) = split(/=/, $Conf_Infos);#區(qū)分~名稱和數(shù)值 

                ($value, $dot) = split(/;/, $value);#區(qū)分~結(jié)束符 

               $value=~s"'""gi;#刪除~不必要的符號(hào) 

              $CFG{$name} = $value;#復(fù)制~參數(shù)到散列變量 

         } 

         

} 
配置文件原形: 
Port='81'; 

 
這樣就解決了配置變量的問(wèn)題,我想這個(gè)函數(shù)對(duì)某些人一定會(huì)有很重要的意義。 
在這里OOP就是use 方式的調(diào)用。 
現(xiàn)在我們要著重討論OOP問(wèn)題了,如果你不想把一大堆的程序代碼寫在一個(gè)文件中,那么使用OOP就最好了,原來(lái)是可以使用require,但這里不可一。OOP在Perl的好處顯而易見,首先可以編譯,即使不編譯,它也同require有明顯差異。 
OOP是在程序需要時(shí)調(diào)入,不需要時(shí)自動(dòng)消失(通常說(shuō)破壞對(duì)象)。require則不然,一旦調(diào)入一直存在,除非你使用exit 函數(shù),所以在某些方面影響了程序的效率。 
例如我們要寫一個(gè)Shell程序,一共需要一下部分:輸入/輸出(I/O)、命令判斷(CMD)、System(系統(tǒng)操作)。 
我們平時(shí)也可以使用require,在編譯的時(shí)候就好了,同樣我們雖然可以按照子程序放在一個(gè)程序里面,但是在這里只是例子,但是在大宗商業(yè)項(xiàng)目中,這樣做是顯然費(fèi)時(shí)費(fèi)力的,會(huì)增加維護(hù)成本,無(wú)法聯(lián)合開發(fā)等多種弊端。 
我們把他們分為4個(gè)文件3個(gè)模塊一個(gè)主程序(編譯):IO.pm、CMD.pm、System.pm、Shell.pl。 
首先要構(gòu)造對(duì)象: 
Tanshuai 對(duì)象構(gòu)造方法: 

package <包名或者對(duì)象名>; 

my IN;#定義~包(對(duì)象)內(nèi)部的散列 

sub new {#構(gòu)造函數(shù)名 

         my $class = shift; 

         IN= @_;#將調(diào)用對(duì)象的數(shù)值傳入散列IN中 

         my $self={}; 

         bless $self,$class; 

         return $self; 

} 
 
 
 
雖然上面的構(gòu)造有些不好的地方,但是它是通用對(duì)象的構(gòu)造方法,利于調(diào)試,如果你認(rèn)為沒(méi)程序上的問(wèn)題,就可以“封包”,適當(dāng)修改變量傳引方式。 
這里的所有對(duì)象只有是一個(gè)單一函數(shù),只包括:構(gòu)造對(duì)象和操作對(duì)象的兩個(gè)部分,這是一個(gè)簡(jiǎn)單的對(duì)象引用,但是這種應(yīng)用在實(shí)際的開發(fā)總是相當(dāng)無(wú)畏的,在這里是為了方便教大家,所以不要什么程序都要對(duì)象。 
IO.pm: 
package IO; 

my IN; 

sub new { 

         my $class = shift; 

         IN = @_; 

         my $self={}; 

         bless $self,$class; 

         return $self; 

} 

  

sub do {#操作對(duì)象函數(shù) 

         my $self=shift; 

         defined ($_ = <>);#啟動(dòng)Shell得取輸入信息 

       chomp;#去掉無(wú)用的字符 

                 s/^/s //;#過(guò)濾危險(xiǎn)字符 

             my $cmd = $_;#復(fù)制量 

           return $cmd;#返回量 

} 

  

1; 
 
 
CMD.pm: 

 package CMD; 

my IN; 

sub new { 

         my $class = shift; 

         IN = @_; 

         my $self={}; 

         bless $self,$class; 

         return $self; 

} 

  

sub do {#操作對(duì)象函數(shù) 

my $self=shift; 

  my $cmd = @_ ;#傳入調(diào)用程序的命令 

while (){#執(zhí)行循環(huán),直到退出 

         if ($cmd eq 'ver') { 

                   print "Tanshuai Command Shell v.1.0.0.001225b/n"; 

                   print "(C)Copyright Tanshuai.Com 1997-2001/n"; 

                   print 'EMAIL:[email protected]'; 

                   print "/n"; 

                   &do; 

         } 

         elsif ($cmd eq ""){ 

                   &do; 

                   exit; 

         } 

         elsif ($cmd eq 'exit'){ 

                   print "Exit System"; 

                   exit; 

         } 

         elsif ($cmd eq ‘dir'){ 

                   use System;#使用包System 

my $sys = System ::new ;#建立基于System包的對(duì)象$sys 

$sys->do($cmd) ;#操作對(duì)象sys傳送命令 

                   &do; 

                   } 

         else { 

          print " Command Not Found "; 

                   &do; 

                   } 

         } 

} 

} 

 1;
 
System.pm: 
Package System; 

my IN; 

sub new { 

         my $class = shift; 

         IN = @_; 

         my $self={}; 

         bless $self,$class; 

         return $self; 

} 

  

sub do {#操作對(duì)象函數(shù) 

         my $self=shift; 

my $cmd = @_ ; 

system($cmd) ;#使用System函數(shù)
操作系統(tǒng),啟動(dòng)dir命令 

  

  

1; 
 
以上各個(gè)模塊(對(duì)象)已經(jīng)建立完畢,我們現(xiàn)在只需要設(shè)計(jì)一個(gè)簡(jiǎn)單的操作對(duì)象程序。這個(gè)時(shí)候你發(fā)現(xiàn)搞對(duì)象原始是如此簡(jiǎn)單:) 
Shell.pl 主程序: 
use IO;#調(diào)用~模塊(對(duì)象) IO.pm 

use CMD;#調(diào)用~模塊(對(duì)象) CMD.pm 

  

  

my $IO = IO::new;#創(chuàng)建對(duì)象~$IO 

my $CMD = CMD::new;#創(chuàng)建對(duì)象~$CMD 

  

  

my $GetInput = $IO->do;#從對(duì)象IO得到輸入信息; 

$CMD->do("$GetInput");#將得到的輸入信息發(fā)送給對(duì)象$CMD,進(jìn)行分析操作。 

exit ; 
 
 
 
這樣就完成了,你可能問(wèn)為什么沒(méi)有使用對(duì)象System ?那是因?yàn)樵趯?duì)象CMD中繼承對(duì)象System,所以我們不需要在程序中使用System,要不然就累了。 
當(dāng)你看到shell.pl程序時(shí)候,你有何感想?是不是覺(jué)得搞對(duì)象簡(jiǎn)單了很多呢?給我的想法就是,以后程序員會(huì)越來(lái)越多,因?yàn)閷?duì)象編程太簡(jiǎn)單了,而我們呢?哎,我們就去做對(duì)象。以后編程和做對(duì)象的人可能要區(qū)分開來(lái)了。 
現(xiàn)在編譯shell.pl后,把這些對(duì)象刪除,看看能否使用?當(dāng)然能,假如你使用require就出現(xiàn)無(wú)法執(zhí)行的致命錯(cuò)誤。 
哎呀,好累了。我就要吐血了 #$@,還沒(méi)有吃晚飯呢。明日繼續(xù)吧。  
這里告訴大家編譯Perl在較大或者較復(fù)雜的程序項(xiàng)目中,使用對(duì)象,會(huì)有很好的作用。你可能會(huì)問(wèn),用對(duì)象編譯出來(lái)的程序如此之大,是否會(huì)影響效率?肯定會(huì),但是它并非明顯,就好像一個(gè)小小的15KB的程序,在運(yùn)行的時(shí)候可能占用超過(guò)100MB的內(nèi)存。由于它會(huì)整個(gè)被內(nèi)存啟動(dòng),但是并不會(huì)有較大幅度的效率下降。如果還想使用類似require的方法,就要看最后一章了。 

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 欧美黄在线| 在线中文日韩 | 视频一区二区精品 | 久久精品亚洲精品国产欧美kt∨ | 久久久久久亚洲国产精品 | 精品人伦一区二区三区蜜桃网站 | 久久我不卡 | 免费观看黄视频 | 免费国产自久久久久三四区久久 | 日韩黄色片免费看 | 999精品国产 | 久久99精品久久久久久青青日本 | 欧美a在线看 | 欧美视频一区二区三区 | 草草在线视频 | 欧美一级做性受免费大片免费 | 超级av在线 | 久久久tv | 欧美精品亚洲人成在线观看 | 国产一级桃视频播放 | a黄色网 | 国产一区二区精品在线观看 | 欧美一区成人 | h视频免费观看 | 欧美性生活久久 | 在线免费亚洲 | 日本中文字幕高清 | 国产亚洲精品久久久久久久 | 日本黄色a视频 | 午夜视 | 黄色网址免费入口 | 性视频久久 | 中文区永久区 | 毛片免费视频观看 | 亚州视频在线 | 国产成人精品二区 | 免费黄色小视频网站 | 亚洲午夜国产 | 亚洲视色 | 国产自在线 | 国产精品毛片无码 |