我對程式設計懂的很少,一直想加強學習,就把它轉貼過來了。
我的感受是學習程式語言,一定必須從徒手寫每一行代碼開始學,這樣可能是最容易的方法。我最早學的是微軟的visual basic,按理說basic比較簡單,應該最好學,可是微軟幫你把所有圖形界面都做好了,成了一個完全的黑箱,使用者等于在對這個黑箱程式設計,對程式的實際運作流程一點感覺也沒有。我學了半年,依然覺得沒學會程式設計。從那時起,我就開始覺得不能跟着微軟走了。
後來,我又去學了c語言。這次就從指令行下開始學,一行一行的寫,然後再編譯。c是公認比較難學的語言,但是我下了決心從最低的起點開始學,學習環境是将近10多年前推出的turbo c 3.0。雖然我現在c的水準還是很低,但是感覺對c的認識很清楚,許多原理上的問題都了解了。
c程式設計比較麻煩,我下一門想學perl或者python。我正好有一些想法想實作,急需自編軟體處理資料,希望今年之内可以解決掉。
====================
eric raymond對于幾大程式開發語言的評價
【譯者注】
raymond此文不是在泛泛地去談語言的優劣,而是要回答一個問題:在unix下開發開源項目,如何選擇開發工具?我翻譯的很零散,建議大家去看原文。
c
雖說c語言在記憶體管理方面存在嚴重的缺陷,不過它還是在某些應用領域裡稱王稱霸。對于那些要求最高的效率,良好的實時性,或者與作業系統核心緊密關聯的程式來說,c仍然是很好的選擇。
c良好的可移植性也為它加了分。不過現在很多其他的語言可移植性越來越好,c在這方面的優勢可能會逐漸喪失。
現有的很多程式可以産生非常棒的c代碼,比如文法分析器、gui builder等,這時候c語言也是有吸引力的,因為你所需要編寫的代碼隻是整個程式的一小部分。
再有,我們當然應該認識道,c語言對于程式員來說具有無可替代的價值。就我這裡讨論的每一種語言而論,隻要你發掘的足夠深,到最後你會看到它們的核心都是用純正的、可移植的c寫成的。
到了今天這個時候,我們最好把c看成是unix虛拟機上的進階彙編語言。
就算是其他的進階語言完全可以滿足你的工作需要,抽出時間來學習c語言也仍然有益,它能幫助你在硬體體系的層次上思考問題。
即使到了今天,最好的c語言教程仍然是1988年出版的k&r第二版the c programming language.
總結:c最出色的地方在于其高效和貼近機器,最糟糕的地方在它的記憶體管理地獄。
c++
c++最初釋出于1980年代中期,當時面向對象語言被認為是解決軟體複雜性問題的銀彈。c++的面向對象特性看相去使其全面超越了c,支援者認為c++将迅速把上一代語言擠到陳列館裡去。
但是曆史并非如此。究其原因,至少有一部分歸咎于c++本身。為了與c相容,c++被迫作出了很多重大的設計妥協,結果導緻語言過分華麗,過分複雜。為了與c相容,c++并沒有采用自動記憶體管理的政策,進而喪失了修正c最嚴重問題的機會。
另外一部分原因,恐怕要算到面向對象身上。看起來oo并沒有很好的達成人們當年的預期。我就這個問題調研過,我發現使用oo方法導緻元件之間出現很厚的粘合層,并且帶來了嚴重的可維護性問題。今天讓我們來看看開放源碼社群,你會發現c++的應用還是集中在gui,遊戲和多媒體工具包這些方面,在其他地方很少用到。要知道,面向對象也隻是在這些領域被證明非常成功,而開放源碼社群的選擇,很大程度上展現了程式員的自由意志,而不是公司管理層的胡亂指揮。
也許c++實作oo的方法有問題。有證據表明c++程式在整個生命周期的開銷高于相應的c, fortran和ada程式。不過,究竟這是否應該歸咎與c++的oo實作上,還不清楚。
最近幾年,c++加入了很多非oo的思想,其異常思想類似lisp,stl的出現是非常了不起的。
其實c++最根本的問題在于,它基本上隻不過是另一種傳統的語言。stl中的記憶體管理比先前的new/delete和c的方案要好的多,但是還是沒有解決問題。對于很多應用程式而言,其oo特性并不明顯,相比與c,除了增加複雜度之外沒有獲得很多好處。
總結:c++優點在于作為編譯型語言,把效率與泛型和面向對象特性結合起來,其缺點在于過于華麗複雜,傾向于鼓勵程過分複雜的設計。
java
java的設計很聰明,它采用了自動記憶體管理,這是最大的改進,支援oo設計帶來的好處雖然不那麼突出,不過也很值得贊賞,相比c++,其oo設計規模小而且簡單 。
相對于python而言,java有一些明顯的失誤。有些地方設計的還是太複雜,甚至有缺陷。java的類可見性和隐式scoping規則太複雜了。interface機制是為了避免多繼承帶來的問題而設計的,但是要了解和使用它還是挺難。内部類和匿名類導緻令人困惑的代碼。缺乏有效的析構機制,使得除了記憶體之外的其他資源(比如互斥量和鎖)管理起來很困難。java的線程不可靠,其i/o機制很強大,但是讀取一個文本檔案卻非常繁瑣。
java沒有管理庫版本的機制,進而形式上重蹈了了windows dll地獄的覆轍。在類似應用伺服器這樣的環境裡,這引起了大量的問題。
總體而言,我們可以說除了系統程式設計和對效率要求極高的程式之外,java在大部分領域優于c++。經驗表明,java程式員似乎不太容易象c++程式員那樣構造過度的oo層,不過在java中這仍然是個嚴重問題。
java是否優于諸如perl, python這樣的語言?我們還不是很清楚,很大程度上似乎跟程式規模有關。其擅長的領域基本上于python相似,在效率上無法跟c/c++相提并論,在小規模的、大量使用模式比對和編輯的項目裡也無法匹敵perl。在小項目裡,java顯得過分強大了。我們猜測python更适合小項目,而java适合大項目,不過這一點并沒有得到有力的證明。
python
python是一種腳本語言,可以與c緊密整合。它可以與動态加載的c庫子產品交換資料,也可以作為内嵌腳本語言而從c中調用。其文法類似c和子產品化語言的雜合,不過有一個獨一無二的特征,就是以縮進來确定語句塊。
python語言非常幹淨,設計優雅,具有出色的子產品化特性。它提供了面向對象能力,但不強迫使用者進行面向對象設計。其類型系統提供了強大的表達能力,類似perl,具有匿名lambda表達式,這點又讓lisp黑客們感到親切。python依靠tk提供友善的gui界面開發能力。
在所有的解釋型語言裡,python和java最适合多名程式員以漸進方式協同開發大型項目。在很多方面,python比java要簡單,它非常适合與構造快速原型,這一點使得它對于java有獨特優勢:對于那些既不很複雜,又不要求高效率的程式,python十分合适。
python的速度沒法跟c/c++相比,不過在今天的高速cpu上,合理地使用混合語言程式設計政策使得python的上述弱點被有效地彌補。事實上,python幾乎被認為是主流腳本語言中最慢的一個,因為它提供了動态多态性。在大量使用正規表達式的小型項目,它遜于perl。對于微型項目而言,shell和tcl可能更好,python顯得太過強大了。
總結:python最出色的地方在于,它鼓勵清晰易讀的代碼,特别适合以漸進開發的方式構造大項目。其缺陷在于效率不高,太慢,不但跟編譯語言相比慢,就是跟其他腳本語言相比也顯得慢。