中文字幕在线观看,亚洲а∨天堂久久精品9966,亚洲成a人片在线观看你懂的,亚洲av成人片无码网站,亚洲国产精品无码久久久五月天

雜談現(xiàn)代高級編程語言

2018-07-20    來源:編程學(xué)習(xí)網(wǎng)

容器云強勢上線!快速搭建集群,上萬Linux鏡像隨意使用

幾個月之前,Slashdot轉(zhuǎn)載了Robert Harper教授的一篇博客,說卡內(nèi)基梅隆大學(xué)計算機系把”面向?qū)ο缶幊獭皬拇笠恍律谋匦拚n中刪掉了,其原因是

Object-oriented programming … is both anti-modular and anti-parallel by its very nature.

這兩個原因(anti-modular和anti-parallel)都是很重的指責(zé)了;尤其是anti-modular,因為OO的基本思想通常被理解成“封裝”,從而實現(xiàn)模塊化。

我是在1995年第一次聽說“面向?qū)ο蟆保∣bject Oriented)這個說法。當時在學(xué)習(xí)正在成長過程中的C++,用的是Borland C++ 1.0。從那時開始的很多年里,”類“(class)、“對象”(object)和“方法”(methods),以及在這些概念之上構(gòu)建的”繼承“(inheritance)和”多態(tài)“(polymorphism)都是我理解中OO最核心的思想。我猜大多數(shù)程序員在這方面的認識都和我差不多。

但是“封裝”真的是OO的本質(zhì)嘛?直到最近為了給iPhone寫個玩具程序而學(xué)習(xí)Objective-C(一種非常古老和原始的面向?qū)ο缶幊陶Z言)的時候,才注意到早在1998年,OO之父Alan Kay就曾經(jīng)在一篇郵件中說,他很后悔發(fā)明了“object”這個詞,從而誤導(dǎo)大家,把注意力都集中到“封裝”,而忽視了OO的本質(zhì)——messaging(消息傳遞)。Alan Kay的原話是:

The big idea is “messaging” … . The key in making great and growable systems is much more to design how its modules communicate rather than what their internal properties and behaviors should be.

Objective-C的設(shè)計是非常強調(diào)“消息傳遞”(messaging)的——對一個object的method的調(diào)用,被稱為“給這個object發(fā)了一個消息”。為了突出調(diào)用method時指定的參數(shù)(parameters)實際上是消息中的一些內(nèi)容,Objective-C不惜把method的定義方式都做了相對于C的很大的修改,從而把參數(shù)嵌入在method的名字里。比如在一個叫做myWebView對象中搜索一段文字,要求不區(qū)分大小寫,從前往后搜索,用Objective-C來描述是:

[myWebView searchFor:myString 
           direction:YES
       caseSensitive:NO
                wrap:YES]

而用C++或者Java來描述,則是

myWebView.searchFor(myString, YES, NO, YES)

乍看上去,C++ 或者Java的方式更簡短,但是Objective-C的方式更強調(diào)“發(fā)消息”。實際上,上面Objective-C語句會被翻譯成如下C函數(shù)調(diào)用:

objc_msgSend(myWebView,
             searchFor:direction:caseSensitive:wrap:,
             myString, YES, NO, YES)

從強調(diào)messaging的角度看,Objective-C確實比C++和Java更符合Alan Kay對OO思想的描述。

OO中的messaging思想不僅體現(xiàn)在Objective-C語言以及在其上構(gòu)建的NextSTEP/Cocoa GUI編程套件上。在Cocoa因為Mac OS X和iPhone流行起來之前,很多人都接觸過Qt(一種基于C++語言的GUI開發(fā)套件)。Qt對messaing的支持比Objective-C/Cocoa更徹底——每個object可以發(fā)出若干signal,每個signal可以觸發(fā)這個object自己的或者其他objects的若干個slot。

