1. 程式人生 > >程式語言的本質:1.程式語言的計算能力

程式語言的本質:1.程式語言的計算能力

程式語言的本質到底是什麼?”——昨天晚上給自己提了這麼個問題

如果要我來解釋,自然語言的本質到底要從哪幾方面入手,我可能能說出這麼一些來:拼寫學Orthography、音系學Phonology、語音學Phonetics、詞法學Morphology、句法Syntax、語義學Semantics、語用學Pragmatics[1]。也許,學英語,學法語,學拉丁文,掌握這麼些本質的東西,融會貫通一下,學習起來應該就很快了。(我現在越來越覺得,你跟所謂的牛人之間的差距,可能只是方法論的區別而已。)

但是接觸了這麼久程式語言,編過PHP,編過C++,編過Java,編過Python,編過Prolog,編過OC,當我問自己這麼個問題的時候,腦子竟然一片空白。以前總是沉迷在各種語言的“玩法”上不能自拔,覺得很爽,很拽,別人都不會,很有成就感。但其實那些都是很表皮的東西,翻翻文件就能完成的東西。最近看了些部落格,看了些書,深知對語言的追求應該是到那種拿到一門新的語言,半天就能將特性琢磨透的程度。那麼怎麼琢磨透呢?我覺得,只有瞭解本質的東西,才能讓你有這種認知的速度,基礎才是最重要的。

本來這篇文章應該是徐宥前輩的“程式設計珠璣八卦版”[2]的讀後感,但行文之前,隱隱感覺有種拾人牙慧的罪惡感,於是狠狠開啟wiki,做起資料收集來。一查起來發現,徐宥前輩的文章就是一扇門,可能寫得好的部落格都是一扇門吧。這個問題,深挖可以牽扯到計算理論、計算模型等等理論電腦科學的東西,淺挖就是各種程式設計泛型、資料結構、核心特性等等,而徐宥前輩的文章似乎也自成一個體系,所以我決定將這個問題分開三個方面去闡述:

  1. 第一篇以程式語言的計算能力為角度
  2. 第二篇以程式語言的本質區別為角度
  3. 第三篇以程式語言的歷史發展為角度

之後可能會在這個基礎上加上其它的一些角度,說不準。

========================================
程式語言的計算能力

給我一門程式語言,我是不是可以解決這個世界上所有問題呢?——這又是一個以前經常在腦海中迴盪,但是一直不知道怎麼找答案的問題

這個問題真的是很有趣的,也很哲學,提出的原因可能是我這種經常使用Python的,覺得很多都是”import antigravity”[3]的問題而已,也可能只是某個時候,剛碼完程式碼,心情很爽,所以心血來潮有了這麼個邪念。

在閱讀徐宥前輩的《高階語言怎麼來的》系列過程當中,前輩多次提到“FORTRAN語言是圖靈完備的,儘管它不支援遞迴”這麼一個觀點。到底什麼是圖靈完備呢?圖靈我見過,《模仿遊戲》裡面的卷福不是麼?(其實我是奔著凱拉·奈特莉去的,值得一看。。)我們談論的,其實是電腦科學領域的圖靈。圖靈生平做過什麼牛事就不說了。我來說說他的“那臺”圖靈機,這臺機器跟我提出的這個問題大有淵源。注意這臺圖靈機並不是那臺Enigma。

A Turing machine is a hypothetical device that manipulates symbols on a strip of tape according to a table of rules.[4]

有人根據這種描述,將字面上理解的圖靈機表示了出來
圖靈機

但是請記住,這只是為了給讀者一個直觀的認識,因為圖靈機實際上仍是一個抽象模型。

  1. 那條紙帶,我們叫它紙帶(tape),圖靈機將這條紙帶假設為左右無限延展
  2. 紙帶操作頭,叫head
  3. 圖靈機本身儲存的狀態的地方,叫state register,存的值叫做state
  4. 那個表,叫做finite table of instructions

