千年蟲警報響起(1 / 3)

千年蟲警報響起

人類文明遭遇冰山

公元1999年12月31日星期五,深夜23:50

根據西方的傳統,公元2000年是千福年,是一個大家共同慶祝的日子,在公元1999年12月31日晚上,全球各地燈火通明,喜氣洋洋:全世界的人仰首注視時鍾由11點59分邁入公元2000年0點0分的那一刻,全世界都準備舉杯歡騰共同慶祝這一千年難遇的一刹那——全人類都將同時邁入一個新的裏程。多麼令人激動,多令人興奮!

在巨大的倒計時鍾下麵,成百上千的人都在同聲高數:“5、4、3、2、1……”,就在此時,意想不到的事發生了:電子時鍾上的數字閃了一閃,突然消失了;緊接著,廣場上的彩燈、路燈也熄滅了,四周一片漆黑,喧囂的音樂沉默了,歡騰的噴泉也偃旗息鼓了。

“喂,怎麼回事?!”人群一片嘩然。

……

最後,狂歡聚會開成了燭光晚會,氣氛倒也不錯,可是在隆冬的深夜這畢竟太冷清了點。

你決定駕車回家,可是汽車裏的計算機係統卻突然失靈,汽車怎麼也發動不起來。

好不容易回到家裏,也是漆黑一片。暖氣停了,你凍得受不了,隻好從衣櫥裏翻出好幾床毛毯棉被,裹在身上,在床頭瑟縮了一夜。

二十一世紀的第一個黎明,就這樣在黑暗、寒冷與沮喪中來臨了。

公元2000年1月1日星期六,上午11:00

當你起身離開床,站在地板上,覺得頭很痛。想起這是因為昨天晚上那個盛大的晚會,自己喝得太多,以至醉了一宿,今天早上也睡過了頭,沒有聽到鬧鍾響。又到了星期六的上午,你該給遠在南方的媽媽打電話,多年來你一直都保持著在星期六的上午給媽媽打電話的習慣。於是晃晃悠悠走到廚房,卻發現咖啡機不能象往常一樣為你煮上熱騰騰的咖啡,禁不住吼叫起來。可是沒辦法,隻好又慢慢騰騰地回到客廳,把自己扔在沙發上,然後拿起電話,過了一會兒,又一次響起了你的吼叫聲:沒有撥號音。

慢吞吞回到臥室,你明白了自己為什麼沒能聽到鬧鍾響,由於沒有電,鬧鍾根本沒有響。

於是你想應該去洗個熱水澡,緩解緩解頭痛,卻發現水隻是微溫的。走出衛生間的時候,你的情緒簡直糟透了,沒有電,咖啡機徹底沒有指望了。大聲的吼叫漸漸變成了低聲的詛咒。

但想到給媽媽打電話時,自己的聲音聽起來應該愉快而親切,於是又強迫自己要麵帶微笑,再次走到客廳,再次拿起聽筒,在一時沉寂之後,所有的克製都拋開了:仍然沒有撥號音。

你氣憤地把話筒移到麵前,大聲地詛咒,用最憤怒的語言表達對公用事業公司極大的不滿。到下午1點,仍然沒有撥號音,咖啡機也不能工作。更糟的是,冰箱也停止了運行,冰箱裏的水已經流到地板上了。你不得不穿好衣服,想起街角那個咖啡屋,雖然這個街角的咖啡屋經常遭到你的批判,但有咖啡總比什麼都沒有強。當走到大樓門口的時候,你想起昨晚把錢差不多花完了,該到街邊的銀行的ATM機上提些錢,然而機器吞了你的銀行卡,卻不給你發鈔。等到了街角的咖啡屋時,就覺得更奇怪了,他們的電話也壞了,咖啡屋在沒電的條件下營業。回到住處,拿起電話,一片寂靜,還是沒有撥號音。

星期天更加安靜,到星期一還是如此。從星期六到現在已經連續三天了,一點兒樂趣都沒有。你不僅不能和南方的媽媽聊天,也不能和你的朋友與同事聯絡。實際上,星期一(2000年1月3日)呆在家裏,唯一目的就是等一個重要電話,有個老板提出增加50%薪水的優厚條件,想把你從現在的職位中挖走,但現在看來隻能在1月3日最後做決定了。

你知道嗎,你所經曆的這種種不快,都是被稱為“千年蟲(MillenniumBug)”的計算機2000年問題在背後搗的鬼,而它將給你帶來的麻煩還不止於此。

