以图灵的方式编程
程序的設計模式往往與計算機的體系結構有很大關系,以函數作為協議的主要表現方式,語言具有簡單嚴格的語法結構,應該與馮·諾依曼體系,或者更準確的說與代碼線性循序執行的方式不無關系。
馮·諾依曼體系是圖靈機的實現,但從實現之初,兩者便無多大交集,圖靈機具有理想性質,是不考慮控制和執行成本的,而馮·諾依曼機器,最初的程序設計對計算成本是非常關注的,而且按照圖靈機思想設計的程序,轉換成通常的程序,會比較復雜而且顯得不直觀。正如lex與bison生成的程序代碼,我們只會認為程序是對的,而很少會去閱讀。
以控制機器的思想設計程序,是圖靈機程序設計的主要方式,而對于計算細節(主要是比較運算)和控制細節(主要是條件轉移)的實現則基本不予關注。以機器的思想設計程序,以機器的思想而不是以庫函數的方式構建系統的結構,其實在編譯、業務邏輯表示、流程等很多方面都可以讓問題得到簡化。而用于執行的程序本身,則如數據一樣,可以動態動態組裝、動態執行。
在本質上馮·諾依曼體系與圖靈機并無大的區別,但在形式上卻有比較大的區別,可以這樣說,圖靈機側重規則的描述,而馮·諾依曼體系編程則側重于規則的執行,在計算機的計算能力受限制的過去,我們關注于執行,關注于算法。而今我們是否是更應關注于我們所要解決的問題,及其這些問題的上下文,以及解決這些問題相關知識的描述。
現在我們試著以圖靈機的方式書寫一個程序,掀開面紗,看看她的真容:
/*因為真實的圖靈機過于原始,為方便編程,在程序中做了以下約定:1、圖靈機有輸入的條帶,有輸出的條帶。2、非特別指定,匹配動作只在輸入條帶上執行。3、非特別指定,打印只在輸出條帶上執行。4、預定義匹配: =,>,< .。 =,>,< 操作語義,與序列比較的含義一致。. 不匹配條件。 5、預定義狀態:s0, e0 ,f0s0 表示開始狀態。e0 表示正常結束狀態。如未有跟隨的動作,則自動在輸出條帶上打印字符 '1'。f0 表示非正常結束狀態。如未有跟隨的動作,則自動在輸出條帶上打印字符 '0'。6、預定義動作: -> <- #-> 表示條帶指針右移一格。<- 表示條帶指針左移一格。# 表示把輸入條帶當前指定的內容,打印到輸出條帶上,同時輸出條帶的指針右移。? 對整個輸出條帶的數據,做相應的轉換。7、句型:定義: <標志符> <參數> <參數> ... 句子: <當前狀態> <匹配表達式> <下一狀態> <動作> <動作> ...--: 函數用 '--' 間隔 *///>=操作 !>= x ------------- s0 x e0 s0 >x e0 --------------//<=操作 !<= x -------------------------- s0 x e0 s1 <x e0 -------------------------//范圍操作 !.. x y --------------------------- s0 x e0 s0 y e0 s0 >x n1 n1 <y e0 ---------------------------//字母 !letter -------------------------- s0 'a'..'z' e0 s0 'A'..'Z' e0 --------------------------//數字 !digital -------------------------- s0 '0'..'9' e0 --------------------------//字母數字 !letterdigital ---------------------------- s0 letter e0 s0 digital e0 ----------------------------//標志符 !indent ---------------------------- s0 letter n1 -> # n1 letterdigital n1 -> # n1 . e0 <- ?string ----------------------------//數字 !number ---------------------------- s0 digital n1 -> # n1 digital n1 -> # n1 '.' n2 -> # n1 . e0 <- ?int n2 digital n2 -> # n2 'e' n3 -> # n2 'E' n3 -> # n3 digital n3 -> # n2 . e0 <- ?double n3 . e0 <- ?double ----------------------------
上面只是一個偽程序,但可以看出,這樣的編程方式比較適合于以規則為主體的各種應用,比如編譯、業務規則、業務流程等方面,同時作為自動機的控制輸入也是比較合適的。
總結
- 上一篇: 贝叶斯定理与贝叶斯估计
- 下一篇: python numpy使用