注意這裡,整個圖靈機的組成裡面,除了tape,其他都是有限的,只有tape是無限的,這也說明了它的假想性質。圖靈提出的僅僅是假想,但是我們現代的計算機,的確是以圖靈機模型為基礎的:

我們平時所說的和所使用的計算機,基於圖靈提出的確定型圖靈機模型。它是最好理解的:給出固定的程式,模型按照程式和輸入完全確定性地執行。[5]

我們前面說的紙帶圖靈機,就是指確定型圖靈機。我們要清楚,圖靈機並不一定就是計算機,它是虛構的機器,確切來說是一個計算系統,我們的程式語言,cpu的命令集,都可以算是一個圖靈機,明白這點很重要。

除此之外,常見的計算機模型還有非確定型圖靈機模型:

它(非確定型圖靈機)在進行計算的時候,會自動選擇最優路徑進行計算。通俗地說,它有預測能力。比如說,為了說明某個數是合數,非確定型圖靈機會猜測一個數,恰好是其因子,從而證明了它不是質數

與確定型圖靈機不同,圖靈機只存在於人的想象中,現實上是不可行的(能夠預測的計算機。。)但是人們仍然通過研究諸如“如果這個問題在非確定型圖靈機上面用這個演算法解決會有什麼樣的效率呢”之類的問題來進行研究

其中他們研究的一個問題就是P vs NP問題,這個問題也是千禧問題中的一個

P指確定型圖靈機上的具有多項式演算法的問題集合,NP指非確定型圖靈機上具有多項式演算法的問題集合。P vs NP問題指P是否完全等於NP,即確定型圖靈機和非確定圖靈機的效能是否一樣。[6]

如果P=NP,那麼很多在非確定型圖靈機模型下能夠多項式演算法進行求解的問題,就能在確定型圖靈機模型下使用多項式演算法求得(雖然這個演算法可能很難找到);設想中的就能在現實中實現。

另外一個比較出名的就是量子計算機模型,它能夠實現所謂無限並行度,這裡不作細講。有興趣可以去學習量子理論和量子計算(理論電腦科學的一部分)

另外一位大牛,美國數學家Alonzo Church發表過一個觀點:Church–Turing thesis(邱奇-圖靈假說),認為所有的計算模型計算能力都無法超過確定型圖靈機:

Church–Turing thesis hypothesizes this to be true for any kind of machine: that anything that can be “computed” can be computed by some Turing machine.[7]

這個雖然是一個假說,但是現在的計算理論都是基於這個理論搭建起來的,並且被證明非常成功。由這個假說我們知道,圖靈機這個模型能夠達到所有其他計算模型的計算能力。這種計算能力達到什麼程度呢?是不是說,世界上所有的問題在圖靈機都有辦法解決呢?或者說,世界上的所有問題在圖靈機都有演算法嗎?

答案是否定的。其中一個著名的不能解決的問題就是停機問題:

In computability theory, the halting problem is the problem of determining, from a description of an arbitrary computer program and an input, whether the program will finish running or continue to run forever.[8]

而圖靈給出了證明,這個問題是無法解決的:

Alan Turing proved in 1936 that a general algorithm to solve the halting problem for all possible program-input pairs cannot exist. A key part of the proof was a mathematical definition of a computer and program, which became known as a Turing machine; the halting problem is undecidable over Turing machines. It is one of the first examples of a decision problem.

現實中,我們去衡量自己的一個計算系統是不是可以歸類為圖靈機(前面已經說明圖靈機並不一定是一臺機器),要看它是不是“圖靈完備”的。

什麼是圖靈完備呢?

In computability theory, a system of data-manipulation rules (such as a computer’s instruction set, a programming language, or a cellular automaton) is said to be Turing complete or computationally universal if it can be used to simulate any single-taped Turing machine.[9]