在美國虛擬動力公司提出的概念框架《計算機大災難的七根支柱》中所描繪的世紀末情景是這樣的:

□稅務局電的腦認為你拖欠了一百年的稅款,寄來天文數字的補稅通知;

□監獄提早釋放坐監罪犯;

□信用卡公司認為你剛辦的信用卡已逾期數十年;

□電力公司的工作係統自動停止作業;

□電話係統無法運作;

□各國庫藏核武安全堪慮;

□航管係統失靈,空中交通大亂,機隊嚴重脫班;

□製造業:裝配線停止運轉。安全係統停機,工人無法進門上班;

□金融業:股市一片混亂、存戶帳戶餘額與交易記錄全毀、電子交易或轉帳停擺;

□醫藥業:醫療儀器如維生係統或監視係統當機導致病患生命危機、血庫管理、醫囑係統與行政作業、病曆、器材管理全部無法正常運作;

□核電廠:控製晶片發生錯亂,開錯活塞汽門,導致輻射外泄;

□國防:防衛係統安全堪慮,全球衛星定位係統失去聯絡;

□政府:社會福利無法發放,許多政務處理陷入停頓。

當人類文明懷著最美好的憧憬和希望,興衝衝地奔向二十一世紀之際,卻不曾想如“泰坦尼克”般遭遇了“冰山”,而這“冰山”竟然不過是兩位數字!

誰種下禍根

早在1956年,哈佛大學一位電腦先驅就預言說:一部專為微分方程解決數值運算而設計的基本邏輯,將與為一家百貨公司的商業所設計的邏輯一致,亦即:學術用途與商業用途的電腦在其有生之年將趨一致。果然翌年,第一代電腦程序人員正設法在卡片打孔機上以二位數代表年份來節省昂貴的存儲器空間。不幸的是,當時這個正確的決定帶來的是曆史上最昂貴的災難。

早期計算機的中央CPU速度低、存儲器價格昂貴,為了節省內存和外存,提高數據處理速度,人們認為支持紀元信息是一種極大的浪費。有資料顯示,在60年代,1G的存儲設備的價格平均為600-1000萬美元左右(再看看現在,1G的硬盤多少錢?),一個10M到20M之間的硬碟就可以稱之為大型磁碟機。據估計,儲存器中有3%到6%為日期資料,如果采用4位數日期就將增加1%的磁盤空間。從當時來看,每一個Gigabyte就能節省120萬到200萬美元。因此當時的程序設計員無不費盡心思考慮如何經濟有效的儲存所需要的資料。如果有一位程序設計員將公元1961年不用兩位數61,而用四位數字1961儲存至硬盤中,我們可以很肯定地說他一定會因為浪費硬盤資源而被他的老板開除。

在這樣資源昂貴又有限的資源環境約束下,硬件廠商包括所有的程序設計員都養成了很節儉的習慣。在60年代的計算機係統中,甚至有用一位十進製數來表示年份的例子,到了70年代以後也才開始使用兩位十進製數字來表示年份。節省字節就意味著節省金錢,這在當時是完全正確的。影響所及,日期用6位數表示(DD/MM/YY)變成了當時的通行標準,多數電腦硬件所提供的係統日期也用6位數表示年月日,甚至許多的電腦語言如COBOL所提供的日期函數也用6位數DD/MM/YY或MM/DD/YY表示。也就是因為這樣,多數的程序設計員撰寫程序時都不約而同的用6位數來表示日期,沒有人會想到他所寫的係統會持續使用到公元2000年,沒有人會想到公元2000年1月1日的日期竟是01/01/00,而就是這一點將造成1999年1月1日比2000年1月1日大的現象。例如1965年3月1日即為03/01/65、循此類推,到2000年1月1日的日期記載竟是01/01/00,造成1999年1月1日(990101)遠比2000年1月1日(000101)大的現象,使得電腦程序將因誤辨2000年為1900年而導致所有與日期相關的程序全部都出現問題,產生時光倒錯,係統混亂。盡管也許有人已經意識到了這種表示法的缺陷,但他們認為這些使用兩位數字來表示年份的計算機係統在2000年以前就應該早已被淘汰了,因此沒必要對潛在的漏洞給予特別的關注。然而糟糕的情況是,隨著計算機技術的迅猛發展,雖然後來存儲器的價格降低了,但在計算機係統中使用兩位數字來表示年份的做法卻由於思維上的慣性勢力而被沿襲下來,後續發展的係統則為維持相容性而沿用了該項設計原則。

