Atitit.提升語言可讀性原理與實踐
表1-1 語言評價標准和影響它們的語言特性1
1.3.1.2 正交性2
1.3.2.2 對抽象的支持3
1.3.2.3 表達性3
.6 語言設計中的權衡4
標 准
特性
可 讀 性
可 寫 性
可 靠 性
簡單性
·
·
·
正交性
·
·
·
數據類型
·
·
·
語法設計
·
·
·
對抽象的支持
·
·
表達
·
·
類型檢查
·
異常處理
·
有限地使用別名
·
第三個潛在的問題是運算符重載,即一個運算符有多種意義。雖然這很有用,但是如果允許使用者創建自己的重載,並且不是按常規重載,會降低可讀性。例如,重載"+"用於整數和浮點數的加法顯然是可取的。事實上,這一重載減少了運算符的數目,從而簡化了語言。但是假設程序員將"+"定義為計算兩個一維數組中所有元素的和,由於它不同於通常的向量求和,因此對這個程序,編寫程序的人與讀程序的人都難以理解。使程序難以理解的一個更極端的例子是將"+"定義為計算兩個向量的第一個元素之差
當然,語言的簡單性也不能過分。例如,如下一節所示,大多數匯編語言語句的形式與意義都是簡單性的典型體現。但是這種簡單性使匯編語言程序的可讀性較差。由於匯編語言程序缺乏更復雜的控制語句,所以程序結構不清晰;由於語句簡單,所以與高級語言相比,同樣的程序需要的語句就多得多。如果高級語言的控制結構和數據結構不適當,雖然沒有上面的例子那樣極端,但結論是一樣的。
作者:: 綽號:老哇的爪子 ( 全名::Attilax Akbar Al Rapanui 阿提拉克斯 阿克巴 阿爾 拉帕努伊 )
漢字名:艾提拉(艾龍), EMAIL:[email protected]
轉載請注明來源: http://www.cnblogs.com/attilax/
程序設計語言的正交性意味著相對較小的基本結構集合,能夠以較少的組合方式來構成語言的控制結構和數據結構。而且,基本結構的任一種可能組合都是合法且有意義的。例如數據類型,假設某語言有4種基本的數據類型(整型、單精度型、雙精度型和字符型)和2種運算符(數組和指針)。如果2種運算符都能夠作用於自身和4種基本的數據類型,就能夠定義大量的數據結構。
一個語言特性是正交的,意味著它獨立於程序中出現位置的上下文("正交"來自於正交向量這
IBM的設計限制較多,因此可寫性較差
正交性與簡單性直接相關:語言設計越正交,語言規則需要的特例就越少,特例越少意味著設計的規范程度越高,語言就越容易學習、閱讀和理解。任何學過大量英語的人可以證實,英語中的許多規則特例太難學了(例如,i總是在e前,除非在c後)
過多的正交也會產生問題。ALGOL 68語言(van Wijngaarden等,1969)可能是最具有正交性的程序設計語言了。ALGOL 68中的每一語言結構都有一個類型,這些類型沒有任何限制,而且大多數結構都有值。這種自由組合可以產生極其復雜的結構,例如,只要結果是一個地址,就可以把條件語句、聲明語句及其他各類語句一起放在賦值運算符的左邊。這種極端的正交形式導致了不必要的復雜性。而且,由於語言需要大量的基本結構,高度的正交性將產生爆炸性的組合方式。因此,即使組合方式很簡單,它們的整體數量也會導致語言的復雜性。
另一方面,過多的正交有損於可寫性。當幾乎任何基本結構的組合都合理時,程序中的錯誤會難以檢測,從而導致編譯器無法發現代碼中的謬誤。
可見,語言的簡單性至少部分歸因於相對少量的基本結構的組合,以及正交原理的有限應用。
有人認為,函數式語言同時具有良好的簡單性和正交性。函數式語言,如LISP,主要通過將函數作用於給定參數來執行計算。相反,命令式語言,如C、C++和Java,通常用變量和賦值語句來指定如何計算。函數式語言提供了最佳的整體簡單性,因為它們能夠用一種結構,即函數調用(函數調用能夠以簡單的方式與其他函數調用組合起來)來完成任何計算。正是這種簡單優美使一些語言研究者將函數式語言作為復雜的非函數式語言(如C++)的主要替代語言。但其他因素,如效率,限制了函數式語言的更廣泛應用。
簡而言之,抽象就是以允許忽略許多細節的方式來定義和使用復雜結構和操作的能力。抽象是當代程序設計語言設計的關鍵概念,這是抽象在現代程序設計方法學中扮演中心角色的反映。因此,程序設計語言所允許的抽象程度以及表達抽象的自然程度,對語言的可寫性非常重要。程序設計語言支持兩類不同的抽象:過程抽象和數據抽象。
過程抽象的一個簡單例子,是使用子程序來實現程序中多處需要的排序算法
作為數據抽象的一個例子,請考慮一棵在其結點上存儲整數的二叉樹
面向數據的軟件開發的最終演進開始於20世紀80年代早期,演變為面向對象的設計。面向對象的設計方法基於數據抽象,
語言的表達性涉及若干不同特性。在類似APL(Gilman和Rose,1976)的語言中,表達性意味著有若干功能強大的運算符,能夠用很短的程序實現大量的運算。表達性更普遍的意義是,語言具有較為簡捷而不笨重的方式來指定運算過程。例如,在C語言中,count++的形式比count=count+1更簡短更方便。還有,Ada語言中的布爾運算符and then方便地表明對布爾表達式進行短路求值,Java語言中的for語句在寫計數循環時比使用while語句更方便,雖然後者也能實現。以上這些都提高了語言的可寫性。
由於馮·諾依曼結構,命令式語言的核心特征就是變量(內存單元的模型)、賦值語句(基於傳輸操作)和迭代形式的循環運算(這是在該體系結構上實現循環的最高效形式)。表達式中的操作數由內存傳輸到CPU,表達式的計算結果傳回到賦值語句左邊所代表的內存單元。迭
盡管事實上,命令式程序設計語言的結構是以計算機體系結構為模型的,而不是出於程序設計語言使用者的能力和意願,有人仍然認為使用命令式語言比使用函數式語言在某種程度上更自然,因此許多人認為,即使函數式程序與命令式程序運行效率一樣高,命令式程序設計語言的使用仍然會占據主導地位。
l.3節介紹的程序設計語言的評價標准為語言設計提供了一個框架。可惜這個框架是自相矛盾的。Hoare在其關於語言設計的見解深刻的論文(Hoare,1973)中指出,有太多重要但相互矛盾的標准,協調並滿足這些標准是一個重要的工程任務。
參考資料
1.3 語言評價標准 - 51CTO.COM.html