圖靈完備(Turing-complete)
當有人說某個程式語言、某個桌遊、甚至某個試算表是「圖靈完備」時,他們是在給它計算上最高的讚美:它強到計算所能達到的極限。這個詞的意思是,該系統原則上能模擬一台圖靈機,因此能計算任何電腦所能計算的一切。沒有任何可計算的東西超出它的範圍。
精確地說,一個系統是圖靈完備(Turing-complete)的,若它能模擬任何圖靈機(等價地說,能計算每一個圖靈可計算的、μ-遞迴的函數)。實務上你證明這點的方法是:證明該系統能模擬某個已知通用的模型,或在其中建出一個。反覆出現的要件是「能表達任意迴圈或遞迴,再加上條件分支與無界記憶體」——正是這些材料讓一個計算能跑上無法預測的步數。缺乏無界迭代的系統(例如只有固定、有界迴圈的語言)通常不是圖靈完備的,因為每個程式都保證停機,而這嚴格較弱。
圖靈完備性無處不在,有時還是意外出現的:C、Python、Lisp 是圖靈完備的,但 λ 演算、康威的生命遊戲、某些紙牌遊戲、Minecraft 裡的紅石、甚至某些設定檔格式與 x86 的分頁錯誤機制也是。兩個關鍵且誠實的提醒。其一,圖靈完備不總是好消息:它意味著該系統繼承了計算的一切不可判定性,所以對一個圖靈完備的設定語言,你一般無法判定一份設定檔是否會停機。其二,真實電腦嚴格說來只是有限狀態的(記憶體有界),所以「圖靈完備」是一種理想化,在記憶體無界的極限下才成立;而且它對效率隻字未提,圖靈完備的系統可以慢得令人痛苦。
人們不斷發現「意外的」圖靈完備性。PowerPoint 動畫、紙牌遊戲《魔法風雲會》(Magic: The Gathering),以及 CSS 加 HTML(配合使用者點擊)都被證明能模擬計算。每個結果的證法都一樣:在該系統內建出某個已知通用模型(如計數器機或 Rule 110)的零件。
要稱 X 為圖靈完備,你在 X 內嵌入一個已知的通用模型;許多日常系統都符合資格,有時還是無意間的。
圖靈完備指完整的計算能力,但不代表有效率,而且對語言來說它常是個詛咒:它讓基本問題(這程式會停嗎?)變得不可判定。總會停機的有界迴圈系統是刻意設計成非圖靈完備的。