許多技術種類中,獨斷的決定的偶然事件持久性往往較長,尤其在一個工業標準建立後。英國鐵路工人在十九世紀上半葉選用史第芬生的標準鐵道軌幅,於是美國和大部份的歐洲國家也相繼沿用。這個標準原來取自英國礦場馬匹拖拉的馬車,縱使鐵路機車引擎已經經曆150年的改變,這項標準至今仍被繼續沿用。也就是說,為了利用現今高速火車頭的電力,工程師還得依賴馬拖式火車的特別軌道與彎曲幅度的老技術呢。

這種決定持續著,因為基本技術發展很慢。太空任務是電訊技術和精密工程的奇跡,無論如何,蘇聯登陸第一顆Sputnik衛星之後40年,男人和女人才被送進太空。汽車是汙染、噪音和沒效率的,幾乎在出現的一百年後,仍然采用燃料與汽油混合以產生動力。

整體而言,除了一些幸運者之外,許多新技術像棄嬰般來到這個世界並且不被認同。遠在1880年,發電機被發明後,40年以後它才被用來產生電力改善工廠生產力。科學家必須精研其他相關技術,如發電廠、傳輸技術。投資者必須為新技術付費,工廠擁有者必須取消現有設備,發明家必須設法開發技術,企業家要為他們的投資尋找新市場,而且往往當一個技術最後達到繁榮期,那些不願改變現狀的人才開始使用。

這些情況造成了技術性變革的不確定性,在技術的科學基礎上是有風險的。

千年蟲也是一個技術上的偶然事件。公司每天都要猜測技術走到何處,許多倒閉的耳語由此產生,市麵也一陣猜測哪些會失敗。盡管如此,它是一種發現新事物所必經的曆程。有時候,所選用的標準本身是一項錯誤的決定,但市場機製所形成的檢驗與淘汰的壓力,使得這些錯誤的標準必須被選用。

絕大多數操作係統的廠商一再承諾新係統可以直接沿用舊係統的應用程序。因此,這種表示方法一直在計算機的硬件設計、製造和軟件開發以及微處理器的設計、製造中采用。到目前為止,大多數計算機和軟件中所涉及的年份幾乎都是采用兩位數來表示的。在多變的電腦界,一套係統會使用這麼多年,沒有重頭改寫設計,出乎所有人預料,但這也正是公元兩千年危機的成因。大多數應用程序使用者在曆經硬件變革時,總是期待不要重新設計,要求電腦公司的新作業係統可以延續執行舊程序。這種心態拖延出許多問題,公元兩千年危機隻是第一個顯現的危機。

日複一日,年複一年,這個當時被認為“不是問題的問題”在悄悄地孕育、增長。當離新世紀已不到5年之際,計算機專家們才突然如夢方醒:30多年來日積月累的“小毛病”由於掉以輕心已變成上億顆“時間炸彈”(TimeBomb),必須在短短幾年內趕緊拆除它們的引信!

幾乎是一夜之間,大家突然意識到一個巨大的危機已經呈現在我們麵前,這就是計算機2000年問題。

解剖千年蟲

有人將隱藏在計算機程序語言中的2000年日期計算問題稱為“千年蟲”(MillenniumBug)。當本世紀最後一頁日曆翻過去的那一刻,潛藏在全世界上百萬部電腦、上億行程序語言中的“千年蟲”就將如無數的非洲蝗蟲一般一湧而出,大肆啃嚼我們的文明。

有好事者寫出了下麵所謂的“千年蟲檔案”:

千年蟲檔案

千年蟲,病毒綱,寄生目;

學名:2000年問題,俗稱千年蟲;

英文名:Year2000Problerm,Y2K;MillenniumBug

產地:地球;

宿主:數以萬計的計算機係統及電子設備;

成蟲日期:2000年1月1日0點0分;在此時間前,宿主不受此蟲任何影響,蟲卵也不易為人察覺,但在此確定時間後,成蟲形成,開始對宿主產生不利影響,宿主正常機能將會遭受破壞;

成蟲存活期:成蟲不會自我消亡,如果不對其進行殺滅,其與宿主壽命一致。

