高級數據結構與算法設計是導師的一門課程。很有可能是最后一門坐在教室里上的課。學習期間遇到的問題或者心得均在以此為標簽做記錄。
什么是自舉?
就是自己的編譯器可以自行編譯自己的編譯器。
實現方法就是這個編譯器的作者用這個語言的一些特性來編寫編譯器並在該編譯器中支持這些自己使用到的特性。
首先,第一個編譯器肯定是用別的語言寫的(不論是C還是Go還是Lisp還是Python),后面的版本才能談及自舉。
例如Python解釋器中的CPython、JPython、PyPy等版本,PyPy就是自舉。
自舉的意義?
自舉過程中和自舉之后,核心開發者每天使用自己設計的語言工作(開發自己的編譯器),不斷的在實踐中鍛造,利於及早發現設計缺陷和不足之處,並及時解決;自舉之前,只能每天花費大量的時間和精力,使用其他編程語言開發和維護自己的編譯器,學習積累的都是別的語言的經驗和教訓,缺少在實踐中檢驗自己設計的語言的機會。如果自己設計的語言自己都不去深度地使用,又上哪里獲取第一手的反饋信息呢,又如何改善呢。
所以自舉越早對編程語言自身發展完善越有利,最好是在自身定型之前盡早自舉。
如果你的語言不是圖靈完備,或者缺乏好用的指針等其它高級玩意兒,前者往往無法自舉,后者你累死你也很難寫出自舉的程序來。
什么是圖靈完備?
Turing completeness
In computability theory, a system of data-manipulation rules (such as an instruction set, a programming language, or a cellular automaton) is said to beTuring complete or computationally universal if and only if it can be used to simulate any single-taped Turing machine and thus in principle any computer.
在可計算理論里,一個數據操作規則的系統(比如:指令集、編程語言、細胞自動機)被稱作圖靈完備或者通用計算的,當且僅當它可以被用來模擬單帶圖靈機。
簡單來說,都能完全模擬圖靈機的就完備的。
什么是圖靈等價 ?
Turing equivalence
In computability theory, there is a closely related concept known as Turing equivalence. Two computers P and Q are called Turing equivalent if P can simulate Q and Q can simulate P. Thus, a Turing-complete system is one that can simulate a Turing machine, but the term is most often used to mean Turing equivalent to a Turing machine.
在可計算理論里,有一個很相關的概念叫圖靈等價。當計算機 P 和計算機 Q 是圖靈等價的,當P可以模擬Q而且Q也可以模擬P。因此,一個圖靈完備的系統可以模擬圖靈機,但是這個術語(即圖靈等價)常常被用來指與圖靈機等價。
然后我們再來看看在可計算理論中,這兩個詞的正式定義:
Turing completeness:A computational system that can compute every Turing-computable function is called Turing complete (or Turing powerful). Alternatively, such a system is one that can simulate a universal Turing machine.
圖靈完備:一個可以計算所有圖靈機可計算的計算系統被稱為圖靈完備的。換句話說就是一個可以模擬通用圖靈機的系統。
Turing equivalence:A Turing-complete system is called Turing equivalent if every function it can compute is also Turing computable; i.e., it computes precisely the same class of functions as do Turing machines. Alternatively, a Turing-equivalent system is one that can simulate, and be simulated by, a universal Turing machine. (All known Turing-complete systems are Turing equivalent, which adds support to the Church–Turing thesis.)
圖靈等價:一個圖靈完備的系統被稱為圖靈等價的,如果任何它可以計算的函數也是圖靈可計算的。也就是它可計算的函數和圖靈機可計算的函數是完全相同的。換句話說,就是圖靈等價的系統就是能模擬通用圖靈機同時也能也被通用圖靈機模擬的系統。(所有已知的圖靈完備的系統都是圖靈等價的,這增加了對丘奇-圖靈論題的支持)
綜上,圖靈等價有兩個意思,一個是指兩個計算系統在可計算性上計算能力相同;另一個,也是常用的一個就是指一個系統的計算能力與通用圖靈機計算能力相同(在可計算性的意義上)。
而圖靈完備是指能夠模擬通用圖靈機的計算系統。而所有已知的圖靈完備的系統都是圖靈等價的,這也增加了對丘奇-圖靈論題的支持。因此,在現有的計算機系統(編程語言、指令集等)上,使用圖靈等價和圖靈完備是一個意思。
圖靈完備語言?
套用上面的定義,如果一個編程語言可以完全模擬圖靈機,那么它就是圖靈完備的。
大部分編程語言都是圖靈完備的,因為他們需要解決各種問題的通用能力,而這正是圖靈機所具備的。
確實存在一些語言不是圖靈完備的,他們通常是被設計用來解決某些特殊的問題,比如,SQL、正則表達式。
以經驗來看,凡帶有分支,跳轉能力,並且支持數組狀數據結構的語言基本上就是圖靈完備的。
參考文獻
https://segmentfault.com/q/1010000000692678/a-1020000000693031
https://www.zhihu.com/question/25017764/answer/47013523
http://www.nowamagic.net/librarys/veda/detail/1856