
294
|
第 8 章
不可能建置。我們沒有選擇,只能雇用一組人,以人力執行、反組譯這些程式來測試它
們,並且操控作業系統來剖析它們的動態行為。
手動審查速度慢、費用高、容易錯,另外的缺點是每個程式只能執行很短的時間、提供
動態行為有限的快照。所以就算沒有人出錯,偶爾也會有不良品誤進網路,因此手上就
會有一大堆憤怒的客戶。所幸我們有無法決定性,可以解決這個問題。
在這所有的困難底下,是兩個根本的問題。第 1 個是我們沒有能力窺視未來,無法看到
程式執行之後的結果;找出程式做了什麼的唯一通則,就是實際執行它。儘管有些程式
夠簡單而可以直覺預測它的行為,但通用語言始終會容許行為無法透過分析其原始碼來
預測的程式
19
。
第 2 個問題是,當我們真的決定執行某個程式時,並沒有可靠的方式能知道要多久才能
執行結束。唯一概略的解決方案就是執行然後等待,但因為我們知道以通用語言編寫的
程式可以不停止的永久循環,所以總有一些程式的無限制等待時間實在太久。
為什麼會這樣?
我們已經在本章看到,所有通用系統都夠強大的可以參照它們自己。程式運算數值,數
值可以表示字串,而字串是程式指令的寫入方式,因此程式完全有能力在它們自己的原
始碼上運作。
這種自我參照的能力,讓編寫能可靠預測程式行為的程式變得不可能。只要編寫了特定
的行為檢查程式,我們總是能夠構建更大但卻潰敗的程式:新的程式將核對器合併成
副常式,用來檢查它自己的原始碼,然後立刻執行核對器即將執行的完全相反的工作。
這些自相矛盾的程式相當稀少,而不是我們實際寫過的東西,但它們只是基本問題的症 ...