那麼到底什麼是“2000年計算問題”?它在技術上有些什麼含義?下麵,我們就來簡單地解剖一下這種“千年蟲”。

眾所周知,日期作為一種特殊的數據,在計算機係統中起著不可缺少的作用。從大型機到微機的操作係統、編譯係統,特別是在應用軟件程序中,將數據按照日期進行分類、比較,以及與日期有關的報表、計算、核對等處理功能的實現,都要用到日期數據。

Y2K問題是大多數計算機係統固有的問題,它的本質是計算機係統時間表示的範圍不夠。任何計算機係統,隻要忽略紀元信息而使用2位數字表示年份,那麼一定會有Y2K問題。

對於一個計算機係統來說是否會出現Y2K問題,完全取決於係統所采用的時間表示方法及時間解釋方法。時間表示是係統層次上的事情,即係統能否正確地表示2000年之後的係統時間,2000年以後計算機係統時間是否仍然保持單調遞增的特征;時間解釋是應用層次上的事情,即係統能否正確地解釋2000年以後的係統時間,如操作係統的運行時間庫例程以及各種編程語言的運行時間庫例程,能否仍然按照年、月、日、時、分、秒的通常意義,解釋計算機係統時間的含義。

在自然界中,時間既沒有起點,也沒有終點,無窮無盡。而在計算機中,時間不但有起點,也有終點,時間有始有終。計算機係統的時間起點取決於係統設計時的假定,終點則取決於係統時間的表示位數。

時間的第一個重要特征是其單調性,即時間值總在不停頓地遞增。計算機係統時間盡管也具有隨時間單調遞增的特征,但是,由於計算機係統時間表示範圍的有限,隨著時間的不斷推移,必然引起時間表示的溢出,因此便會產生係統時間重新折回時間起點的"時光倒流"現象,導致所謂"計算機時間問題"的產生。

由於計算機係統在時間的表示範圍上所固有的有限性,必然會導致計算機時間問題的產生。計算機2000年問題就是人類跨越20世紀,進入21世紀時遇到的計算機時間問題。

因此,2000年問題,從狹義的範圍講,就是指在使用了計算機軟、硬件以及數字化程序控製芯片的各種設備和業務處理係統中,由於隻使用了兩位十進製數來表示年份,當日期從1999年12月31日進入2000年1月1日後,係統將無法正常識別由“00"表示的2000年這一具體年份,從而帶來跟年份、日期有關的處理錯誤,引發各種各樣的計算機業務處理係統和控製係統的功能紊亂。“2000年問題”,又叫做“2000年病毒”、“電腦千禧年問題”或“千年病毒MillenniumBug",國外還一般簡稱為“Y2K"。

更廣泛的講,2000年問題應該主要包括下麵三個方麵的內容:

1.由於隻使用兩位數字表示年份,在進入2000年以後,把代表年份的數字域“00”解釋為“1900”年,這樣,涉及到年份的計算和排序等操作就會肯定發生錯誤。例來說,COBOL程式以900226來代表1990年2月26日,以910101來代表1991年1月1日,910101比900226大,比較兩個數目大小會得到正確的結果。但是公元2000年1月1日的表示方式,是00101,這個數字和上兩個數字比較大小,結果就錯誤了。

2.還有一個“1999年問題”。在很多係統中,字符串“00"或“99"被賦予了特殊的意義,如存檔、特殊處理、甚至檔案刪除等,這樣,進入1999年後,係統也會由於將字符串“00"或“99"解釋為特殊的含義而發生紊亂。在1980年代,程序編寫員流行用9/9/99代表遙遠的未來,在那些要永久儲存資料的失效日期(expirationdate)上打如9/9/99。比如,許多的電腦磁帶在1999年或1/1/2000時資料會過期,這是因為它們使用99或是99/99/99來表示永久儲存的意思。

對於我們來說,1999年9月9日肯定不是遙遠的未來。那一天到來時,那些存檔資料的命運將如何?還有,在9/9/99當天設立的新電腦文件,又會怎樣?

3.2000年閏年問題。Y2K還牽涉到另一個日期計算問題,電腦上一般自動計算閏年的方法,是把年份除以4,如果能被整除沒有餘數的話,就是閏年;如果年份的最後兩數字是00的話,則除以400。

2000年是閏年,有2月29日。但1900年卻不是閏年。電腦如果把2000年當成是1900年的話,2月29日直接跳入3月1日,接下來的日期就全錯了。而在很多係統的時鍾日曆中,由於當初設計上的疏忽,把2000年處理為普通年,這樣,該係統的日曆中就沒有2000年2月29日,從而會引起混亂。