如果你的這個系統,能夠用來模擬出單紙帶的圖靈機,那麼它就是圖靈完備的,也就是說,它就和圖靈機有一樣的計算能力。前面說了,這個系統可以指很多東西,可以指一個軟體,可以是一個程式語言,等等。

舉幾個例子,什麼是圖靈完備的程式語言?C是不是?你能用C語言模擬出單紙帶的圖靈機嗎?明顯可以(具體的實現可以在網上找)。

那麼Python呢?Java呢?都可以。其實,有人早就做出一個總結,告訴你,以下這些語言就是圖靈完備的:

All general-purpose languages in wide use:
1. Procedural programming languages such as C, Pascal.
2. Object-oriented languages such as CIL, Java, Smalltalk.
3. Multi-paradigm languages such as Ada, C++, Common Lisp, Object Pascal.

Most languages using less common paradigms
1. Functional languages such as Lisp and Haskell.
2. Logic programming languages such as Prolog.
3. Declarative languages such as XSLT.
4. Esoteric programming languages, such as Brainfuck

除此之外的語言呢?其實,絕大部分的程式語言都是圖靈完備的,他們都擁有相同的計算能力。但是,有一些我們比較常見的卻不是:

  1. regular languages
  2. XML, HTML, JSON, YAML(明顯不具備計算能力,它們只是markup language
  3. 等等

那麼,有沒有什麼科學點的方法來驗證某種程式語言是不是圖靈完備的呢?簡單的方法的話,可以參考一種叫做brainfuck的語言,這是一種最簡單的圖靈完全的語言,而且被證明了,如果一門程式語言能夠完全brainfuck的所有功能,那麼他一定是圖靈完全的。(知乎@余天升)

到現在,我們可以知道,其實我們用的絕大多數語言,都是圖靈完備的。這似乎就解答了我開始提出的問題:

問:“給我一門程式語言,是不是可以解決世界上所有問題呢?”轉換為“圖靈機對於這個世界上的問題是不是都有演算法?”(本來提出這個問題,我也沒想用標記語言去解決所有問題)
答:“不是”

但是通過上篇的分析,我們至少能夠知道,絕大多數的語言,計算能力都是相同的。

但是細心想想這句話,其實和我們的“直覺”會有衝突。我們的直覺告訴我們,我們用Python去寫一個網頁後端,和用Prolog去寫一個網頁後端,肯定是不同的。這就不是計算能力(可行性)的問題了。而是關係到了計算的效率、程式碼的可理解性、可維護性等等的一些問題。圖靈完備只是通用程式設計的最低要求,只是證明了“在記憶體無限、時間無限的情況下,最終會計算出來“這樣的一種可行性。

那麼,就很自然地引出一個問題,在計算能力相等的情況下,什麼才是程式語言之間的區別呢?這是下一篇所要解決的問題了!

注:
1. 玩minecraft的同學可以看看這個視訊, https://www.youtube.com/watch?v=1X21HQphy6I。 在minecraft裡面用紅石(redstone)和活塞(piston)構造的系統也是圖靈完備的哦(這也就解釋了為什麼那麼多人在minecraft裡面程式設計了吧)
2. 維基百科上面有一篇文章是介紹圖靈完備的,但是連結失效了,求備份!
3. 對於疏漏難免,如果有任何改進的建議,十分歡迎提出!

相關推薦

程式語言本質1.程式語言計算能力

程式語言的本質到底是什麼?”——昨天晚上給自己提了這麼個問題 如果要我來解釋,自然語言的本質到底要從哪幾方面入手,我可能能說出這麼一些來:拼寫學Orthography、音系學Phonology、語音學Phonetics、詞法學Morphology、句法

學習C語言的教材、如何成為一名優秀的C程式設計師、激發程式設計師創意的6本書、國外程式設計師推薦每個程式設計師都應讀的書

學習C語言的教材 我的C語言是自學的,這些年看過不少教材。 下面,我對其中一些教材做個點評。 1. How to Think Like a Computer Scientist: C version 這是我讀過最易懂的C語言教材。 雖然它只講

64位系統Visual Studio通過IIS除錯Web程式報錯未在本地計算機上註冊"MSDAORA.1"提供程式

64位作業系統除錯程式連線Oracle真心蛋疼無比,包括Oracle和PL/SQL安裝、查詢時也是各種問題,無法登入啊、無法連線啊、無法顯示中文啊等等各種“無法”。Oracle和PL/SQL弄好後除錯程式又是各種“無法”,各種“ORA-06413”什麼的。 好歹通過努力算是

程式本質複雜性和元語言抽象

元件複用技術的侷限性 常聽到有人講“我寫程式碼很講究,一直嚴格遵循DRY原則,把重複使用的功能都封裝成可複用的元件,使得程式碼簡短優雅,同時也易於理解和維護”。顯然,DRY原則和元件複用技術是最常見的改善程式碼質量的方法,不過,在我看來,以這類方法為指導,能幫助

招聘靠譜程式設計師系列1 程式碼風格優化與糾錯

問:風格糾錯 答: 使用NS_ENUM而不是C語言型別的列舉enum typedef NS_ENUM(NSInteget, XBYGender) { //使用gender比sex正式 XBYGenderMan, XBYGenderWo

SQL c# 程式報錯未在本地計算機上註冊“Microsoft.Jet.OLEDB.4.0”提供程式

報錯:未在本地計算機上註冊“Microsoft.Jet.OLEDB.4.0”提供程式。System.Data 需要注意的問題和解決方法: 1.Microsoft.Jet.OLEDB.4.0不要寫成Miscrosoft.Jet.OLEDB.4.0,; 2.Data Source不要

我看小程式系列文章1 不一樣的角度 解讀微信小程式

大家好,我是Beta007. 最近一直在研究小程式,會在這裡整理出一系列的文章,和大家交流。 第一篇文章首發在了知乎專欄:小樓昨夜又秋風:https://zhuanlan.zhihu.com/p/22891188 知乎ID:七月在夏天  (頭像是隻喵~) 不一樣的角度

C語言高階篇 - 1.C語言複雜表示式和指標高階應用

1.指標陣列與陣列指標 1.1、字面意思來理解指標陣列與陣列指標 (1)指標陣列的實質是一個數組,這個陣列中儲存的內容全部是指標變數。 (2)陣列指標的實質是一個指標,這個指標指向的是一個數組。   1.2、分析指標陣列與陣列指標的表示式 (1)int *

程式學習筆記程式百度地圖例子的執行

  微信的小程式結構升級很快,百度的小程式demo不能直接運行了。 首先下載小程式——百度地圖的例子。https://github.com/baidumapapi/wxapp-jsapi 1、設定微信公眾平臺——小程式——設定——開發設定。 修改伺服器域名,reques

三週學會小程式第一講程式申請和注意事項

註冊 註冊郵箱 個人申請小程式非常簡單,首先你需要註冊一個全新的郵箱。 當然用你的個人郵箱也可以,小編考慮到後面你可以再次開發自己的小程式,所以這裡還是重新申請一個比較好。網易郵件一個手機號可以申請15個郵箱,是一個不錯的選擇 註冊小程式 進入 https://mp.weixin.qq.com/ 頁面

[轉]國外程式設計師推薦每個程式設計師都應該讀的非程式設計書

五年前有網友在 Stackoverflow 發帖提問:『程式設計師應該讀哪些非程式設計方面的書?』。有很多程式設計師響應,他們在推薦的同時也寫下了自己的評語。本文摘編其中 29 本書,下面就按照各書的推薦數排列。另外,本月初我們在伯樂頭條也發起了相同的討論帖《你最喜歡的非程式設計書是哪一本?》,已有很多的朋友

國外程式設計師推薦每個程式設計師都應該讀的非程式設計書

【伯樂線上導讀】:五年前有網友在 Stackoverflow 發帖提問:『程式設計師應該讀哪些非程式設計方面的書?』。有很多程式設計師響應,他們在推薦的同時也寫下了自己的評語。本文摘編其中 29 本書,下面就按照各書的推薦數排列。另外,本月初我們在伯樂頭條也發起了相

國外程式設計師推薦每個程式設計師都應讀的書

【更新】:近日(2012年8月17日)重看 StackOverflow 的原討論帖,發現於今年年初被關閉了。不過有人做了彙總,把其他回覆中提到的書籍,放在投票數最高的回覆中。新更新新增 59 本書,詳情可見文章後半部分。 編者按:2008年8月4日,StackOve

書_國外程式設計師推薦每個程式設計師都應讀的書[轉]

 編者按:2008年8月4日,StackOverflow 網友 Bert F 發帖提問:哪本最具影響力的書,是每個程式設計師都應該讀的?  “如果能時光倒流,回到過去,作為一個開發人員,你可以告訴自己在職業生涯初期應該讀一本,你會選擇哪本書呢?我希望這個書單列表內容豐富,可以

國外程式設計師推薦每個程式設計師都應讀的書【轉載】

編者按:2008年8月4日,StackOverflow 網友 Bert F 發帖提問: “如果能時光倒流,回到過去,作為一個開發人員,你可以告訴自己在職業生涯初期應該讀一本,你會選擇哪本書呢?我希望這個書單列表內容豐富,可以涵蓋很多東西。” 很多程式設計師響應,他們在

國外程式設計師推薦每個程式設計師都應讀的書(作為一個碼奴,這個也留著)(轉)

國外程式設計師推薦:每個程式設計師都應讀的書 來自:http://www.williamlong.info/archives/3028.html  “如果能時光倒流,回到過去,作為一個開發人員,你可以告訴自己在職業生涯初期應該讀一本,你會選擇哪本書呢?我希望這個書單列表內容豐富,可以涵蓋很多東西。”

程式設計師推薦每個程式設計師都應讀的書-國外計算機圖書

很多程式設計師響應,他們在推薦時也寫下自己的評語。以前就有國內網友介紹這個程式設計師書單,不過都是推薦數 Top 10的書。其實除了前10本之外,推薦數前30左右的書籍都算經典,筆者整理編譯這個問答貼,同時摘譯部分推薦人的評語。下面就按照各本書的推薦數排列。 如果能時光倒流

微信小程式報錯程式重啟耗時過久,請確認業務邏輯中是否有複雜運算,或者死迴圈的解決

在開啟新版本的微信開發者工具時,彈出以下錯誤框:然後你再等會會發現,頁面照樣載入Ok,但是會出現這麼一個情況,就是開啟一個.wxml或者.wxss或者.js檔案,會出現空白的情況,就是你檔案裡的程式碼不見了,未加載出來....如下圖這個錯誤的解決:(1)首先第一點是你檔案裡的

程式設計師笑話只有程式猿才看得懂

1.世上有10種人:懂二進位制的和不懂二進位制 2.程式設計師寫詩: 我一直以為 愚蠢是一個 抽象類, 但卻發現了你這個例項。我以為微軟錯了,然後撥開你的封裝,才發現,原來你還是無恥,無能,變態的子類。 更讓我覺得不可思議的是,你不僅是個靜態類,還是個密封類! 可

面向初學者的 MQL4 語言系列之1——MQL4 語言入門

簡介 本系列的文章主要針對的是完全不懂程式設計,但想要在最短的時間內花費最少的精力盡快了解 MQL4 語言的交易者。如果您看到“面向物件”或“三維陣列”這類詞語就覺得頭痛,那麼這篇文章正是您需要的良方。這些課程的設計旨在最快出成果。內容也通俗易懂。我們在理論方面不會有太深