有意思的是,為了支持messaging,Qt對C++語言做了擴展,而Objective-C對C語言做了擴展。這兩套擴展都利用了起源于C語言的“宏”機制(macro)。類似的做法也可以用于Java,前提是我們在調(diào)用Java編譯器之前,先調(diào)用一下cpp宏展開程序來預(yù)處理一下我們的Java程序。這事兒可以留待Java愛好者們來搞?

不管是Objective-C還是Qt,都會“盡力”去檢查一個object是否支持一個method(或者叫message),但是并不禁止程序員向一個object發(fā)送一個它不認識的message(或者調(diào)用一個object沒有的method)。說“盡力”檢查,是因為兩者都不能保證檢查的完備性。這是因為Objective-C和Qt都支持多態(tài);具體的說,接受message的object可能是表示為一個指針(指向object),所以直到運行時候,當一個message抵達某個object的時候,系統(tǒng)才能(通過查這個object對應(yīng)的message list)知道這個object是否認識這個message。

這種靈活性在Google新推出的Go語言中也同樣實現(xiàn)了,而且做的很極致——Go語言中沒有class的概念;換句話說,不需要是class類型的object才能有對應(yīng)的方法(methods)——Go允許給幾乎任何類型附上methods。而且程序中可以很方便的檢測一個object是否支持(一組)methods,比如:

type Stringer interface {
        String() string
}
s, ok := v.(Stringer)  // Test whether object v implements "String()"

【和Go的這種靈活性類似的,Objective-C允許給已經(jīng)定義了的class增加一些methods,而不需要derive subclass;Objective-C的這種機制被稱為category。和Go不同的是,一個category是對某個class的一個擴展,而Go語言里完全沒有class了(但是有interface的概念)!

說到這里,我覺得差不多可以反過來理解Robert Harper教授對OO的評價了——其實Robert不是在藐視OO,而是在指責(zé)很多imperative OO languages(我理解包括Java和未經(jīng)Qt擴展的C++;詳見后述),認為這些語言沒有完成實現(xiàn)OO中object messaging的核心思想,從而不算實現(xiàn)了“模塊化“(modulization)的思想。

上述都是關(guān)于程序的模塊化。實際上,模塊化的另一個主要方面是對“數(shù)據(jù)”(data)的模塊化。從圖靈機和lambda-calculus開始,計算機科學(xué)家們就注意到程序和數(shù)據(jù)是統(tǒng)一的;比如在馮諾依曼的“二進制存儲電子計算機”模型里,程序和數(shù)據(jù)都是bit stream。即時我們在討論高級編程語言的時候,程序和數(shù)據(jù)也不應(yīng)該被分開。因為現(xiàn)代數(shù)據(jù)操作和模塊化的基礎(chǔ)是并行程序(parallelism),而有效實現(xiàn)并行的基礎(chǔ)是程序的first-class表達,也就是把程序作為一種基本數(shù)據(jù)類型。

鑒于這篇帖子已經(jīng)很長了,這段話就作為下一篇帖子的提綱吧。下一篇帖子里,我們來說說XML、JSON、MessagePack、Protocol Buffers這些persistent data structure,以及用源于古老的functional programming paradigm的Go語言和MapReduce實現(xiàn)的并行數(shù)據(jù)操作。


原文鏈接:https://cxwangyi.wordpress.com/2011/06/19/%E6%9D%82%E8%B0%88%E7%8E%B0%E4%BB%A3%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B%E8%AF%AD%E8%A8%80/

標簽: Google 搜索

版權(quán)申明:本站文章部分自網(wǎng)絡(luò),如有侵權(quán),請聯(lián)系:west999com@outlook.com
特別注意:本站所有轉(zhuǎn)載文章言論不代表本站觀點!
本站所提供的圖片等素材,版權(quán)歸原作者所有,如需使用,請與原作者聯(lián)系。

上一篇:iOS 一個簡單的通訊錄

下一篇:Maven技術(shù)解析