<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    冒號課堂§6.2:平臺語言

    冒號課堂

     

    6.2平臺語言——先搭臺后唱戲

    大巧在所不為,大智在所不慮                                        ——《荀子·天論篇》

     

    關鍵詞:平臺語言, Java,C#,C++

    摘要:簡談JavaC#

     

      預覽

    ·          Java的目的是讓一種語言在多種平臺上運行,而C# 的目的是讓多種語言在一種平臺上運行

    ·          兩個平臺語言(Java和C#),一個重在語言,讓語言向平臺擴散;一個重在平臺,讓平臺來凝聚語言

    ·          C++提供了一馬平川的大路,也提供了陷阱密布的小道;Java則在大路上鋪設水泥,同時封鎖了捷徑小道;C#同樣填平了大路上的坑坑洼洼,但把一些小道上“此路不通”的牌子悄悄換成了“此路危險”


       提問 


    • C++的基礎上,Java C#作了哪些改進?
    • JavaC#在設計理念上有何不同?
    • JavaC#是如何互相借鑒的?
    • JavaC#為什么擅長企業應用開發?它們能作系統開發語言嗎?

     

     講解

     

    逗號提出:“現在應該到了Java時間吧。”

    冒號順水推舟:“下面談論的重心從剛才的系統語言轉到平臺語言——JavaC#。”

    問號聽得一頭霧水:“平臺語言?Java不是平臺無關的語言嗎?”

    “平臺的意義很廣,可以是硬件平臺,可以是軟件平臺,也可以是二者的結合。”冒號解釋道,“你說的‘平臺’主要指硬件和操作系統平臺,而我說的‘平臺’指的是運行環境平臺。當然這兩種平臺是密不可分的,JavaC#之所以能獨立于前一種平臺,正因為它們自帶了后一種平臺。具體地說,Java運行于以Java Virtual MachineJVM 為核心的Java平臺,而C#運行于以Common Language RuntimeCLR)為核心的.NET平臺。”

    句號打了個比方:“這就好比在不同的山路上鋪設相同的瀝青,車子跑到哪兒都沒區別了。”

    “是這么個理兒。”冒號表示同意,“從傳承的角度看,二者皆為基于C++之上的改進,剔除了其中易于出錯或不易掌握的語法特征。我們先來看看它們區別于C++的共同之處。首先,二者均編譯成與機器無關托管碼managed code)或稱字節碼bytecode),運行于虛擬機virtual machine)之上。其次,禁用或限用指針并支持自動垃圾回收,由此極大地解放了程序員的生產力。起初這種做法并不是沒有爭議的,但隨著機器性能的提高以及軟件規模的擴大,對軟件的健壯性、安全性和生產率的要求超過了對運行效率的要求,屏蔽指針和自動內存管理逐漸得到認同。盡管如此,指針運算和手動內存管理對于系統軟件和在性能、實時性方面要求極高的軟件還是必不可少的。因為這個原因,C#還是留了一手:允許標有修飾符unsafe的代碼包含指針操作。”

    引號較起真來:“這是否意味著C#也能作為系統語言呢?”

    “或許吧。”冒號淡淡地說,“C#的胃口很大,上管天、下管地、中間還要管空氣。企業級應用和桌面應用自不必說,底層應用也不放過。早在2003年,微軟研究院就開始了用C#開發的名為Singularity的操作系統研究項目,另外還有SharpOSCosmos等開源操作系統。雖然它們目前僅用于研究,但不難看出C#的勃勃野心。說起來這也不新鮮,1998Sun就搞了個針對嵌入式系統的JavaOS,可惜沒能成功,為Java ME所取代。”

    輪到嘆號糊涂了:“剛才還說JavaC#是平臺語言,怎么又同CC++一樣當系統語言來用了呢?”

    冒號釋疑:“Java可通過JNI調用CC++等程序;C#可通過P/Invoke訪問系統API,加之保留了指針操作,用于系統編程更加方便。其實一種語言勝任多種領域并不難,難的是在每個領域都獨占鰲頭。可問題是,有誰不樂見自己支持的語言被廣泛應用呢?無論是微軟還是Sun,他們都會竭盡所能地將自己的語言擴張到每個角落。程序員作為語言的用戶,雖然很多時候并沒有選擇語言的權力,但心中要有桿秤,可不要輕易被商家的廣告迷惑啊。”

    逗號不無自嘲地說:“秤倒是有一桿,就是不太準啊!”

    有人“噗哧”笑出聲來。

     “多學習、多實踐、多體悟,秤的精度自然會提高。” 冒號鼓勵道,“如果自己沒有足夠的鑒別商品能力,建議從商家的競爭對手那里獲取真實的信息。要看Java的優點,不要聽Sun的一面之詞,可以看看微軟的C#模仿了Java的哪些特征,因為模仿是最高的贊揚;要看Java的缺點,可以看看C#擯棄了Java的哪些特征,可以聽聽微軟對Java的批判——雖然可能過激,但一般也不會太離譜。此法同樣適用于包括C#在內的其他語言。”

    句號有所感慨:“這既是程序員之幸——語言之間可以互相取長補短,共同進步;也是程序員之不幸——往往不得不在眾多語言中作艱難選擇,或者多花精力學更多的語言。”

    冒號一邊點頭一邊接著說:“下面繼續看看JavaC#的共性。借著剛才的話題,我們來看看C#Java是如何互相學習的。”

    引號舉手插問:“C#到底更接近C++還是Java?”

    “這是個有趣的問題。不妨這么說:C#看起來像C++,用起來像JavaC#借鑒了包括JavaC++Delphi等在內的語言特征,其中Java的影響最大,但由于微軟與SunVisual J++上的過節,寧愿強調與C++的關系而淡化與Java的關系。C#的設計者Hejlsberg以前是DelphiVisual J++的架構師,在一次訪談中首先聲明C#不是Java的克隆,但從此話本身和他本人的背景都暗示了與Java千絲萬縷的聯系。例如,C#采用了大量與Java相同或相似功用卻不同拼寫的關鍵字。”冒號投影出一張表格——

    Java

    super

    import

    package

    synchronized

    instanceof

    deprecated

    final

    native

    boolean

    C#

    base

    using

    namespace

    lock

    is

    obsolete

    sealed

    extern

    bool

    “這是JavaC#關鍵字的不完全對照表。中立地看,C#的關鍵字似乎更簡明,但明顯避嫌的意義大過改進的意義。關鍵字只是一個縮影,那么C#究竟從Java那里學到了什么,相比于C++又有什么優勢或特點呢?”冒號切換了幻燈片——

    更加安全——限用或禁用指針;檢查字符串和數組的邊界;增加類型安全;禁用未初始化的變量;增加了對資源的安全管理;

    更加簡單——自動垃圾回收;廢除了頭文件和宏(macro);支持接口(interface);廢除多繼承以及非公開繼承;摒棄了C++中一些生僻、難用的語法

    更加中性——編譯成機器無關代碼;運行于統一平臺;

    更加OO——不支持全局變量和自由函數;所有的類都可上溯到Object類;對象一般通過new分配在heap)上;

    更加豐富——支持自省(reflection);支持并發編程;提供圖形界面、網絡編程、數據庫、XMLAPI

    更加標準——更好的Unicode支持;支持注釋性文檔;類或方法可以被廢棄(deprecated);

    問號就勢而問:“JavaC#又借鑒了什么呢?”

    冒號答道:“在Java1.5的增強特征中,有不少C#的影子。如增強版的for循環;可變長參數(varargs);自動裝箱(autoboxing);類型安全的枚舉(typesafe enum)等等。此外,支持元數據的的注釋(annotation)與C#的特性(attribute)大同小異,C#Delphi中引入的屬性(property)也出現在Java 7的提案中。”

    逗號雙手一攤:“這么多相同之處,不如合并算了。”

    “很傻很天真的想法。等它們合并了,估計世界也大同了。”冒號笑言,“它們之間的差別也不容忽視C#重新撿起了C++中被Java拋棄的一些特征,可謂是對C++否定之否定——除了支持引用類型reference type)外,還支持值類型value type[1];除了按值傳遞pass-by-value)外,還可按引用傳遞(pass-by-reference);支持操作符重載operator overloading);在一定條件下保留指針和指針運算;所有的方法默認是非虛的(non-virtual);訪問權限默認是私有的(private);將關鍵字‘extends’和‘implements’統一為‘:’;支持預處理指令(preprocessor directive)等等。公允地說,這些大都為明智之舉。”

    引號追問:“C#有什么獨到之處嗎?”

    C#并非一味地效仿其他語言,也有創新之舉。曾在Visual J++中加入的委托delegate)和相關的事件event),如今可以堂而皇之地用在C#上,再不用擔心被Sun告了。”冒號語帶調侃,“C#還是第一個支持組件導向Component-Oriented)的C族語言。除此之外,C#支持索引器indexer)、版本控制versioning)、XML注釋、特色指令如#region、特色關鍵字如checkedyield等等。還有一點不得不提,C#對函數式編程的支持力度逐漸加大:1.0delegate可作為頭等函數(first-class function),2.0的匿名delegate可作為閉包,3.0又引入了λ表達式,幾乎可號稱函數式語言了。及至C#4.0,進一步向動態語言靠攏,將引入關鍵字dynamic以支持動態類型和動態操作。”

    嘆號眉頭微蹙:“聽起來C# Java復雜多了,好像大雜燴。”

    “當初JavaC++的改革的一個重要原則是:讓語言變得簡單而有親和力,降低程序員門檻,提高軟件生產效率。但如今Java已經不那么簡單了,C#則更復雜,在某些方面較之C++也不遑多讓。” 冒號語調轉強,“以前人們試圖在語言的威力power)和生產率productivity)中尋求最佳平衡點,現在似乎更想魚與熊掌兼得。”

    問號再次提問:“JavaC# 最大的區別是什么?”

    “雖然同為平臺語言,二者的設計理念還是有所不同的。Java的目的是讓一種語言在多種平臺上運行,而C# 的目的是讓多種語言在一種平臺上運行。”冒號鐘愛這種具有對稱美的對比,“雖然理論上以C#為核心的.NET平臺可以用在任何操作系統上,但千萬不要指望微軟會心甘情愿地提供Windows之外的實現,原因不言自明。而SunSolaris無法與Windows抗衡,最大的王牌就是Java語言,當然會致力于跨平臺和面向Internet的應用,對桌面應用的投入相對較少。因此兩個平臺語言,一個重在語言,讓語言向平臺擴散;一個重在平臺,讓平臺來凝聚語言。在此并不想對兩公司的商業策略評頭論足,而是認為了解這種背景會對理解語言特征及其發展趨勢有所裨益。編程語言絕非象牙塔中之物,實乃技術和商業合力推動的結果。”

    逗號拖著怪腔:“原來如彼!”

    眾人大笑。

    句號深思后問道:“可不可以這么理解:如果開發僅限于Windows平臺的應用,C#是更好的選擇,它一方面與Windows系統存在天然的紐帶,另一方面可有效地利用.NET的包括ASP.NETVB.NETADO.NETWinForms等在內的各種軟件資源;如果開發不限于Windows的企業應用,則選擇Java更合適?”

    冒號微微頷首:“有一定道理,平臺的確是語言選擇的一個考慮因素。不過說起可利用的軟件資源,Java毫不遜色。除了形形色色的框架外,與動態語言如GroovyScalaRubyPython等也能嚴絲合縫。作為平臺語言,JavaC#均有極為豐富的資源和極強的整合能力,背后又有大公司不遺余力的支持和推廣,理所當然地成為大型企業應用的主流選擇。”冒號匆匆作結,“關于JavaC#的比較暫時談到這里[2],由于時間關系,我們不可能面面俱到,難免掛一漏萬。許多概念術語只是點到為止,具體細節留待以后展開,暫且按下不表。總而言之,每種語言都為解決問題提供了一定的途經,C++JavaC#的不同之處在于:C++提供了一馬平川的大路,也提供了陷阱密布的小道;Java則在大路上鋪設水泥,同時封鎖了捷徑小道;C#同樣填平了大路上的坑坑洼洼,但把一些小道上‘此路不通’的牌子悄悄換成了‘此路危險’。”


        插語

    [1] C#保留了C++中的struct關鍵字作為值類型,以區別于class所代表的引用類型。

    [2] 參考文獻【3】對JavaC#進行了非常詳盡的比較。

     

     總結

    • 相比C++JavaC#更加安全(限用指針、數組邊界檢查、類型安全、資源管理等)、簡單(自動垃圾回收、廢除多繼承和頭文件等)、中性(編譯成機器無關的字節碼,運行于虛擬機)、OO(無全局變量和函數等)、豐富(支持自省和并發編程、更完備的API等)、標準(注釋性文檔、更好的Unicode支持等)。
    • Java的目的是讓一種語言在多種平臺上運行,而C# 的目的是讓多種語言在一種平臺上運行。Java重在語言,讓語言向平臺擴散;C#重在平臺,讓平臺來凝聚語言。
    • 雖然系統開發并非JavaC#的禁區,它們更多地還是用于企業級應用開發。豐富的資源、強大的整合能力和巨頭公司的鼎力支持是它們得天獨厚的優勢。
    • 編程語言的發展是技術和商業合力推動的結果。

     

     “”參考

    [1] Jesse LibertyProgramming C#, 2nd ed.Sebastopol, CAO'Reilly2002

    [2] Mads TorgersenNew features in C# 4.0http://code.msdn.microsoft.com/csharpfuture/Release/ProjectReleases.aspx?ReleaseId=1686

    [3] Dare ObasanjoA COMPARISON OF MICROSOFT'S C# PROGRAMMING LANGUAGE TO SUN MICROSYSTEMS' JAVA PROGRAMMING LANGUAGE

    http://www.25hoursaday.com/CsharpVsJava.html

    posted on 2009-02-15 22:41 鄭暉 閱讀(3269) 評論(3)  編輯  收藏 所屬分類: 冒號課堂

    評論

    # re: 冒號課堂§6.2:平臺語言 2009-02-16 09:11 木東

    不錯  回復  更多評論   

    # re: 冒號課堂§6.2:平臺語言 2009-02-16 21:41 Todd

    “C#對函數式編程的支持力度逐漸加大”,這是從語言角度C#和java很大的差別,從語言本身的發展來看,java落后了。同時,如果下一代語言的大趨勢是DSL,對于希望多種語言向平臺靠攏的.Net來講無疑順應了這一趨勢。  回復  更多評論   

    # re: 冒號課堂§6.2:平臺語言 2009-02-19 17:47 勉勉強強

    工作5年了,看完冒號課堂,仿佛又回到了學校,感慨良多,受益非淺 :)  回復  更多評論   

    導航

    統計

    公告

    博客搬家:http://blog.zhenghui.org
    《冒號課堂》一書于2009年10月上市,詳情請見
    冒號課堂

    留言簿(17)

    隨筆分類(61)

    隨筆檔案(61)

    文章分類(1)

    文章檔案(1)

    最新隨筆

    積分與排名

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 久久夜色精品国产嚕嚕亚洲av| 久久久久久亚洲精品| 亚洲精品线在线观看| 亚洲w码欧洲s码免费| 四虎影视久久久免费| 亚洲免费闲人蜜桃| 亚洲国产精品综合久久一线| 91精品国产亚洲爽啪在线影院| 日本亚洲中午字幕乱码| 在线免费观看国产| 亚洲国产成人五月综合网 | 亚洲精品国产综合久久一线| 中文字幕亚洲色图| 免费中文字幕视频| 久久国内免费视频| 亚洲av无码国产精品夜色午夜| 亚洲国产高清国产拍精品| 一级毛片**不卡免费播| 亚洲国产精品无码久久久久久曰| 亚洲jjzzjjzz在线播放| 国内精品一级毛片免费看| 国产一区二区视频免费| 亚洲av永久无码嘿嘿嘿| 两个人看的www高清免费视频| 日本一道本高清免费| 亚洲国产成人久久精品app| 成av免费大片黄在线观看| 日韩一区二区在线免费观看| 日韩亚洲AV无码一区二区不卡| 一级毛片在线播放免费| 在线免费不卡视频| 亚洲国产电影在线观看| 日韩免费视频一区二区| 亚洲中文无韩国r级电影| 亚洲乱码无人区卡1卡2卡3| 久久国产精品成人片免费| 亚洲五月综合缴情在线观看| 国产精品亚洲а∨无码播放不卡 | 亚洲理论片在线中文字幕| 97在线免费视频| 一本久到久久亚洲综合|