為什麼要提出圖靈機這個概念?
目的之一是為了回答德國數學家David Hilber在1928年提出的一個問題:可判定性問題。在邏輯中,如果某個邏輯命題是不可判定的,即表明對它的推理過程將一直運行下去,永遠都不會停止。而在計算機理論視角下,如何判定哪些是「可計算」的,哪些是「不可計算」的,是否存在一種算法,輸入形式化的邏輯語句(Formal Logic Statment),能夠判斷該命題的真假,並最終輸出判斷結果。
實際上,圖靈機並不指具體的計算機,而是一種數學計算模型,用於解決任何可計算問題。比如說判斷一個數是基數還是偶數,一加一等於幾……這種能夠通過計算得出結果的問題,圖靈機都可以解決。那圖靈機有沒有解決不了的問題呢?比如說「今天晚飯吃什麼」,這不是一個純粹的可以計算的問題,圖靈機就解決不了。因此對於一個問題,只要你能輸入一些圖靈機可以識別的數據,問題是可以計算的,圖靈機就能給你一個結果。
如果不考慮速度,只考慮可計算性,迄今為止,人們提出的所有計算模型都能夠用圖靈機模型模擬。無論是算盤、手機、還是超級計算機等,都不能超越圖靈機模型的計算能力。其實從某種意義上來說,「人」本身,也可抽象模擬為圖靈機模型。
❷
什麼是圖靈完備?
在圖靈機的基礎上,我們再來理解圖靈完備。根據維基百科的解釋:在可計算性理論裡,如果一系列操作數據的規則(如指令集、程式語言、細胞自動機)可以用來模擬單帶圖靈機,那麼它是圖靈完備的。
簡單來說,如果一門程式語言、一個指令集可實現圖靈機模型裡面全部的功能,或者說能夠滿足任意數據按照一定順序計算出結果,我們就可稱其具有圖靈完備性。像平時使用的C、Java都是圖靈完備的程式語言,可實現所有計算機能實現的功能。與圖靈完備相反的就是圖靈不完備,圖靈不完備指不允許或限制循環,也就是可以保證每段程序都不會死循環,都有運行完的時候。
對區塊鏈系統而言,圖靈完備或者圖靈不完備都是為了匹配不同的應用需求。在有些場景下,我們需要限制語言本身,以保證程序的終止性。例如,比特幣的腳本語言就是圖靈不完備的,它沒有循環語句和複雜的條件控制語句,一定程度上保障了系統的安全性。
而作為公有區塊鏈平臺,以太坊將比特幣針對數字貨幣交易的功能進一步進行拓展,面向更為複雜和靈活的應用場景,支持了智能合約( Smart Contract)這一重要特性。從此,區塊鏈技術的應用場景, 從單一基於 UTXO 的數字貨幣交易,延伸到圖靈完備的通用計算領域。用戶不再受限於僅能使用比特幣腳本所支持的簡單邏輯,而是可以自行設計任意複雜的合約邏輯。
也正是基於圖靈完備性,區塊鏈的系統為構建各種多樣化的上層應用開啟了大門。