程序員的語言“艷遇史”(六)——網絡工程師Perl

作者: fzwudc  來源: 博客園  發布時間: 2010-07-01 12:03  閱讀: 1621 次  推薦: 0   原文鏈接   [收藏]  

  程序員的語言“艷遇史”(一)——班長pascal

  程序員的語言“艷遇史”(二)——計算中心管理員小C

  程序員的語言“艷遇史”(三) ——法國外教prolog

  程序員的語言“艷遇史”(四) ——數學系師姐Forth

  程序員的語言“艷遇史”(五)——辦公室秘書Smalltalk

  (***以下小說情節純屬虛構,供朋友們在緊張編程后輕松一下,如有雷同純屬巧合,切勿對號入座***)

第六個女孩  網絡工程師Perl

  一、風雨割接夜

  一個風雨交加的夜晚,我騎著我的小電驢,奔馳在東大街上。已是深夜,街上鬼影都沒一個。突然一個塑料袋幽靈般的飛到我頭上,我正驚魂未定,手機又響了。我拿起電話,不耐煩的說:“五點半才割接,你催什么催,我已經在路上了!”。那邊傳來一個冰冷的女聲,“如果五點你沒到場,你就等著扣錢吧。”。

  二、女魔頭perl

  自從我們中標某市163網絡擴容工程后,我就沒過一天好日子。先是供應商到貨延遲,為不誤工期,我們只能加班加點安裝調測,累得半死。沒想到電信局方和我們配合的perl小姐,苛刻到極致。幾個接入點都由于一些小事被她要求返工,把我氣得吐血。然后她又規定割接時間必須在凌晨五點半,理由是網絡監控發現此時上網流量最低,此時斷網對用戶感知影響最小。

  在郵電這樣的壟斷行業,雖然標語上說用戶至上,心中一向把用戶當根蔥,居然能出這樣一個同志,我簡直無語了。這個嚇死人的合理化建議果然被采納,她是被領導表揚了,可我們這批建設隊伍就倒了大霉。幾個晚上下來,都沒怎么睡,眼圈黑得和熊貓似的。

  到了機房現場,我正想發飆,先到的同伙小丁給我使了個眼色。仔細一看,里面各路大小領導來了一堆,還有人照相。我們的豬頭老總正和perl小姐親切握手呢,那個色迷迷的樣子真讓人反胃。原來本次擴容完成后,市電信局要召開新聞發布會,慶祝全市實現chinanet網絡正式商用,還請了主管副市長講話。領導們極度重視這樣的露臉場合,于是都到現場監工。

  各位老資格的網民知道,上個世紀90年代末時還沒有寬帶,大家都是撥號上網。最早提供上網業務的不是中國電信,而是瀛海威這樣的民營公司。瀛海威當時的廣告語挺嚇人的,“信息高速公路離中國還有多遠?”。以現在寬帶的標準,那時用33.6k的modem撥號上網,簡直是“信息低速小巷”。當時的郵電部看有利可圖,就組織“國家隊”大規模進場了,推出了號稱中國公用計算機互聯網的chinanet。各地電信局網絡建設項目此起彼伏。我當時在一個電信系統的集成公司,借此良機中標了好幾個單子,一時間發了點小財。

  調通網絡后監控了一段,萬事大吉,我躺在機房的沙發椅上準備補上一覺。忽然眼前一黑,perl小姐又出現了,說新聞發布會現場人不夠多,叫我們過去當群眾演員湊湊人數。靠,不知道兄弟一向賣藝不賣身的嗎?我當然沒一副好臉。但是看清楚她手中揮舞著那張項目初驗清單后,我立馬蹦起來,老老實實接受指揮。好漢不吃眼前虧嘛,這個女魔頭要是怒了,再抓幾個問題,項目初驗不過,老板還不剝了我的皮。

  三、dns服務配置的賭局

  公路是建起來了,可是上面沒什么車跑啊!也是,當時網絡上的中文內容少得可憐,新浪、搜狐、騰訊都不出名,馬云的阿里巴巴還開在居民小區里呢。于是電信老大又出面了,什么政府上網工程、企業上網工程紛紛出臺。現在回想過去覺得十分好笑。“國家隊”搞壟斷性、資源性產業可以,讓他們做互聯網信息服務,基本沒什么競爭力。我們當時接單,做了不少應景的網站,上線后幾個月了都沒更新。根本沒人管,都是應付了事。一個親戚摩托車要年檢,我還熱心推薦他上車管所網站查看相關事宜。沒想到年檢地點早變了,網站上寫的還是舊址。結果害人家跑了冤枉路,還以為我捉弄他,把我罵得夠嗆。

  一天,又接到女魔頭perl小姐的電話,通知我到機房,說有重要升級事宜商量。我推門進去,發現perl正在一個終端前,忙不迭的用vi修改dns配置文件。原來是上級根dns服務器版本升級,我們本地dns服務器也得跟上,需要把所有的域名解析文件格式都做修改。那時正是上網工程高潮,一陣風過去,湊了幾百家本地單位發布網站。現在好了,幾百個域名配置要更改,這還不把我們perl小姐累死,于是抓我來墊背。

  對比了新舊域名配置格式,我發現這是一個普通的文本處理問題。“還不動手,今晚準備加班啊!”。perl小姐又催了。我笑了笑,說打個賭,如果能在10分鐘內解決問題,她就把幾張驗收單都給我簽了。perl摸了摸我的額頭,冷笑的說:“這位大哥腦袋發燒了吧,滿口瘋話。”

  “我沒瘋,敢不敢打賭?”

  “那就開始吧,現在是北京時間16點24分。”

  四、Perl魔法學院

  十分鐘后,perl小姐在幾行如同天書的程序文本面前,呆若木雞。“這是什么亂七八糟的?有點象c語言,可表達式怎么這么亂?你就是用它來做配置升級的?”

  看著她那窘樣,真是揚眉吐氣啊!看來通信工程系畢業的美女還是比較好騙的,也就學過C語言,Perl語言連聽都沒聽說過。

  在我娓娓動聽的聲音下,一番驚天地泣鬼神的八卦開講了,Perl魔法學院的大門向美女緩緩打開。魔法學院的院長呢,當然是Perl語言的發明者Larry Wall先生啦。沒想到院長大人當年和我們一樣,也是一個普通的unix系統管理員,用現在流行的話說,屬于“軟件藍領”、“it民工”,呵呵。

  Perl語言的發明十分偶然。一次,Larry從老板那里接到一個任務,要他為幾臺unix主機生成工作報表。可他發現幾個現有的工具很不好用,耗時又費勁。如果他不是這么的懶惰、不耐心和傲慢(他總結的黑客三大特質),完全可以作一天和尚撞一天鐘,忍受這一切。終于他受夠了,自己動手發明了一個小語言,這個語言被命名為Perl。1987年末,Perl1.0誕生了。Larry想,Perl語言可能對其他unix管理員有所幫助,就把源代碼以GPL版權發布到網上。

  Larry充滿深情的說,“Perl文化可以接受任何熟練程度的成員。我們不會在你背后放個語言警察。如果你的老板不炒你,而且你的 Perl腳本也能完成工作,那么它就是正確的。”(摘自《Perl語言編程》前言)。哪見過這么平民化的語言設計者啊?這還能不火嗎,一傳十,十傳百,越來越多的人參與使用和改進Perl語言。

  在魔法師Larry的手里,Perl語言就如同一顆水晶球,計算元素從各處不斷涌入,魔力與日俱增。開始,他只想做一個象Awk那樣的小語言,核心是一個正則表達式處理的程序包,配以簡單數據類型和字符串里的變量內插。接著,他又從當紅的C語言那里借來了一些語法要素,從古老的Lisp語言那里借來了dynamic scope(動態作用域),這就差不多構成了Perl1.0的內容。在源代碼發布上網后,全世界各地的unix管理員貢獻著他們的力量,使得Perl語言的魔力越來越強,先后引入了模塊、staic scope(靜態作用域)、閉包、面向對象等要素。到現在我們使用的Perl5版本,它已經是一個多用途的動態腳本語言。 Perl在web服務器端編程、系統自動化管理甚至生物信息學中得到了廣泛的應用(據說連人類基因組計劃中的許多數據處理,都大量使用了Perl語言)。Perl社區還建立了自己的代碼庫CPAN, 上面有N多的開源模塊,數都數不過來。

  Perl語言的成功,為全世界的unix黑客做了一個最好的示范。難道只有計算機科學家或者研究人員,才能發明程序設計語言嗎?黑客們已經很不爽了,讓那些限制人們心智的清規戒律都見鬼去吧,他們將自己打造自己的工具。在Perl之后,Python、Ruby、Php等一系列風格各異的程序設計語言誕生了。它們的共同點是,都出自黑客個人之手,都采用開放源代碼模式進行開發和推廣,都屬于動態腳本語言。借用硅谷經常說的一句話,黑客們改變了世界。

  五、駭客入侵事件

  自從我那次八卦門之后,我發現perl小姐對我態度好了很多。那是,男人要贏得女人的心,關鍵要有內涵。dns配置升級案例也被四處傳播,連上級公司都打電話來要腳本。外面風傳我是Perl語言專家,由于那段時間Perl語言CGI應用很火,經常有做網站的兄弟向我請教個什么東西,搞得我十分郁悶。沒辦法,回去急忙弄了幾本Perl書籍,一番惡補。原來我就把Perl當作一個系統管理工具,從沒正經學過。現在好了,打腫臉充胖子,這真是人怕出名豬怕壯。

  一天,我在公司里翹著二郎腿,正在開小差。突然旁邊小丁接了個電話,說“老大,公安局找你做筆錄。”。把我嚇得差點從座位上掉下來。摩托車闖紅燈了?上次收了供應商一盒月餅加茶葉?要不就是貪污公款,不過那也得有機會啊?最近兄弟安分守己,沒干什么對不起黨和人民的事啊。

  我戰戰兢兢的接起電話,仔細一聽,那邊一個人已經笑成一團。靠,那里是什么警察,是可惡的perl小姐。我大罵,有這么開玩笑的嗎,嚇出心臟病怎么辦?不過她真的是在公安局做筆錄,氣不過,找我開涮一把。

  怎么回事呢?原來市圖書館網站開通才幾天,就被黑了!網站首頁被人貼了些不雅照,還有一些攻擊性的話。這種駭客入侵事件以前都是從書里看到,現在居然真實的發生在我們身邊。這下熱鬧了,機房里外亂成一鍋粥。perl小姐作為網絡機房維護班長,當然被公安局抓去做筆錄。

  很快,專案組就成立了。哇塞,上面領導小組一堆人,各單位都有,下面干活的就三個,我、perl,還有公安局網安科的老張。我們從服務器記錄查起,看來這名駭客沒什么經驗,留下了痕跡。再看ip地址,居然是本市的。我們利用ip和上網時間信息,馬上又調看radius撥號服務記錄。這次perl小姐可老練了,也弄了個Perl腳本,把幾臺記帳主機數據記錄的搜索和定位工作自動化了。狐貍的尾巴終于露出來了,我們定位了撥號上網的固定電話號碼。案件告破,原來是市圖書館一個被辭退的員工干的。

  當時的心情真是激動萬分啊!不過,對perl小姐來說,這真的就是天邊的一朵小烏云,不算什么事。在她后來的職業生涯里,處理的大小網絡攻擊如家常便飯,對抗的工具也不斷升級。據她講,最恐怖的一次,為了應付一個DDOS攻擊,她把城域網核心路由器配置都做了更動。至于我,早已不干網絡運營這一行了,所以現在她可以當我老師。

  六、Perl語言的詭異之處

  雖然我們經常看電視,但是很少人會吃飽了撐著,把說明書讀個遍,然后把電視機大卸八塊,進行一番研究。但程序設計語言和電視機可不一樣,你學得越多,用得越多,就越想知道它的工作內幕。我被迫成了Perl語言正經八百的學習者后,大學時那種好奇心又回來了。

  上個世紀六七十年代,有兩個語言特性,被計算機科學界認為是有害的,應該從程序設計語言中清除出去。一個大家都知道,goto語句;還有一個可能見過的人不多,dynamic scope(動態作用域)。

  再看Perl語言,好嘛,兩個都有。在早期Perl中,動態作用域甚至是唯一的作用域規則。這Larry要是到計算機系讀博士,如果有程序設計語言理論這門課,估計會被授課教授拍死。回想起linux之父Linus Tovalds和操作系統大腕 Andy Tanenbaum教授之間那場關于微內核的爭論,你不得不說,黑客們都是腦后有反骨的,特別敢于爭鳴。

  看一個簡單的Perl代碼段:

    sub work {

  if ($debug > 0) {

    print"Debug: Danger!\en";

    }
  }

  注意那個$debug變量,它既非過程參數,也不是局部變量,可能在work過程之外的其他地方聲明,套用邏輯學術語算個“自由”變量吧。脫離了具體語境,你無法搞清$debug什么意思。靜態動用域和動態作用域在確定“自由”變量的含義方面,有很大的不同。現在補充一些程序片段:

  $debug=0;

   sub doit {

      local $debug=1;

      work();

   other();

  }

  調用doit過程,結果會怎樣?如果不熟悉Perl語言,按其他常見程序設計語言靜態作用域的規則,會把local猜測為doit過程里的局部變量聲明,因此對work過程是沒有影響的。work過程中的$debug標識符應該引用的是過程外部的全局變量聲明。所以不會有任何輸出顯示。

  但是Perl的動態作用域不是這樣工作的,local不是局部變量聲明,它并沒有創建新的局部變量,而是先保存了全局變量$debug的當前值0,再將其賦值為1。由此影響了后面調用的work過程和other過程的行為。在退出當前程序塊時,它會自動將$debug變量值恢復為0。可以把$debug想象為一個堆棧,在程序執行過程中,如果過程調用鏈上有多個過程對同一個變量使用local聲明,則堆棧也隨之增減。

  假如other過程是這樣定義的:

  sub other {

      local $debug=0;

       work();

  }

  那么運行到other過程內部時,想象中的$debug變量堆棧將有三層,從遠到近分別是0、1、0,受最近的變量值影響,這里調用的work過程將不會有顯示輸出。退出other過程后,$debug的值就自動又變為1。在只有靜態作用域的語言中模擬這個過程,就沒有這么優雅了。程序員必須手工管理這個堆棧。

  還有,Perl為什么要在debug標識符前加一個難看的$符號?這是Perl語言設計中另一個迷。在大多數語言中,一個標識符同一時刻只和一個變量進行綁定。但是Perl語言的標識符,可以同時與多種變量進行綁定。比如,$debug代表標量變量,@debug代表數組變量,%debug代表哈希表變量,此外還有好幾種。它們都使用debug標識符,只能依靠一個前導符號來區分了。在內部實現中,每個Perl模塊(包)中,都有一張符號表(Perl語言稱之為typeglob)。符號表中每個標識符,都對應著一組指針。每個位置的指針,如果不空,都指向一種類型的變量。

  經過分析,我做了一個大膽的揣測。Perl語言設計可能從古老的Lisp語言中學了不少東西,什么原子、符號表、動態作用域、垃圾收集等等,Larry也許是個Lisp愛好者呢。有人說Javascript=C+Lisp,我看Perl更象,骨子里是個小小的Lisp解釋器。

  這些特性是如此的詭異,不符合一般的軟件工程原則,以致大多數Perl程序員都不敢用。大家還是老老實實的用my聲明詞法變量吧,反正現在Perl也支持靜態作用域和閉包了。標識符雖然可以多綁定,不同類型的變量還是乖乖取不同名字吧,盡量避免混淆。誰讓我們不是黑客呢。

  七、尾聲

  網絡集成實在太累,過了一陣我就干回軟件老本行了,跳槽到外地一家做增值業務的公司。開始和perl小姐還經常鴻雁傳書,聯系一下。后來大家都有了新的生活,慢慢就淡了。若干年后在一次聚會上,又見到perl,她早已為人妻了。談起我們當時很喜歡的《編程之禪》里面的那首詩歌,大家唏噓不已。

  計算中心空空蕩蕩,

  靜靜的只有風扇在嗡鳴。

  我走過一排排的 CPU,

  磁通量刺痛了我的皮膚。

  我打開一扇門,又冷又硬,

  看見指示燈在控制板上跳動。

  一臺沒有靈魂的機器,人們說,

  但它的靈魂是同事們的汗水,

  在它里面有我們多年的生命,

  失望,友誼,悲傷,歡樂,

  算法成功時的狂喜,

  和無數個徒勞無獲的長夜。

  我聽見了嘆息和歡笑的回聲,

  在這間黑洞洞的辦公室里,

      終端機閃耀著光芒,就像星星一樣。

  (摘自《編程之禪》第五篇  水)

0
0
 
標簽:Perl
 
 

文章列表

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()