上麵三種問題中,以第一種問題表現的最為突出,也是2000年問題的一般性定義,它又具體體現在以下四個方麵:

(1)表示錯誤:即在應用係統的輸出顯示中,用“00”表示“2000”年,引起理解上的混亂。即“00”年到底表示“1900”年還是“2000”年?這類錯誤將主要表現在各種顯示係統、操作係統以及部分數據庫係統中。一般來說,這種錯誤所造成的危害較小。

(2)計算錯誤:即程序在對年份進行計算時,由於年份解釋錯誤而得出了錯誤的結果。典型的比如銀行用計算機為儲戶計算利息時,一筆1999年存入的款項到了2000年後其利息會被計算成為(00-99)*年息,這筆存款就會變成負數。

(3)位數溢出錯誤:對於那些使用兩位數來表示年份的芯片係統中,1999年之後的年份將造成芯片處理程序出錯,因而無法正常工作。

(4)兼容性問題:從1995年開始,許多軟件公司開發的應用程序都已開始支持年份的4位數表示。但是,在許多用戶部門,人們除了使用新的應用程序之外,由於業務需要,老的應用程序仍然在使用,且這些應用程序之間有時需要有統一的時間概念。但顯然這兩者之間是無法兼容的。

這些日期計算問題不僅出現在計算機和軟件中,造成更大規模影響的還可能是“嵌入(embedded)數字電路”問題。由於集成電路、微處理器技術的飛速發展,在儀器、數控設備中廣泛使用了單片微處理器、計數器等,隨著2000年的來臨,這些係統將不能正確識別年份,有可能導致計算機中所有與日期相關的計算出錯,所有嵌入數字電路的儀器、設備、控製係統也都可能發生問題。嵌裝晶片的一大難題是如何找尋哪些晶片將受到影響,如何更換,是否有足夠技術人員等等。嵌裝晶片的影響難以估計,複修期亦可能很長。

2000年問題的發生與否跟所使用的程式語言是沒有甚麼關聯的,任何一種程序語言均可能發生公元兩千年問題,這跟程序設計時的規格設計有關,不過早期利用COBOL語言所開發的應用係統所占比例較高,其實PL/I,Assembly,資料庫等關於時間中之年份的資料均會受到公元兩千年問題的影響,當然不隻限定於上麵所提到的程序語言。象UNIX及C/C++都有Year2000問題。問題出在UNIX time structure(“structtm”):UNIX/ANSI C+所設定的“structtm”內年份是以1900為基準起算;某些庫存函數處理超過[00…99]範圍的年份時會有問題。

上述種種情形都將造成程序執行運算、比較或編輯時產生錯誤或程式停頓,進而影響整體的信息作業,並導致與日期有關的數據(如年齡、利息、保險金、各種特定期限等)的計算、預測和控製的混亂,這將給社會帶來重大影響,並造成巨大的經濟損失。

根據Y2K問題的本質,無論計算機硬件、固件,還是計算機軟件、微程序都可能出現Y2K問題;無論主機係統還是個人計算機係統,無論操作係統、網絡係統、編譯係統、數據庫管理係統、軟件開發環境還是應用軟件係統,都可能出現Y2K問題。例如,在作業、事務、程序、例程庫、數據庫、數據字典、數據定義、數據索引、數據域、記錄、命令、操作、查詢、屏幕表格和報表中都可能用到日期,隻要是用2位數表示年份,就都無法幸免於難。

在此附帶提一下,2000年問題是有關日期計算引起的問題,絕大多數計算機和軟件是在2000年來臨之時發生這一問題。但有的計算機或軟件、器件的日期錯誤也會發生在2000年前後。例如,DEC公司的OPENVMS操作係統,因日期問題必須在今年5月19日前修改完畢,為此,DEC公司最近發布緊急公告,通知全球的DECOPENVMS用戶進行修正。

實際上,“千年蟲”已經開始在騷擾人們的生活了。

最近據報道,美國堪薩斯州一位104歲高齡(1894年出生)的老太太MaryBandar突然收到戶籍機構的電腦發出的幼兒園入學通知單,因為在電腦數據庫中,她的出生日期年份沒有“18"兩字,電腦便認定她是1994年出生,年齡四歲。