計(jì)算機(jī)程序中 Bug 的類型大全與歷史
美國計(jì)算機(jī)科學(xué)家、圖靈獎(jiǎng)獲得者詹姆斯·尼古拉·格雷(Jim Gray),在他的著名的論文“Why do computers stop and what can be done about it?”中首次提出了程序bug的類型,比如玻爾bug(Bohrbug)、 海森堡bug(Heisenbugs)等用著名科學(xué)家名稱命名的bug。后來又出現(xiàn)了更多的bug類型。現(xiàn)在,讓我們來看看它們都是什么bug類型。
美國計(jì)算機(jī)科學(xué)家、圖靈獎(jiǎng)獲得者詹姆斯·尼古拉·格雷(Jim Gray)
玻爾bug(Bohrbug)
大多數(shù)我們遇到的bug都是可以重現(xiàn)的,這些bug被統(tǒng)稱為玻爾bug(Bohrbug)。它是用丹麥著名物理學(xué)家、諾貝爾獲得者尼爾斯·波爾的名 字命名的。波爾首先在1913年提出了一個(gè)簡單、易于理解的原子模型概念。在波爾的模型中,原子中的電子的路徑和動(dòng)量是可預(yù)知的。同樣的道理,玻爾 bug(Bohrbug)也是可預(yù)知的。如果讓軟件在相同的條件下運(yùn)行,你可以讓bug再次顯現(xiàn)。例如,如果程序遇到空指針異常會崩潰,那么,設(shè)定相同的 輸入條件,你可以輕易的讓它們重新。
丹麥著名物理學(xué)家、諾貝爾獲得者尼爾斯·波爾
海森堡bug(Heisenbug)
所有有閱歷的程序員都遇到過這種情況:有個(gè)bug讓程序崩潰了,但當(dāng)程序重啟后,這個(gè)bug消失了。不論你用多少的時(shí)間和精力來試圖讓bug重現(xiàn),bug就是人間蒸發(fā)了。這樣的bug被稱為海森堡bug(Heisenbug),它是用德國物理學(xué)家、量子力學(xué)的創(chuàng)始人、“哥本哈根學(xué)派”代表性人物維爾納·海森堡(Werner Heisenber)的名字命名,隱射其著名的“測不準(zhǔn)原理”(又稱“海森堡不確定性原理”)。根據(jù)他的這個(gè)理論,在某一個(gè)給定的時(shí)間點(diǎn),一個(gè)電子所處的位置是無法確定的,也無法跟蹤它的軌跡。當(dāng)你去debug、探測、隔離一個(gè)bug時(shí),你的這些動(dòng)作會導(dǎo)致bug改變它們的行為表現(xiàn),這些bug就叫做海森堡bug(Heisenbugs)。這種事情是有可能的,比如,如果你使用未初始化的變量,這會導(dǎo)致一個(gè)bug出現(xiàn)。然而,當(dāng)你試圖debug這個(gè)程序時(shí),程序卻沒有任何異常,因?yàn)楹芏嗟膁ebug工具會自動(dòng)初始化變量為0,所以這些bug將不會再現(xiàn)。
德國物理學(xué)家、量子力學(xué)的創(chuàng)始人、“哥本哈根學(xué)派”代表性人物維爾納·海森堡(Werner Heisenberg)
曼德博bug(Mandelbug)
當(dāng)bug產(chǎn)生的原因過于復(fù)雜而難以理解時(shí),bug的出現(xiàn)也變得沒有規(guī)律,這些叫做曼德博bug(Mandelbug)。它是用分形幾何學(xué)之父本華·曼德博的名字命名。例如,操作系統(tǒng)中基于任務(wù)調(diào)度產(chǎn)生的bug就屬于曼德博bug(Mandelbug)。
分形幾何學(xué)之父本華·曼德博
薛定諤bug(Schroedinbug)
有時(shí)候,一個(gè)可以運(yùn)行的程序,當(dāng)你去看它的代碼時(shí),發(fā)現(xiàn)里面有一個(gè)bug或有某些問題,程序完全不可能在這樣的bug下運(yùn)行。但你再次運(yùn)行這個(gè)程序 時(shí),bug突然就其作用了,程序崩潰的了!雖然這聽起來很詭異,但這樣的bug確實(shí)存在,而且被叫做薛定諤bug(Schroedinbug)。它是用奧 地利理論物理學(xué)家、量子力學(xué)的奠基人埃爾溫·薛定諤的名字命名。隱射薛定諤著名的薛定諤貓思想實(shí)驗(yàn)。 在量子力學(xué)中,像原子這樣的粒子可以存在于兩種或兩種以上的量子狀態(tài)中,但薛定諤認(rèn)為,在更典型的物體,例如一只貓——由很多原子構(gòu)成——存在于兩種狀態(tài) 下的可能性是沒有的。他提出了一種思想實(shí)驗(yàn):把一只貓、一個(gè)裝有氰化氫氣體的玻璃燒瓶和一個(gè)放射性原子核放進(jìn)封閉的盒子里。當(dāng)盒子內(nèi)的監(jiān)控器偵測到衰變粒 子時(shí),就會打破燒瓶,殺死這只貓。根據(jù)量子力學(xué)的哥本哈根詮釋,在實(shí)驗(yàn)進(jìn)行一段時(shí)間后,貓會處于又活又死的疊加態(tài)。可是,假若實(shí)驗(yàn)者觀察盒子內(nèi)部,他會觀 察到一只活貓或一只死貓,而不是同時(shí)處于活狀態(tài)與死狀態(tài)的貓。而在量子物理中,這被稱作疊加態(tài):貓同時(shí)處于生和死的狀態(tài)。
奧地利理論物理學(xué)家、量子力學(xué)的奠基人埃爾溫·薛定諤
回到我們的bug上,因?yàn)槟阍诖a中發(fā)現(xiàn)了這個(gè)問題,你改變了程序的輸出——程序要么就繼續(xù)運(yùn)行,要么崩潰。所以,這種bug就叫做薛定諤bug(Schroedinbug)。
還有幾種其它類型的bug沒有在這里列出,例如“成長的bug(aging-related bugs)”——只有在程序運(yùn)行很久之后才會出現(xiàn)的bug。