程式設計能從馮.諾依曼風格中解放出來嗎?程式的函式風格及其代數-----John Backus (IBM RESEARCH)
程式設計能從馮.諾依曼風格中解放出來嗎?程式的函式風格及其代數-----John Backus (IBM RESEARCH)
此文為1977年ACM演講,以下為關鍵部分的摘抄及自己的解讀:
1 傳統程式設計語言:肥胖和脆弱
程式設計語言穩步地前進到它們今天肥碩的狀況已經20年了,結果,程式設計語言的研究和發明已經失去了許多激動人心的東西.代替的是,它現在是那樣一些人的領域:它們偏愛對細節厚厚的敘述進行工作,而不是用新的思想來進行奮鬥.關於程式設計語言的討論,經常類似於中世紀關於一個針尖上有幾個能跳舞的天使的爭論(tertio吐槽:翻譯好次,原翻譯是一個別針頭上有幾個能跳舞的安琪兒,靠!!!) ,而不是在基本不同的概念之間令人振奮的競爭.
2 計算系統的模型
模型的準則:
基礎: 有沒有一個對模型優雅而簡潔的數學描述呢?
歷史敏感性: 模型是否包括儲存的思想,使得一個程式可能儲存能影響後來程式特性的資訊?
語義型別: 一個程式是否逐次地轉換狀態直到達到終止狀態?
程式的清晰性和概念的有用性: 模型的程式是不是一個程式或計算的清晰表示式?
模型的分類:
1 簡單的運算模型
例子: 圖靈機 各種自動機
2 應用模型
邱奇的lambda演算,柯里的組合子系統,純粹的lisp,本文中描述的函式程式設計系統
3 馮諾依曼模型
馮諾依曼計算機,傳統的程式設計語言吧
馮諾依曼語言:
賦值語句把程式設計分為兩個世界.頭一個世界由賦值語句的右邊組成.這是有序表示式的世界,這是一個有用的代數性質的世界.它是大多數有用的計算發生於其中的世界.
傳統程式設計語言的第二個世界是語句的世界.在這個世界中,主要的語句是賦值語句本身.語言中所有其他語句的存在是為了使實施計算成為可能,這個計算必須以這個原始構造為基礎:賦值語句.
語句的這個世界是一個無序的世界,而且有很少有用的數學性質.結構程式設計可以看做向這個混沌的世界引入某些秩序的適度努力,但它在解決由一次一字的馮諾依曼程式設計風格所建立的基本問題方面成就很小,而且它主要使用迴圈,下標和控制的轉移流動.
應用計算機系統: (tertio注: 指lambda演算,lisp)
應用計算機系統缺乏儲存和歷史敏感性是它們沒有為計算機設計提供基礎的基本原因.而且,大多數應用系統應用lambda演算的替換運算作為基本運算.這個運算有無限的威力,但它的完備和有效實現給機器設計者帶來很大困難.
其次,在引進儲存和改進對馮諾依曼計算機有效性的努力中,應用性系統已經趨向於淹沒於大型的馮諾依曼系統中.例如純粹的Lisp通常被淹沒在具有許多馮諾依曼特徵的大型系統中...
9 馮諾依曼語言缺乏有用的數學性質
公理語義精確地把馮諾依曼程式不優美的性質重新表述為謂詞的轉換.一次一字的重複遊戲不因此而改變,只是遊戲場地變了而已.
因此指稱和公理語義時其基礎體現優雅和強有力概念的描述機制,但是用它們來描述馮諾依曼語言不能產生一個優雅和強有力的語言.......
10 馮諾依曼語言的替代者是什麼?
我們首先認識到一個系統不能是對歷史敏感的(允許一個程式的執行影響隨後的行為),除非這個系統有某種狀態(頭一個程式可以改變它而第二個程式可以訪問它).因此至少在這個弱的意義下,計算系統對歷史敏感的模型必須由一個狀態轉移的語義,但這並不意味著 誒個計算都必須強烈地依賴一個複雜狀態,而且對每一部分的計算都要求許多狀態變化(如同在馮諾依曼語言中那樣)
...
這些系統,我稱之為應用狀態轉移(AST, Applicative State Transition)系統.這些簡單系統避免馮諾依曼語言的許多複雜性和弱點,並且提供可變部分的一個強有力且廣泛的集合.
此文為1977年ACM演講,以下為關鍵部分的摘抄及自己的解讀:
1 傳統程式設計語言:肥胖和脆弱
程式設計語言穩步地前進到它們今天肥碩的狀況已經20年了,結果,程式設計語言的研究和發明已經失去了許多激動人心的東西.代替的是,它現在是那樣一些人的領域:它們偏愛對細節厚厚的敘述進行工作,而不是用新的思想來進行奮鬥.關於程式設計語言的討論,經常類似於中世紀關於一個針尖上有幾個能跳舞的天使的爭論(tertio吐槽:翻譯好次,原翻譯是一個別針頭上有幾個能跳舞的安琪兒,靠!!!) ,而不是在基本不同的概念之間令人振奮的競爭.
2 計算系統的模型
模型的準則:
基礎: 有沒有一個對模型優雅而簡潔的數學描述呢?
歷史敏感性: 模型是否包括儲存的思想,使得一個程式可能儲存能影響後來程式特性的資訊?
語義型別: 一個程式是否逐次地轉換狀態直到達到終止狀態?
程式的清晰性和概念的有用性: 模型的程式是不是一個程式或計算的清晰表示式?
模型的分類:
1 簡單的運算模型
例子: 圖靈機 各種自動機
2 應用模型
邱奇的lambda演算,柯里的組合子系統,純粹的lisp,本文中描述的函式程式設計系統
3 馮諾依曼模型
馮諾依曼計算機,傳統的程式設計語言吧
馮諾依曼語言:
賦值語句把程式設計分為兩個世界.頭一個世界由賦值語句的右邊組成.這是有序表示式的世界,這是一個有用的代數性質的世界.它是大多數有用的計算發生於其中的世界.
傳統程式設計語言的第二個世界是語句的世界.在這個世界中,主要的語句是賦值語句本身.語言中所有其他語句的存在是為了使實施計算成為可能,這個計算必須以這個原始構造為基礎:賦值語句.
語句的這個世界是一個無序的世界,而且有很少有用的數學性質.結構程式設計可以看做向這個混沌的世界引入某些秩序的適度努力,但它在解決由一次一字的馮諾依曼程式設計風格所建立的基本問題方面成就很小,而且它主要使用迴圈,下標和控制的轉移流動.
應用計算機系統: (tertio注: 指lambda演算,lisp)
應用計算機系統缺乏儲存和歷史敏感性是它們沒有為計算機設計提供基礎的基本原因.而且,大多數應用系統應用lambda演算的替換運算作為基本運算.這個運算有無限的威力,但它的完備和有效實現給機器設計者帶來很大困難.
其次,在引進儲存和改進對馮諾依曼計算機有效性的努力中,應用性系統已經趨向於淹沒於大型的馮諾依曼系統中.例如純粹的Lisp通常被淹沒在具有許多馮諾依曼特徵的大型系統中...
9 馮諾依曼語言缺乏有用的數學性質
公理語義精確地把馮諾依曼程式不優美的性質重新表述為謂詞的轉換.一次一字的重複遊戲不因此而改變,只是遊戲場地變了而已.
因此指稱和公理語義時其基礎體現優雅和強有力概念的描述機制,但是用它們來描述馮諾依曼語言不能產生一個優雅和強有力的語言.......
10 馮諾依曼語言的替代者是什麼?
我們首先認識到一個系統不能是對歷史敏感的(允許一個程式的執行影響隨後的行為),除非這個系統有某種狀態(頭一個程式可以改變它而第二個程式可以訪問它).因此至少在這個弱的意義下,計算系統對歷史敏感的模型必須由一個狀態轉移的語義,但這並不意味著 誒個計算都必須強烈地依賴一個複雜狀態,而且對每一部分的計算都要求許多狀態變化(如同在馮諾依曼語言中那樣)
...
這些系統,我稱之為應用狀態轉移(AST, Applicative State Transition)系統.這些簡單系統避免馮諾依曼語言的許多複雜性和弱點,並且提供可變部分的一個強有力且廣泛的集合.
(tertio注: 作為一個複雜系統,迴避狀態變化是鴕鳥的行為---這正是當前函式式的鼓吹者們錯誤的觀點,為狀態轉移提供一個語義模型才是正途,而這一點巴科斯在1977年已經為我們指出了正確的方向)
在過去的三至四年中,我已經研究這個領域,但對於一個好的語言必須解決的許多衝突要求,還沒有找到滿意的解.但我相信這個尋找已經指出設計非馮諾依曼語言的一個有用方法.
這個方法涉及4個成分:
1 不帶變數的函式風格的程式設計.
2 函式程式代數.描述了一個代數,其變數表示函式程式設計的函式性程式,而其"操作"是函式程式設計的函式形式,即函式程式設計的程式的組合形式.給出了代數的某些定律,給出一些定理和例子,來說明某些函式表示式如何轉換為等價的無窮展開....
3 一個形式的函式程式設計系統.
4 應用的狀態轉移系統.
(以下是對上述4點的展開,由於有很多公式及推導,而且符號也沒法打出來,略,實際上作為程式設計師來說,學習了lisp之後應該就不必再看前三個部分的公式及說明了)
(我認為這裡最重要的是4,----應用狀態轉移系統)
14 應用狀態轉移(AST)系統
AST系統的結構:
1 一個應用子系統(例如FFP系統)
2 一個狀態D,即應用子系統的定義集合
3 一組轉換規則,它們描述輸入如何被轉換為輸出,以及如何改變狀態D
應用子系統不能改變狀態D,而且在計算一個表示式期間,它不發生改變.新狀態連同輸出一起被計算,並在給出輸出時,代替舊的狀態.
以上是AST系統的概述
總之,巴科斯在這篇1977年的文章中,已經超越了命令式還是函式式的爭論,在一個AST系統中,將函式式和狀態轉移模型結合在了一起.
相關文章
- Javascript程式設計風格JavaScript程式設計
- java中須遵守的程式設計風格Java程式設計
- 糟糕程式設計師的程式設計風格程式設計師
- JavaScript 程式設計風格指南JavaScript程式設計
- 馮·諾依曼體系結構
- 物件導向程式設計風格 VS 基於物件程式設計風格(boost::bind/function)物件程式設計Function
- 各種流行的程式設計風格程式設計
- Google Java 程式設計風格指南GoJava程式設計
- 優秀Java程式設計師的程式設計風格Java程式設計師
- 用 kotlin 來實現 dsl 風格的程式設計Kotlin程式設計
- 如何培養良好的程式設計風格程式設計
- Google Python 程式設計風格指南GoPython程式設計
- 前端 JavaScript 程式設計風格淺析前端JavaScript程式設計
- 你需要懂點程式設計風格程式設計
- Google C++程式設計風格指南GoC++程式設計
- Python程式設計風格和設計模式Python程式設計設計模式
- java程式設計規約----程式碼風格(一)Java程式設計
- Google C++ 程式設計風格指南:來自 Google 的奇技GoC++程式設計
- 從程式碼的風格看出六種不同型別的程式設計師型別程式設計師
- 關於程式設計風格的討論 (轉)程式設計
- 程式碼的風格 (轉)
- REST設計風格REST
- Google C++ 程式設計風格指南:類GoC++程式設計
- Google C++ 程式設計風格指南:格式GoC++程式設計
- C 語言程式碼風格之 Linux 核心程式碼風格Linux
- 從另一個考慮來看程式碼的風格 (轉)
- Google C++ 程式設計風格指南:作用域GoC++程式設計
- Google C++ 程式設計風格指南:註釋GoC++程式設計
- Google C++程式設計風格指南(七):格式GoC++程式設計
- Spring MVC 中使用 RESTFul 程式設計風格SpringMVCREST程式設計
- 部落格園使用sublime text風格的程式碼高亮樣式
- JavaScript 程式碼風格指南JavaScript
- 從“按鈕”看設計風格的演變
- muduo網路庫學習筆記(0):物件導向程式設計風格和基於物件程式設計風格的比較筆記物件程式設計
- 編寫可維護的JavaScript-程式設計風格JavaScript程式設計
- 為Android 5.0設計Material風格的應用程式Android
- Google C++程式設計風格指南(六):程式碼註釋GoC++程式設計
- Google C++ 程式設計風格指南:命名約定GoC++程式設計