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

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

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

    the journey is the reward...

    常用鏈接

    統計

    最新評論

    java快 還是 c快[c++快],似是而非的談

         首先說明一下這個”快”的含義,我想以前那些討論這個話題的人當然認為這個快是指程序的運行速度,至于”軟件開發速度”恐怕想也沒想,或許認為軟件開發速度和這個話題扯不上一點關系.那么這個問題在網上搜搜,搜的一大堆,那些c/c++陣營的列了很多例子來說明c/c++快, java陣營的也是如此,還提供一些機構的數據來說明java并不慢.可是仍然沒有讓大家都信服的理由或者結果.從這些討論中我們應該得到一些啟示,那就是討論這個話題的前提是討論的人必須既對java有很深的了解還要對c/c++有很深入的接觸,否則都是偏面的.
        另外從網上的結果看大家都談到了一個共同點,編譯的方式或機制是對速度是有影響的.在這里提到了java的動態編譯的問題JIT(just in time).很明顯很多c/c++程序員他不了解java的運行機制,java的動態編譯是這樣描述的,首先寫完一個helloworld.java的源文件交由java compiler得到helloworld .class文件,java.exe會啟動Java Virtual Machine,并加載這個class文件通過JIT編譯為本機的機器代碼.特別要強調的是這個class文件,它是編譯原理中所謂的中間代碼,它并不是目標代碼.也正因為有了這個中間代碼才使動態編譯得以實現,而c/c++是直接到二進制的機器代碼,也不需要中間代碼多次一舉.不過不要認為java的class文件是多余的哦,它的真正目的就是整個java語言的承諾write once, run anywhere,也就是說不管你是在windows os平臺還是在linux os平臺,class都是一樣的,只是Java Virtual Machine是不一樣的,所以有不同os版本的jdk(要想運行java一般只要Java Runtime Environments就夠了).同理.NET也是這樣的,所謂的.net framework就是承擔了JVM的角色.說到這有必要提醒一下各位java為什么要搞個JVM,.NET難道是僅僅為了和java競爭才搞.net framework嗎?呵呵,原因也許很多,但一定會有軟件開發周期,人力成本,這很重要哦,呵呵,快要扯到軟件開發速度上來了.
        在這里我要提醒各位的是關于編譯器的,用java完全可以寫出一個c/c++編譯器,當然更可以寫出一個java編譯器,不要奇怪哦,如果你懂編譯原理的話,你一定會贊同我的觀點的. 雞和雞蛋的問題!!!
        如果那種語言慢的令人無法忍受的話,那它早就推出歷史舞臺了,可是java退出了嗎,我們先不談現在java軟件的全球市場份額,就看看TIOBE世界編程語言排行榜,排在前3位的是java,c,c++.Java的使用人數現在每年在小幅下降,不是因為它運行慢,而是相對有些軟件.net的開發速度更快了,注意哦,是開發速度,不是運行速度哦!!!
        計算機語言充其量不過是個工具,c語言在宿主的環境 (例如裝有操作系統的環境) 中如果離開(操作)系統提供的API(Application Programming Interfaces)或者系統調用接口的話,那它除了做做數值計算什么也做不了,哦,順便提一下那些stdio , stdlib等這些標準庫它們的實現也是調用了(操作)系統的API,例如:malloc它的windows實現會調用windows api HeapAlloc來分配堆.所以你所在的系統不同,stdio,stdlib等這些標準庫的實現也不一樣,當然函數接口功能是一致的,要不然就不標準了嗎!在學校的時候,似乎無人不說c語言難,我要說的是難的不是c語言,難的是c所應用的領域的業務理論,邏輯,流程.例如:使用c進行數值計算,難的就是算法,如果算法一旦給出,你只需用c來表達.如果c語言本身很難的話,它還會在TIOBE世界編程語言排行榜中占第2位嗎!java語言也是如此,離開了那些java,javax packages那它還能干什么呢?
        每種語言有它擅長的領域,也就是說它的發明出現是有目的的,并且伴隨著軟件開發理論的發展,符合軟件工程的要求.在學每一種語言的開頭都會介紹該語言的歷史,展示它比以前的語言是如何如何進步的一面,他們都會強調該語言是如何如何符合軟件工程的要求,如何如何提高了開發速度,而有不會大幅度降低運行速度.所以學習過c++,java的人都會發現在學習這些語言的時候居然要同步學習面向對象的編程思想,甚至還會附帶更多看上去好像和語言無關的東西,其實就是這些開發思想,理念,原則,理論等等一大堆東東都體現在了這些語言里.所以學習一門語言不僅僅是語言本身的特性,更重要的是它所體現包含的軟件開發思想.
        下面的這句話是摘之孟巖寫的“Java替代C語言的可能性”,他在文中說到:"Java在意識形態上是要面向企業應用軟件的開發,所以特別強調架構,強調設計模式,強調標準,強調規規矩矩,強調高姿態,強調一種華貴的宮廷氣質。在C 中,你吃飯就是吃飯,捧起碗來喝酒,放下筷子罵娘,甩開膀子抓肉,擼起袖子抹油。而在Java中,你經常為了要干某件事,先new一個對象,然后以這個對象為參數new另一個對象,如此這般重復n遍,得到真正需要的對象,最后就是為了調用那個對象的一個方法,就好比吃飯時焚香洗面,漱口凈手,戰戰兢兢,畢恭畢敬。在C中,遇到問題要像亡命徒,像流氓版程咬金,管你三七二十一,沖上去就是三板斧,還怕劈不死你丫的。在Java里,遇到問題要像宋襄公,要張榜檄文,要名正言順,要禮儀之邦,要把架子拉開了,把譜兒擺足了。Java的口號是,不管劈不劈的死,先把你小子感動了再說。這套繁瑣的東西,對于基礎軟件開發來說,既不必要,也很難習慣。需要說明的是,這不是Java語言的問題,其實Java本身不必如此復雜、如此巴洛克。"針對這句話我想說的是其中的java,java之所以像他說的那樣所謂的繁瑣,這恰恰體現了java這種語言所要表達的軟件工程思想,java是面向對象的,面向對象的原則之一是面向接口編程,所以為了要干某件事還不像孟巖上面說的那樣,應該這樣,先定義一個接口類,再寫一個實現類,再寫一個工廠類用來產生前面的接口類的實例,而不是簡單的new,你是不是已經覺得更繁了,呵呵,還有所謂更繁的呢,我不用工廠類了,我用了個抽象的工廠類,給它定義一個產生這個工廠類的實例的靜態方法,得到這個工廠類的實例再用它來產生前面的接口類的實例.為啥這么做啊?因為java符合了面向企業應用軟件的開發要求,因為企業需求變化很快,所以要接口,要通過工廠模式來create它,如果這樣,當需求變化后我只需修改或添加新的實現類,再修改一下工廠類的create方法,而對該接口引用的外部或外層代碼則不需作任何改動,你看接口引用,實現,創建各部分都分的清清楚楚,以后代碼維護自然容易,又能適應需求的變化.另外對于程序員而言可不要以為寫的代碼多了哦,恰恰相反,你利用設計工具畫幾個類圖它就會幫你自動生成接口,工廠類了,你只需在IDE中寫實現類就ok了.
        機器指令就不說了,匯編到c,c到c++,c++到java,腳本語言(lua,php,python,ruby)…從左到右程序運行速度是遞減的,而軟件開發速度是遞增的.總之程序員寫的更少,更快,但編譯器做的更多(附加插入的機器指令也會更多), 設計和開發工具IDE也會做的更多,附加的標準庫,標準模板庫等等封裝的更多,還有涉及方方面面的開源的庫簡直不計其數.好像程序員輕松了,其實更累了,整個軟件業對程序員的要求更高了,但又不一定,因為大量的框架提供了開發的便攜性,使得程序員只需到達會應用的水平,而不必知其所以然.所以大部分程序員又廉價起來了, 軟件藍領出現了,人力成本便宜了,這又是軟件規模開發所期望的結果.早期MDA的架構理論者狂吹MDA的代碼自動生成能力會讓軟件藍領失業.
        其實在這個”java快還是c快”話題中最”冤”的是java,因為有太多的人,證據來說java是如何的比c慢,如何的耗內存.之所以這樣是因為有太多的人不了解java,甚至有太多的java程序員都不了解java,會寫java程序與對java的理解是兩碼事.
        Eclipse是一個用來開發java軟件的IDE,是IBM開源的,悲哀的事情來了,有很多java程序員都不知到eclipse是用java寫成的,他們一看到eclipse.exe他們就立馬否定了它是用java寫的,所以有這種想法的人請你把本機的JRE(JDK)刪除,看你的eclipse還能否啟動. 如果你還有疑問,那你一定不知道JNI(java native interface),JVM可是c/c++寫成哦,呵呵,說到這是不是有點”同根生”的味道,現在卻要”相爭何太快”.請使用反匯編工具看看eclipse.exe都干了些什么,最好也看看JDK中的java.exe又干了些什么.其實它們的功能大同小異,它們都會加載jvm.dll/jvm.so(在JRE的bin目錄中),創建JVM實例,通過JNI加載main class,并調用它的main方法.但是疑問也來了,不管是java,c/c++程序員可能都不相信eclipse這種用java寫的窗口程序怎么會運行的如此之快,完全可以和vb,Delphi,c/c++寫的窗口程序媲美.因為在他們的印象中java的GUI程序慢的要死,其實也正因為java的GUI慢給java一下扣上了這頂慢帽子.
        在這個世界上JVM(jdk,jre)不是sun公司的專有物,IBM也有哦,只是我們常用的是sun提供的,很可惜它支持GUI的awt, swing包在最初的設計上過于抽象,使得速度不盡如人意,當然現在一直有改觀.而IBM它提供了swt包來支持java的GUI編程,eclipse是基于swt的,eclipse plugin插件編程出現了,eclipse的插件體系和在GUI方面的積累和框架已經很成熟了,也很多,可惜知道的人很少,去www.eclipse.org看看吧.Myeclipse也是同理哦,它不僅集成了eclipse,還內置了jdk.有人說java做不了系統軟件,是啊,我前面就說過了, 每種語言有它擅長的領域.
        但是有必要提一下嵌入式編程,不要以為嵌入式軟件都是系統軟件,java在這個市場中的份額可是很高的哦,要不Microsoft怎么會眼紅呢.J2ME,J2EE,J2SE是sun針對不同的應用領域提出的3套規范和API,其中J2SE就是指jdk,J2ME是專門用于微型設備開發的,它是J2SE的一個很小的子集,輕量了很多.J2EE是一套面向企業應用的規范,以J2SE為基礎.呵呵,看看java的發展史吧,它天生就是為電視、控制烤面包機等家用電器(消費性電子產品)的交互操作而開發的.
        最后提一下JNI,它是java可擴展能力的backbone, JNI是以c/c++的語言形式提供的接口,c/c++通過它可以和JVM通信,也就是可以和java交互了哦.我前面也說了JVM本身就是用c/c++寫成的,都在jvm.dll/jvm.so中.
        再說java的耗內存,這個如果在苛刻的硬件條件下確實是個問題,不過現在的趨勢是硬件一直在降價,硬件的性能在提升.以前的c/c++程序員在硬件條件的限制下為了達到性能上的最優,寫的代碼是不太可讀的,這是與軟件工程理論相違背的,我們現在為了程序以后的可維護,降低維護成本,我們可以犧牲一定的性能也要維護程序的可讀性,不僅如此我們為了項目的開發周期能在規定的時間內達到最大的完成度,在選擇技術,框架的時候我們首先考慮的是開發速度,其次才是運行速度.在性能調優方面我們來看看<<c和指針>>怎么說吧, ”改進算法勝于優化代碼”page403,這里的算法完全可以延展為設計,所以不要迷信某種語言或技術的快慢性能,如果設計本身就很糟糕,那么再優的技術,再快的語言也無濟于事. ”實際上,在大多數情況下,若要提高系統的運行性能,增加RAM比提高CPU的速度所產生的效果更好.”摘之<<windows 核心編程>>中的第1 3章Windows的內存結構的page305.我想java的設計者不會傻的連這個都不知道吧!
        性能優化無非是內存和CPU,空間和時間的博弈.
        昨天又聽到這樣一句話”http比tcp慢”……哪位有空的仁兄也來談談網絡吧, 呵呵!

    posted on 2010-02-01 20:45 adapterofcoms 閱讀(659) 評論(1)  編輯  收藏 所屬分類: java bbs

    評論

    # re: java快 還是 c快[c++快],似是而非的談 2012-02-16 08:58 farseer

    寫的不錯,不過偏離了主題  回復  更多評論   

    主站蜘蛛池模板: 久久久久久精品免费看SSS | aa在线免费观看| 久久久久亚洲av无码专区蜜芽| 最近中文字幕mv免费高清视频8 | 亚洲精品乱码久久久久66| 最近中文字幕完整版免费高清| 亚洲中文字幕日本无线码| 国产亚洲精品拍拍拍拍拍| 91网站免费观看| 人妻仑刮八A级毛片免费看| 久久久久亚洲av无码专区| 在线a人片天堂免费观看高清| 精品人妻系列无码人妻免费视频| 亚洲日本乱码一区二区在线二产线| 免费人成在线观看网站视频| 小草在线看片免费人成视久网| 污网站在线观看免费| 亚洲人成电影在线观看青青| 中文字幕亚洲一区| 免费看大美女大黄大色| 99免费观看视频| j8又粗又长又硬又爽免费视频| 亚洲va乱码一区二区三区| 国产亚洲人成网站在线观看不卡| 国产又长又粗又爽免费视频 | 免费无码国产在线观国内自拍中文字幕| 亚洲AV区无码字幕中文色| 免费一区二区三区四区五区| 免费在线观看视频网站| 免费无码H肉动漫在线观看麻豆| 亚洲av永久中文无码精品综合| 亚洲精品国产情侣av在线| 在线观看亚洲av每日更新| 国产一级特黄高清免费大片| 免费一本色道久久一区| 在线看无码的免费网站| 久久国产精品免费一区| 免费无码午夜福利片 | 叮咚影视在线观看免费完整版| 免费国产在线精品一区| 亚洲精品乱码久久久久久V|